关于MySql的索引问题

目录

条件对命中索引的影响

条件里写的函数对命中索引会不会有影响?

条件里写的like对命中索引会不会有影响?

写在字select里的字段会不会命中索引


我打算在这里写一些工作中遇到的,关于MySql的问题。有多短,不知道,有多长,我也不知道,写着看吧,可能是持续更新。

条件对命中索引的影响

条件里写的函数对命中索引会不会有影响?

有这么一个表,如图1。

图1,有个主键是ID

 表里大概有32万条数据。在没有索引的情况下,执行以下语句。

select count(1) as num 
from wms_business_doc 
where businesstype = '1' and 
createdate >= '2021-12-07 00:00:00' and 
createdate <= '2021-12-14 23:59:59';

执行100次的平均时间是0.791秒。

给docno加上唯一索引。

ALTER TABLE `sapwms`.`wms_business_doc` 
ADD UNIQUE INDEX `UK_DOCNO`(`docno`) USING BTREE;

执行100次的平均时间是0.693秒。

测试结果有点儿意思。如果说索引对查询语句没有影响吧,执行100次的平均时间减少了近0.1秒。速度提升了10%,但说索引对查询没有影吧,也符合逻辑,毕竟查询条件没有命中索引。见图2。

 图2

试试看把createdate字段也定义成索引,看看对这条查询语句的效率有什么样的影响。

ALTER TABLE `sapwms`.`wms_business_doc` 
ADD INDEX `ID_CREATEDATE`(`createdate`) USING BTREE;

 命中了索引之后的效率果然不一般,执行了20次,其中18次用时0.001s,2次用时0.002s,效率提升明显。

图3

以上这些都是在预想内的,改造一下这条丑陋的语句看会有什么效果。把日期给格式化一下去比较。

select count(1) as num 
from wms_business_doc 
where businesstype = '1' and 
DATE_FORMAT(createdate ,'%Y-%m-%d') >= '2021-12-07' and 
DATE_FORMAT(createdate ,'%Y-%m-%d') <= '2021-12-14';

结果还真如网上所说的,索引字段一旦放到函数里,就不会再命中索引。执行效率与增加索引前类似。

图4

条件里写的like对命中索引会不会有影响?

又做了测试,既然使用函数会影响命中索引,那么如果用like会怎么样。

有这么一张表,负责记录物料的。物料号是唯一的,已经被设置成了唯一索引。

图5

图6

图7

图8

执行结果有点儿意思,从解释语句的结果上证明了,使用like关键字,会不会命中索引,和通配符的位置还是有一定关系的。如果通配符写在字符串结尾,是可以命中索引的,但如果通配符写在字符串中间或者开头,是命中不了索引的。

写在字select里的字段会不会命中索引

图9

图10 

 图11

实战中遇到的问题

问题1:

同事说有个查询功能非常慢,查询结果只有几条,效率大概是几分钟。第一个反应就是查询条件破坏了索引,先把查询语句的条件搞出来执行一下看看。

照着日志往下抄关键信息

select *
from tr_transport transportv0_
where DELETESIGN=0 and  1=1 and (billNo like '%4080022%')
order by billNo desc limit 15

只涉及一张表,那么先看看这个表有没有索引。

表是有索引的。

 一步步做减法,看看问题出在哪。

select *
from tr_transport 
where DELETESIGN=0 and 1=1

执行时长3秒多,第一个念头是,难道是like影响了效率?但转念一想,还是看看SQL语句效率慢到什么程度。随即继续测试

select *
from tr_transport 
where DELETESIGN=0 and 1=1 and (billNo like '%4080022%')

执行时长2秒多,也是秒级,问题不在这儿。

select *
from tr_transport 
where DELETESIGN=0 and 1=1 and (billNo like '%4080022%')
order by billNo desc 

执行时长2秒多,还是秒级,难不成问题出现在数据库和Web容器之间?

