当前位置: 首页 > news >正文

mysql 子查询索引失效_mysql 索引失效的情况

索引失效的几种情况

1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

2.对于多列索引,不是使用的第一部分,则不会使用索引(靠左原则)

3.like查询以%开头的列索引会失效

4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

6 不等于(!= ,<> ),EXISTS,not in,is not null,>,

下面对这几种情况进行测试

例如有个表 test 有 id,name,age三个字段

首先插入10000条

INSERT INTO test(id,name,age)

VALUES

('5','5test','5'),('6','6test','6'),('7','7test','7'),......('9999','9999test','9999');

上面是一种批量插入的方法,可以减少数据连接的次数,有兴趣的可以试试,这个我没在代码(xml)里面试过

数据已经有了

使用id作为索引

ALTER TABLE testADD index_id(id);

EXPLAIN select * from test where id= '26'

可以看得出来是走了索引的;如果表中数据量不够大,msyql觉得全盘扫描的时间比走索引的时间短的话可能就不会走索引了

组合索引(靠左原则)

现在增加组合索引

ALTER TABLE testADD name_age (name,age);

1 根据name精确查询时

EXPLAIN select * from test where name = '26test'

可见是走了 name_age索引的: 靠左原则

2 根据name+age查询时(靠左原则)

EXPLAIN select * from test where name = '26test' and age='26'

EXPLAIN select * from test where age =26 and name = '26test'

3 使用age查询时(索引失效的第二种情况)

EXPLAIN select * from test where age='26'

没有走name_age索引: 原因是mysql的靠左原则(根据where最最侧的匹配是否有索引),所以不使用name_age索引

问题来了:如果这样的话会使用哪个索引呢?

EXPLAIN select * from test where name='26' and id='26'

可见possible_keys有两个索引,但是最后使用的还是 id_index索引,因为它耗时最少

4 组合索引使用 like 时

EXPLAIN select * from test where age like '%26%' and name = '26test'

使用的还是name_age索引,为什么呢? 因为虽然like不会走索引 但是 name 遵循了靠左原则所以还是会使用索引

使用这条时:EXPLAIN select * from test where name like '%26%' and age='26'

或 EXPLAIN select * from test where id like '%26%'

(索引失效的第三种)

结果就是没有使用索引,因为name使用的是模糊查询

5 组合索引(失效)+非组合索引

EXPLAIN select * from test where name like '%26%' and age='26' and id='26'

可见使用的是 id_index

6 非组合索引使用like查询(索引失效的第三种)

EXPLAIN select * from test where id like '%26%'

7 or 条件如果都有所有就会使用索引

一下两种都会走索引

EXPLAIN select * from test where id ='26' or name='26test';

EXPLAIN select * from test where id ='26' or age='26' and name='26test';

因为id和name(name_index:靠左原则)都有索引所以最后还是走了索引----index_merge 索引合并

8 or条件中 其中之一没有索引就会使索引失效(索引失效的第一种)

EXPLAIN select * from test where id ='26' or age='26';

id有索引但是age不是索引,所以就走了全盘扫描

9 字符串没有加引号(索引失效的第四种)

EXPLAIN select * from test where name=26

相关文章:

  • mysql5.7注册码_Mysql5.7 用户与授权
  • mysql左右连接语法_图解MySQL 内连接、外连接、左连接、右连接、全连接……太多了...
  • mysql增加缓存的命令_MySQL查询缓存设置 提高MySQL查询性能 | 学步园
  • mysql desc limit_MySql sql优化之order by desc/asc limit M
  • mysql mycat java_mysql读写分离实现 jdk+mycat环境部署
  • rocketmq技术内幕:rocketmq架构设计与实现原理_这份553页的RocketMQ神仙手册在Github上了标星70.5k+实在太香了...
  • mysql中为什么删除一个表中的主键约束后该字段不能为空_MySQL数据表的操作
  • 获取textbox控件中输入值_Android 开发(一):Toast弹窗与获取控件的值
  • 深度学习异常检测_深度学习用来做日志异常检测
  • python图片分析中央气象台降水_python 画降水量色斑图问题
  • 圆锥形怎么画_如何画圆锥体的展开图?
  • matlab内部迭代函数_MATLAB:向量化编程提升值函数迭代(Value Function Iteration)的速度...
  • shell判断某个字符串是不是以数字开头_面试中的shell部分看着就对了
  • mysql简单命令行_MySQL命令行的简单操作
  • python混淆加密ios代码_Python中的AES加密与iOS不同
  • [case10]使用RSQL实现端到端的动态查询
  • 230. Kth Smallest Element in a BST
  • 77. Combinations
  • es6要点
  • Flannel解读
  • nodejs:开发并发布一个nodejs包
  • react 代码优化(一) ——事件处理
  • select2 取值 遍历 设置默认值
  • SpringBoot 实战 (三) | 配置文件详解
  • 分布式任务队列Celery
  • 机器学习中为什么要做归一化normalization
  • 力扣(LeetCode)357
  • 设计模式走一遍---观察者模式
  • 使用SAX解析XML
  • 用 Swift 编写面向协议的视图
  • 再谈express与koa的对比
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 阿里云ACE认证之理解CDN技术
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • ${ }的特别功能
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (9)目标检测_SSD的原理
  • (C语言)字符分类函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (十)T检验-第一部分
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • .mysql secret在哪_MySQL如何使用索引
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .Net CoreRabbitMQ消息存储可靠机制
  • .Net MVC4 上传大文件,并保存表单
  • .net 调用php,php 调用.net com组件 --
  • .NET 使用 XPath 来读写 XML 文件
  • /3GB和/USERVA开关
  • ::before和::after 常见的用法
  • [<死锁专题>]