MySQL数据库原理学习(十三)
2023-06-13 09:13:59 时间
3.6.4.4 or连接条件
用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
explain select * from tb_user where id = 10 or age = 23;
explain select * from tb_user where phone = '17799990017' or age = 23;
由于age没有索引,所以即使id、phone有索引,索引也会失效。所以需要针对于age也要建立索引。
然后,我们可以对age字段建立索引。
create index idx_user_age on tb_user(age);
建立了索引之后,我们再次执行上述的SQL语句,看看前后执行计划的变化。
最终,我们发现,当or连接的条件,左右两侧字段都有索引时,索引才会生效。
3.6.4.5 数据分布影响
如果MySQL评估使用索引比全表更慢,则不使用索引。
select * from tb_user where phone >= '17799990005';
select * from tb_user where phone >= '17799990015';
经过测试我们发现,相同的SQL语句,只是传入的字段值不同,最终的执行计划也完全不一样,这是为什么呢?
就是因为MySQL在查询时,会评估使用索引的效率与走全表扫描的效率,如果走全表扫描更快,则放弃索引,走全表扫描。因为索引是用来索引少量数据的,如果通过索引查询返回大批量的数据,则还不如走全表扫描来的快,此时索引就会失效。
接下来,我们再来看看 is null 与 is not null 操作是否走索引。
执行如下两条语句 :
explain select * from tb_user where profession is null;
explain select * from tb_user where profession is not null;
接下来,我们做一个操作将profession字段值全部更新为null。
然后,再次执行上述的两条SQL,查看SQL语句的执行计划。
最终我们看到,一模一样的SQL语句,先后执行了两次,结果查询计划是不一样的,为什么会出现这种现象,这是和数据库的数据分布有关系。查询时MySQL会评估,走索引快,还是全表扫描快,如果全表扫描更快,则放弃索引走全表扫描。因此,is null 、is not null是否走索引,得具体情况具体
分析,并不是固定的。
相关文章
- MySQL数据库基础学习(一)
- Linux安装MySQL数据库并操作入门(Linux打开MySQL)
- MySQL 高效去重复查询方法(mysql去重复查询)
- 语句精选日常MySQL语句:轻松管理数据库(条mysql)
- MySQL自动退出:问题分析与解决方案(mysql打开后就关闭了)
- 实现MySQL数据库的数据插入(插入mysql数据库)
- MySQL事件:自动执行定时任务(mysql的事件)
- MySQL数据库教程:如何新建用户名?(mysql新建用户名)
- 免费远程MySQL数据库提供商,让您轻松连接并管理您的数据!(免费远程mysql数据库)
- 走向成功:MySQL二级数据库实践(二级数据库mysql)
- C语言操作MySQL数据库的基本知识(c语言操作mysql)
- Exploring Alternative SQL Databases to Replace MySQL(mysql替代)
- 的MySQL:让数据库操作更简单(mysql以开头)
- MySQL结果集合并优化实践篇(mysql 结果集 合并)
- MySQL 中实现两张表数据联合查询(mysql两张表)
- csv文件快速倒入MySQL实现数据管理(csv文件倒入mysql)
- MySQL运行速度突出,助力构建数据库快速分析(c mysql速度怎么样)
- 用MySQL选择数据库,C语言实现(c mysql选择数据库)
- 调试困难C语言无法连接MySQL数据库(c mysql 连不上)
- 在bash中如何连接MySQL数据库(bash 连接mysql)
- 50个MySQL语句带你玩转数据库(5o个mysql语句)
- 深入探究MySQL中的元数据到底是什么(mysql中元数据)
- 解决MySQL安装无响应问题(mysql一安装就无响应)
- 详细指南MySQL数据库下载及安装教程简述(mysql下载说明书)