一张表到底建多少个索引才是合适呢?
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
上周的一天,到公司接了杯水刚刚坐稳,就看到 DBA就在群里@ 某个研发帅哥,说“你的表已经有10个索引了,怎么这次还要再加呢?”
那我就在想:一张表到底建多少个索引才是合适呢? 要搞懂这个问题,我们就需要弄清楚以下这几个问题: 1)常见的索引分类有哪些? 2)MySQL 是如何使用索引的? 3)一张表最多可以建多少索引? 4)新建索引的规范原则有哪些? 本文我们就一起来展开聊聊这几个问题~ ![]() 1、常见的索引分类有哪些?1.1 应用层分类从应用层面,常见分类:
1.2 数据结构层分类从数据结构层面,分类如下:
2、新建索引的规范原则有哪些?关于新建索引,通常需要注意以下规范原则: 2.1 最左前缀匹配原则MySQL 会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配
2.2 尽量选择区分度高的列作为索引区分度的公式是:count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少。 唯一键的区分度是1,而一些 status 状态、性别等 字段可能在大数据面前区分度就是0。 2.3 索引列不能参与计算保持索引列“干净”,这个原因其实很简单,b+树中存的都是数据表中的字段值。但是在进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。
2.4 尽量的扩展索引,不要新建索引比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可,而不建议再单独去建一个b索引。 3、MySQL 是如何使用索引的?索引用于快速查找具有特定列值的行,其目的在于提高查询效率。 与我们查阅图书所用的目录是一个道理:先定位到章,然后定位到该章下的一个小节,然后找到页数。相似的例子还有:查字典,查火车车次,飞机航班等。 本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件。 也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。 数据库也是一样,但显然要复杂得多,因为不仅面临着等值查询,还有范围查询(>、<、between、in)、模糊查询(like)、并集查询(or)等等。数据库应该选择怎么样的方式来应对所有的问题呢? 大多数 MySQL 索引(PRIMARY KEY、UNIQUEINDEX 和FULLTEXT)都存储在 B树 中。
在 MySQL 中,使用索引进行以下操作: 3.1 = 和 in 可以乱序比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,MySQL 的查询优化器会帮你优化成索引可以识别的形式。 3.2 and 与 or联合索引:(d,a,b,c)
MySQL 会按照联合索引,从左到右的顺序找一个区分度高的索引字段(这样便可以快速锁定很小的范围),加速查询,即按照d—>a->b->c的顺序
MySQL 会按照条件的顺序,从左到右依次判断,即a->b->c->d 4、一张表最多可以建多少个索引?4.1 理论上来说MySQL 的存储引擎(如 InnoDB、MyISAM 等)本身并没有对一个表能创建的索引数量设置一个固定数值限制,,而是由MySQL数据库引擎内部的数据结构和算法决定的。 从数据库设计和架构的角度,理论上只要满足以下条件,就可以新增创建索引:
4.2 实际应用情况然而在实际应用场景中,通常不会无限制地创建索引。一方面是因为上述提到的性能问题,过多的索引往往会导致数据更新操作变得极为缓慢,严重影响系统的正常运行。
另一方面,不同的 MySQL 版本以及不同的存储引擎在实际表现上也会有差异。
总结索引是应用程序设计和开发的一个重要方面。若索引太多,应用程序的性能可能会受到影响。而索引太少,对查询性能又会产生影响,要找到一个平衡点,这对应用程序的性能至关重要。 MySQL 表能创建的索引数量没有一个确切的、通用的绝对上限,而是要综合考虑多方面因素,在满足性能要求和存储空间允许的条件下合理创建索引。 其实做了这么长时间的语句优化后才发现,任何数据库层面的优化都抵不上应用系统的优化,同样是MySQL,可以用来支撑Google/FaceBook/Taobao应用,但可能连你的个人网站都撑不住。套用最近比较流行的话:“查询容易,优化不易,且写且珍惜!” 转自https://juejin.cn/post/7433575991878451200 该文章在 2025/4/14 10:45:43 编辑过 |
关键字查询
相关文章
正在查询... |