最近闲来无事,发现自己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开销)

 

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信