工作中,经常遇到这样的问题,我明明在MySQL表上面加了索引,为什么执行SQL查询的时候却没有用到索引?

同一条SQL有时候查询用到了索引,有时候却没用到索引,这是咋回事?

原因可能是索引失效了,失效的原因有以下几种,看你有没有踩过类似的坑?

1. 数据准备:

有这么一张用户表,在name字段上建个索引:

CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',`name` varchar(255) DEFAULT NULL COMMENT '姓名',`age` int DEFAULT NULL COMMENT '年龄',PRIMARY KEY (`id`),KEY `idx_name` (`name`)
) ENGINE=InnoDB COMMENT='用户表';

2. Explain详解:

想要查看一条SQL是否用到索引?用到了哪种类型的索引?

可以使用 explain 关键字,查看SQL执行计划。例如:

explain select * from user where id=1;

可以看到type=const,表示使用了主键索引。

explain的所有type类型如下:

3. 失效原因

1. 数据类型隐式转换

name字段是varchar类型,如果我们使用数据类型查询,就会产生数据类型转换,虽然不会报错,但是无法用到索引。

explain select * from user where name='一灯';

explain select * from user where name=18;

2. 模糊查询 like 以%开头

explain select * from user where name like '张%';

explain select * from user where name like '%张';

3. or前后没有同时使用索引

虽然name字段上加了索引,但是age字段没有索引,使用or的时候会全表扫描。

# or前后没有同时使用索引,导致全表扫描
explain select * from user where name='一灯' or age=18;

4. 联合索引,没有使用第一列索引

如果我们在(name,age)上,建立联合索引,但是查询条件中只用到了age字段,也是无法用到索引的。

使用联合索引,必须遵循最左匹配原则,首先使用第一列字段,然后使用第二列字段。

CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',`name` varchar(255) DEFAULT NULL COMMENT '姓名',`age` int DEFAULT NULL COMMENT '年龄',PRIMARY KEY (`id`),KEY `idx_name_age` (`name`,`age`)
) ENGINE=InnoDB COMMENT='用户表';

5. 在索引字段进行计算操作

如果我们在索引列进行了计算操作,也是无法用到索引的。

# 在主键索引上进行计算操作,导致全表扫描
explain select * from user where id+1=2;

6. 在索引字段字段上使用函数

如果我们在索引列使用函数,也是无法用到索引的。

7. 优化器选错索引

同一条SQL有时候查询用到了索引,有时候却没用到索引,这是咋回事?

这可能是优化器选择的结果,会根据表中数据量选择是否使用索引。

当表中大部分name都是一灯,这时候用name='一灯'做查询,还会不会用到索引呢?

索引优化器会认为,用索引还不如全表扫描来得快,干脆不用索引了。

当然我们认为优化器优化的不对,也可以使用 force index 强制使用索引。

知识点总结:

