每天一个知识点-设计索引原则和索引失效

在这里插入图片描述

每日一题

设计索引参考的几个原则

索引的设计往往关乎于查询的速度,磁盘的占用,在面试中也是必问的一个问题,下面介绍设计索引过程中通常会考虑的几个点,但不是必须遵守的原则。

  1. 最适合的索引列是出现在 WHERE 子句中,或连接子句中的列。
  2. 建议使用唯一的索引,索引值的分布,基数越大,索引的效果越好。 例如有出生日期和性别这两列,使用出生日期很容易区分各行,使用性别列,大约每次都会扫面一半的行
  3. 如果是字符串类需要建立索引,尽可能使用较短的字符串,或者使用字符串的前缀作为索引列没这样可以大大减少索引的存储时间,在检索时,buffer_pool中也可以容纳更多的键值,同时页减少了比对大小的计算量
  4. 联合索引在创建时一定要考虑索引列的顺序,不一定非要考虑基数大的放在前面,也要考虑索引的使用频率,联合索引可以利用给最左的列来匹配行,同时也要考虑到索引覆盖的场景,能节省回表操作提高查询效率
  5. 索引不是越多越好。额外的索引会额外的存储空间,降低写操作的性能,也会减缓表的修改速度,在生成查询计划时,要考虑哥哥索引也要花费时间。

索引失效的常见常见

  1. 条件字段函数操作或者运算操作

    例如: where a+1 = 2 或者 where month(modified)=7;

  2. 条件字段发生了隐式类型转换 或者发生了编码转换

    例如: where id = ‘123’

  3. 联合索引不满足最左前缀

    但是在最新发布的mysql 版本中 如果不满足最左前缀 但是 第一索引类 基数小 比如说 性别字段,优化器会自东优化 类似于 性别 in (男,女)

  4. 错误 like 使用
    例如 : name like ‘%波儿’ 不满足最左前缀

  5. 使用OR操作

  6. 两列做比较

    例如 : where r1 > r2 因为不知到r2的具体值

  7. 不连续范围的比较

    一些不连续的范围的比较:in、not in、between…and、!= ,这些在查询返回多个字段时,会导致索引失效

  8. is not null
    is null 不会导致索引失效。相反,is not null会导致索引失效。

  9. 索引扫描结果超过全表的30%优化器会认为全表扫描更快

  10. 索引数量过多,选择索引时间过长,会导致不能使用正确的索引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

1999

每人一点点,明天会更好

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

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

打赏作者

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

抵扣说明:

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

余额充值