在测试环境打断点跑了一下,确认问题还是出在了SQL语句上。

 分析了如图的两条语句,发现是key是不一样的,难道问题出在这儿?那么就尝试一下怎么能把带limit关键字的语句的key和不带limit关键字的语句的key弄成一致的。

思路是把索引里的字段加到order by里试试。

看来如图这么写不行,那就接着加。

这么写是可以的,执行速度也是秒级的了。但搞不懂,分析结果里的key是idx_tr_transport_DELETESIGN,当我在order by关键字里写order by DELETESIGN ,billNo的时候,并没有用到这个key啊。这是咋回事儿,问题解决了,但原理不清楚。

未完,待续。。。。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MySQL 索引是一个很热门的话题,常见的问题包括: 1. 索引的选择:该如何选择适合查询的索引? 2. 索引数量:有多少索引是太多的? 3. 索引性能:如何优化索引的性能? 4. 索引的使用:如何使用索引来提高查询效率? 5. 索引的维护:如何维护索引以保证其正常工作? 如果您有更详细的问题,可以继续提问。 ### 回答2: MySQL索引是提高查询速度的重要手段,但在实际使用过程中可能会遇到一些常见问题。其中一些热门问题包括: 1. 索引选择不当:选择合适的索引对查询性能至关重要。如果选择的索引不适合查询语句,可能导致索引无效,影响查询性能。通常根据查询条件和数据量来选择索引,同时避免创建过多的索引,以免降低写操作性能。 2. 索引过多:虽然索引可以提高查询性能,但过多的索引也会带来一些问题。首先,会占用更多的磁盘空间;其次,每次写操作都需要更新多个索引,影响写入性能。因此,应该根据实际需要选择合理的索引数量。 3. 索引列顺序:索引列的顺序对查询性能也有一定影响。对于多列索引,应该将查询频率高的列放在前面,这样可以更有效地利用索引。另外,如果存在某个唯一列,应该优先考虑将其作为索引的第一个列。 4. 索引列类型选择:选择合适的索引列类型对查询性能也非常重要。通常使用较短的数据类型作为索引列,可以减少索引的大小,提高查询性能。 5. 不必要的索引:有些索引可能是冗余或不必要的,应该及时删除。通过定期分析查询日志和执行计划,可以发现不必要的索引,并进行清理和优化。 总之,合理地选择、创建和维护索引是提高MySQL查询性能的关键。这需要根据具体的业务需求和数据特点进行调整和优化,以获得更好的查询效果。 ### 回答3: MySQL索引是一种特殊的数据结构,用于提高数据库查询性能。然而,在使用索引时,也有一些常见的问题需要注意。 首先,过多的索引可能导致性能下降。虽然索引可以加快查询速度,但每个索引都需要占用存储空间,并且在插入、删除或更新数据时需要维护索引。因此,过多的索引会增加存储开销和维护负担,降低性能。 其次,不当使用索引也可能造成性能问题。如果一个查询只返回表中大部分的数据行,那么使用索引可能会导致较慢的查询速度。此时,可以考虑对查询进行优化,或者尝试使用覆盖索引来避免回表操作,提高查询效率。 另外,索引的选择也是一个重要的问题。对于常用的查询条件,选择适当的索引列可以极大地提高查询效率。一般来说,对于频繁查询和过滤的列,如主键、外键或经常出现在WHERE子句中的列,可以考虑创建索引。 此外,索引的顺序也需要注意。对于多列索引索引的列顺序对查询效率有影响。在WHERE子句中经常使用的列应该放在索引的前面,以便提高查询效率。 最后,索引的更新也需要关注。对于频繁进行插入、删除或更新操作的表,索引的维护会增加开销。因此,在设计表结构时,需要根据业务需求和查询频率综合考虑是否需要使用索引。 综上所述,合理使用索引可以提高MySQL的查询性能,但过多的索引、不当使用索引、选择不当的索引索引顺序不合理以及索引的更新也可能导致性能问题。因此,在设计数据库和进行查询时,需要注意这些问题,以达到最佳性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rarenmen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值