MySQL查询为什么没走索引?这篇文章带你全面解析相关推荐

  1. mysql 左连接 怎么走索引_数据库索引、左连接、右连接、等值连接

    在MySQL中,主要有四种类型的索引,分别为:B-Tree索引,Hash索引,Fulltext索引(MyISAM 表)和R-Tree索引,本文讲的是B-Tree索引. 一.Mysql索引主要有两种结构 ...

  2. 【mysql or条件是否走索引】

    mysql or条件是否走索引 一.建表,插入数据测试 数据库版本为8.0.12 DROP TABLE IF EXISTS `a`; CREATE TABLE `a` (`id` int(11) NO ...

  3. MySQL查询性能优化七种武器之索引下推

    前面已经讲了MySQL的其他查询性能优化方式,没看过可以去了解一下: MySQL查询性能优化七种武器之索引潜水 MySQL查询性能优化七种武器之链路追踪 今天要讲的是MySQL的另一种查询性能优化方式 ...

  4. 设计模式一网打尽,40余篇文章带你领略设计模式之美

    文章末尾附带GitHub开源下载地址. 该文章的最新版本已迁移至个人博客[比特飞],单击链接 设计模式一网打尽,40余篇文章带你领略设计模式之美 | .Net中文网 访问. 设计模式概述 20世纪80 ...

  5. 四篇文章带你快速入门Jetpck(中)之ViewModel,DataBinding

    文章目录 四篇文章带你快速入门Jetpck(中)之ViewModel,DataBinding Jetpack 官方推荐架构 ViewModel 添加依赖 创建ViewModel 初始化ViewMode ...

  6. 什么产品适合抖音广告?本篇文章带你来了解

    到底什么产品适合抖音广告?抖音广告类型的多样化使不计其数的广告主选择在抖音这个热门app上投放产品广告.不断有很多广告主提出疑问,自己的产品到底适不适合在抖音做营销.下面为您介绍适合在抖音做广告的产品 ...

  7. 每个成功的男人背后都有个厉害的女人,这篇文章带你看看互联网大佬们背后的女人。...

    每个成功的男人背后都有个厉害的女人,这篇文章带你看看互联网大佬们背后的女人. 别看这些互联网大佬现在一幅高大上的样子,可是别忘了人家也有屌丝的时候,也有青春少年的时候啊!今天咱们就八卦一下,翻翻这些大 ...

  8. 别再问我MySQL为啥没走索引?就这几种原因,全都告诉你

    工作中,经常遇到这样的问题,我明明在MySQL表上面加了索引,为什么执行SQL查询的时候却没有用到索引? 同一条SQL有时候查询用到了索引,有时候却没用到索引,这是咋回事? 原因可能是索引失效了,失效 ...

  9. mysql 执行delete的时候没走索引

    在项目中需要删除表里的过期数据,表设置了key为gmt_created, 但是在执行"delete from  table_name where to_days(gmt_created) & ...

最新文章

  1. QT报错“qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method”
  2. R语言计算回归模型每个样本(观察、observation、sample)的杠杆值(leverage)实战:如果一个样本的预测变量比其他样本的预测变量值更极端,那么被认为具有很高的杠杆作用
  3. python非官方的二进制扩展包下载地址
  4. 使用gevent启动bottle web框架
  5. 南通大学计算机系本二,2012年南通大学计算机科学与技术学院江苏省内第二批本科(院校代码:1301)...
  6. 计算机教学论研究生,课程与教学论(计算机)专业硕士学位研究生培养方案
  7. 谷歌浏览器地址栏记录怎么删除 Chrome浏览器地址栏记录清除方法
  8. 2018你那计算机考试新题型,2018考研新题型考察点和解题步骤
  9. 定量论文:探究「健康水平、婚姻状况」对幸福感的影响
  10. POI Excel 13 添加图片
  11. 关于iframe或document监听滑动(scroll)失败的问题
  12. 聚合支付系统如何开发?
  13. foxmail超大附件服务器文件怎么删,电脑中使用Foxmail发送超大附件的方法
  14. C++ 实现贪吃蛇游戏(免费附源码)
  15. 网页被劫持怎么修复?主页被劫持修复方法
  16. MyBatis学习笔记(1)—使用篇
  17. Python学习:给类或者类的对象添加打印内容 def __repr__(self)
  18. 服务被人当肉鸡了,叫一路赚钱 xig
  19. 全志 A50/A133 新增驱动配置
  20. 调试web项目时Chrome浏览器发送两次请求

热门文章

  1. 郑州java实习_一个java实习生两周八次的面试经历
  2. 如何在计算机上取消打印,打印机如何取消打印任务
  3. 有趣的C语言代码关机程序(和兄弟小心玩一玩)
  4. 圆的面积为什么是π r²
  5. word文档怎么找回误删的文件_Word文档被误删了怎么办?这几个恢复技巧帮你拯救文件...
  6. 计算机二级access查询条件,计算机二级Access:如何使用查询向导
  7. nodejs Koa框架及常用中间件
  8. 04-CSS核心属性
  9. 请教有关maplesim中的接触问题
  10. MapleSim中的符号和数值求解器详解