多数情况下,我们知道索引能够提高查询效率,但应该如何建立索引?索引的顺序如何?许多人却只知道大概。其实理解这些概念并不难,而且索引的原理远没有想象的那么复杂。

建立索引的几大原则

最左前缀匹配原则

简单定义:
MySQL会一直向右匹配直到遇到范围查询 (>,<,between,like) 就停止匹配.

所以在针对查询条件进行创建索引时,要将范围级的条件放到索引字段的最后。以让 MySQL 使用索引。

查询优化器

理论上来说 索引对顺序很敏感,但是MySQL的查询优化器会自动调整where子句的条件顺序以使用适合的索引。这属于编译器层次优化.
举例: 当 where 条件为 a=1 AND b=2 AND c=3 时, 对应建立的索引 (a,b,c) 列可以以任意顺序建立

选择区分度高的列

如果列的区分度很小,那么为这个列创建索引就不太合适了。比如 性别、某些状态字段之类的。

有个计算公式:

1
count(distinct col) / count(*)

一般要求 0.1 以上 参考此处

索引列不参与计算

当为某列数据加上索引之后, 不能将该列直接参与计算。因为索引源数据中存的都是字段值, 使用计算时需要将所有的字段进行计算之后才能比较。 这样的情况 可以先对条件进行计算,比较计算后的值。

尽量扩展索引

当表中已经存在索引,需要新增索引列时,优先考虑在原有的索引上进行增加。
如: 已存在索引 (a), 需要增加联合索引 (a,b) 时, 可以直接在原索引上修改。

但如果需要添加的另外的与当前索引列无关的索引时,需要另外创建。

参考资料