喜迎
春节

MySQL索引


导致 MySQL 索引失效的常见场景

  1. 联合索引不满足最左匹配原则
    最左匹配原则是指以最左边的为起点字段查询可以使用联合索引,否则将不能使用联合索引。
    假设联合索引为A+B+C,则能使用索引的为A+B+C、A+B、A+C。
  2. 模糊查询最前面的为不确定匹配字符
    只有模糊匹配后面任意字符:like 'xx%' 可以使用索引
  3. 索引列参与了运算
    如:explain select * from tname where id+1=1;未使用索引
  4. 索引列使用了函数
    如:explain select * from tname where ifnull(id,0)=1;未使用索引
  5. 索引列存在类型转换
    如果索引列存在类型转换,那么也不会走索引,比如 name 为字符串类型,而查询的时候设置了 int 类型的值就会导致索引失效
  6. 索引列使用 is not null 查询
    当在查询中使用了 is not null 也会导致索引失效,而 is null 则会正常触发索引的

哪些情况不适合创建索引

  1. 不应该在字段比较长的字段上建立索引,因为会消耗大量的空间
  2. 对于频繁更新、插入的字段应该少建立索引,因为在修改和插入之后,数据库会去维护索引,会消耗资源
  3. 尽量少在无用字段上建立索引【where条件中用不到的字段】
  4. 表记录太少不应该创建索引
  5. 数据重复且分布平均的表字段不应该创建索引【选择性太低,例如性别、状态、真假值等字段】
  6. 参与列计算的列不适合建索引【保持列”干净”,比如from_unixtime(create_time) = ‘2022-05-29’就不能使用到索引,原因是b+树中存的都是数据表中的字段值,但进行检索时需要把所有元素都应用函数才能比较,显然成本太大,所以语句应该写成create_time = unix_timestamp(‘2022-05-29’)】

索引的优缺点

  1. 建立索引是要消耗一定的空间,况且在索引的维护上也会消耗资源

文章作者: Crazy Boy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Crazy Boy !
评 论
 上一篇
MySQL中的explain
MySQL中的explain
当我们在执行sql时,一般都会使用explain来分析sql的效率情况。 用法 只需要在查询的 SQL 前面添加上 explain 关键字即可。 结果列说明 id — 选择标识符,id 越大优先级越高,越先被执行; select_type
2020-06-12
下一篇 
MySQL架构设计
MySQL架构设计
1、MySQL架构设计中的经验 1)根据公司现有业务设计合理架构 2)选择成熟架构方案 3)因地制宜,根据实际设备情况做出选择 4)考虑方案的可行性 5)越简单越好,越适合公司越好
2020-03-22
  目录