MYSQL调优(五)之索引优化小细节
-
模糊匹配最哈不要把百分号放到前面,这样不会用到索引了。
-
下面是最左匹配与范围查询联合使用注意的优化点,组合索引是nage,age,pos。第一条sql语句会匹配到age,这个时候的type只是range,因为匹配到了age;但是下一面一条sql语句用了pos,隔了个age,所以pos没有匹配到,pos是个无关条件,这个时候,type达到了ref级别,而ref为常量值。范围查找让后面的索引失效。
-
最好用覆盖索引进行查询。索引包含需要查询的字段值。
-
order by时,最好使用索引进行排序。当SELECT * 仅选择索引列,则使用索引并避免排序。
-
当存储很大的空间,但是需要做索引时,可以用hash算法,比如CRC32,能压缩索引。
-
按照主键进行插入数据,避免页分裂与页合并。
-
当使用索引列进行查询的时候尽量不要使用表达式,比如id + 1 =5与 id = 4
-
尽量使用主键查询,而不是其他索引,因此主键查询不会触发回表查询
-
使用前缀索引
-
使用索引扫描来排序。mysql可以使用同一个索引即满足排序,又用于查找行,如果可能的话,设计索引时应该尽可能地同时满足这两种任务。Where与order by组成一个最左前缀,可以利用索引对其排序,但是如果是个范围的话,那么不行。Order by顺序与索引顺序不一样,也无法进行使用。
-
union all,in,or都能够使用索引,但是推荐使用in。對於UNION与union all 一般用union all因为union里面会有distint去重操作。
Union all是两个步骤。不考虑。而in 比 or运行时间短。 -
范围列可以用到索引,但是后面列用不到了
-
强制类型转换会全表扫描
-
更新十分频繁,数据区分度不高的字段上不宜建立索引。更新会变更B+树,更新频繁的字段建议索引会大大降低数据库性能。
类似于性别这类区分不大的属性,建立索引是没有意义的,不能有效的过滤数据,
一般区分度在80%以上的时候就可以建立索引,区分度可以使用 count(distinct(列名))/count(*) 来计算。 -
当需要进行表连接的时候,最好不要超过三张表,因为需要join的字段,数据类型必须一致。类型一样,统一进行处理,不一样则会分成几个进行join,效果性能不一样。不一样的时候,类型不匹配最好不要进行关联。A join b用id,bjoin c用name的方式,这样不行。
-
能使用limit的时候尽量使用limit,可以直接返回,虽然只有一个记录,但是还会做判断。限制输出,如果加了limit,那么索引的指针不会再做判断。
-
单表索引建议控制在5个以内
-
单索引字段数不允许超过5个(组合索引)