MySQL索引优化
不使用索引的情况
- 如果 mysql 估计使用索引比全表扫描更慢,则不使用索引。
例如:如果 key_part 1 均匀分布在 1 和 100 之间,下列查询中使用索引就不是很好:
1 | SELECT * FROM table_name where key_part1 > 1 and key_part1 < 90; |
如果使用 heap 表并且 where 条件中不用=索引列,其他 > 、 < 、 >= 、 <= 均不使 用索引(MyISAM 和 innodb 表使用索引);
使用 or 分割的条件,如果 or 前的条件中的列有索引,后面的列中没有索引,那么涉及到的索引都不会使用。
如果创建复合索引,如果条件中使用的列不是索引列的第一部分;(不是前缀索引)
如果 like 是以%开始;
对 where 后边条件为字符串的一定要加引号,字符串如果为数字 mysql 会自动转 为字符串,但是不使用索引。
查看索引使用情况
如果索引正在工作, Handler_read_key 的值将很高,这个值代表了一个行被索引值读的次数,很低的值表明增加索引得到的性能改善不高,因为索引并不经常使 用。
Handler_read_rnd_next 的值高则意味着查询运行低效,并且应该建立索引补救。这个值的含义是在数据文件中读下一行的请求数。如果你正进行大量的表扫描,
该值较高。通常说明表索引不正确或写入的查询没有利用索引。
语法:
1 | show status like 'Handler_read%'; |