mysql日期索引失效_MySQL索引在什么情况下会失效

《慢Sql排查》介绍了如何使用执行计划来对慢sql进行调优。《MySQL的两种索引方法如何提高查询速度》介绍了索引如何提高查询速度。

索引的失效,会大大降低sql的执行效率,日常中又有哪些常见的情况会导致索引失效?

1.尽量避免全表扫描,考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from table where num is null

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from table where num=0

3.应尽量避免在 where 子句中使用!=或<>操作符,否则将进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将进行全表扫描,如果or的所有字段都有索引还是会走索引查询,如:

select id from table where num=10 or name=best

可以修改为:

select id from table where num=10  
union all
select id from table where name=best

5.in 和 not in 也要慎用,否则会导致全表扫描,如:

select id from table where age in(18,20,38)

对于连续的数值,能用 between 就不要用 in 了:

select id from table where age between 18 and 38

6.下面的查询也将导致全表扫描:

select id from tabel where name like '%best%';select id from t where name like '%best'

只有like best% 索引才有效。

7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

select id from table where num/2=100

应改为:

select id from table where num=100*2

8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

select id from table where substring(name,1,3)='abc'--name以abc开头的id  
select id from table where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id

应改为:

select id from table where name like 'abc%'  
select id from table where createdate>='2005-11-30' and createdate

9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部分,但只能是最左侧部分。

例如索引是key index (a,b,c)。可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效

11.很多时候用 exists 代替 in 是一个好的选择:

select num from table where num in(select num from b)

用下面的语句替换:

select num from a where exists(select 1 from b where num=a.num)

0805c44db92a11756d7ba80e64c665e1.gif

  • 测试面试需要知道的数据结构

  • 测试平台源码入门

  • Postman接口自动化

  • 性能测试-场景设计和结果判断

  • 测试工具-Jira和禅道

扫一扫,关注我

d99fcbab87cb9cfc4224b5e477ed182a.png

若有收获,点个在看??感谢

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL日期索引失效是指在使用日期字段进行查询时,索引无法起到预期的加速作用,导致查询性能下降。这种情况通常发生在以下几种情况下: 1. 函数操作:如果在查询条件中对日期字段进行了函数操作,比如使用了DATE()、YEAR()、MONTH()等函数,这会导致索引失效。因为函数操作会改变字段的值,使得索引无法直接匹配。 2. 范围查询:如果查询条件中使用了范围查询,比如使用了大于、小于、区间等操作符,这也会导致索引失效。因为范围查询需要扫描多个索引节点,无法利用索引的快速定位特性。 3. 数据分布不均匀:如果日期字段的数据分布不均匀,比如某个日期范围内的数据非常多,而其他日期范围内的数据很少,这也会导致索引失效。因为MySQL优化器可能会认为全表扫描比使用索引更快。 为了解决MySQL日期索引失效的问题,可以考虑以下几点: 1. 避免函数操作:尽量避免在查询条件中对日期字段进行函数操作,可以将函数操作提前计算好,并将结果存储在一个额外的字段中,然后使用该字段进行查询。 2. 使用合适的索引:根据实际查询需求,选择合适的索引类型。对于日期字段,可以考虑使用B-tree索引或者Hash索引。 3. 使用覆盖索引:如果查询只需要返回日期字段,可以考虑创建覆盖索引,即索引包含了查询所需的所有字段,这样可以避免回表操作,提高查询性能。 4. 数据分布均匀化:如果数据分布不均匀,可以考虑对日期字段进行分区,将数据按照日期范围进行划分,使得每个分区内的数据量相对均匀。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值