最近闲来无事,发现自己mysql的知识点忘得差不多了,打算重新拾起来捯饬捯饬,个人觉得其中最重要的知识点还是mysql的优化问题,毕竟mysql使用方面都是很简单的东西,打算从索引方面开始学习吧。
有时候我们会发现,明明已经建立了索引,但是通过explain发现语句并没有使用上索引,那咱们可能踩中了以下的几种情况:
索引失效的案例:
1、如果条件中有or,即使其中有部分条件带索引也不会使用(这也是为什么尽量少用or的原因)
注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。
2、对于多列索引,不是包含第一部分,则不会使用索引。
例:建立组合索引 a,b,c 其中a ab abc
ac都可以用到索引,还有就是顺序可以随意。(我自己实践过,只要有a在就行,好像在某个版本之后,顺序不是abc时mysql索引优化器会自动优化)
3、like查询是以%开头,不会使用索引。
4、存在索引列的数据类型隐形转换,则用不上索引,比如列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
例:user_name字段为字符类型,但是如果不加引号,则不会使用索引。
5、where 子句里对索引列上有数学运算或者函数,会导致索引失效而转向全表扫描
例:在索引列上做计算相加,索引失效。
例:在索引列上使用函数,索引失效。
什么情况下不推荐使用索引?
1、数据唯一性差的字段不要使用索引。(例如:性别只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描)
2、频繁更新的字段不要使用索引。(比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率。)
3、字段不在where语句出现时不要添加索引,如果where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引。
4、尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select * 这种全字段查询(会增大数据库压力和io开销)