[{"createTime":1735734952000,"id":1,"img":"hwy_ms_500_252.jpeg","link":"https://activity.huaweicloud.com/cps.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905","name":"华为云秒杀","status":9,"txt":"华为云38元秒杀","type":1,"updateTime":1735747411000,"userId":3},{"createTime":1736173885000,"id":2,"img":"txy_480_300.png","link":"https://cloud.tencent.com/act/cps/redirect?redirect=1077&cps_key=edb15096bfff75effaaa8c8bb66138bd&from=console","name":"腾讯云秒杀","status":9,"txt":"腾讯云限量秒杀","type":1,"updateTime":1736173885000,"userId":3},{"createTime":1736177492000,"id":3,"img":"aly_251_140.png","link":"https://www.aliyun.com/minisite/goods?userCode=pwp8kmv3","memo":"","name":"阿里云","status":9,"txt":"阿里云2折起","type":1,"updateTime":1736177492000,"userId":3},{"createTime":1735660800000,"id":4,"img":"vultr_560_300.png","link":"https://www.vultr.com/?ref=9603742-8H","name":"Vultr","status":9,"txt":"Vultr送$100","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":5,"img":"jdy_663_320.jpg","link":"https://3.cn/2ay1-e5t","name":"京东云","status":9,"txt":"京东云特惠专区","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":6,"img":"new_ads.png","link":"https://www.iodraw.com/ads","name":"发布广告","status":9,"txt":"发布广告","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":7,"img":"yun_910_50.png","link":"https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=aXhpYW95YW5nOA===&utm_medium=cps&utm_campaign=201905","name":"底部","status":9,"txt":"高性能云服务器2折起","type":2,"updateTime":1735660800000,"userId":3}]
最近闲来无事,发现自己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开销)