1. 写在前头

这篇文章《Mysql是怎样运行的》,参考书中P123 - P125,它列举的就是在排序时不使用索引的情况,这让我回想起在面试的时候,被问到在查询时不使用索引的情况,所以我想将这两个问题汇总在一起,以便供大家参考。

2. 说前“热身”

来,我们先建个表

create table single_table(id int not null auto_increment,key1 varchar(100),key2 int,key3 varchar(100),key_part1 varchar(100),key_part2 varchar(100),key_part3 varchar(100),common_field varchar(100),primary key (id),key idx_key1(key1),unique key uk_key2(key2),key idx_key3 (key3),key idx_key_part(key_part1, key_part2, key_part3))engine=InnoDB charset=utf8;

哟!你给我写这么长的代码,你给我解释解释:

主要知道下面这些信息就行

id列为聚簇索引

key1列为二级索引

key2列唯一(unique)二级索引

key3列为二级索引

key_part1、key_part2、key_part3为三列的联合索引(二级索引)

再插入10条数据,如下

这下准备差不多了,我们步入正题

3. 在排序时不用索引的重头戏

ASC、DESC混用

以下这条代码想让key_part1列升序排列,key_part2降序排列是不会用到索引的

select key_part1, key_part2 from single_table order by key_part1, key_part2 desc;

区别于以下代码,这种情况会使用到我们的联合索引

select key_part1, key_part2 from single_table order by key_part1, key_part2;

注:这种情况适用于mysql8.0之前的版本,而在8.0版本会用到索引,分析语句和分析结果如下

explain select key_part1, key_part2 from single_table order by key_part1, key_part2 desc;

排序列包含非用一个索引的列

因为key1和key2为非同一列的索引,在key1相同的情况下,是不会按照key2列进行排序,所以用不到索引

(explain)select id, key1, key2 from single_table order by key1, key2;

分析结果如下

排序列是某个联合索引的索引列,但是这些排序列在联合索引中并不连续

上代码,一看就能明白!

select key_part1, key_part3 from single_table order by key_part1, key_part3;

联合索引在key_part1相同的时候,并不会按照key_part3排序,中间还有key_part2,所以不会用到联合索引(但是mysql8.0会用到)

用来形成扫描区间的索引列与排序列不同

先上代码,咱再解释

(explain) select id, key1, key2 from single_table where key1 < 'e' order by key2 desc;

该语句形成的扫描区间是key < 'e',需要用到的索引是key1列的idx_key1,并不会用到key2列的索引uk_key2进行排序

分析结果如下

排序列不是以单独的列名出现在order by语句中

代码哥哥!

(explain) select id, key1, key2 from single_table order by upper(key1);

我们可以发现,在排序列中使用了函数upper(),所以排序时不会用到idx_key1索引

分析结果如下哎哎哎,我可是讲完这节课了,数数一共几种情况啊?

“五种!五种!”

行,那还不错,喝口水咱接着看!

4. 在查询时用不到索引的重头戏

1.mysql认为使用索引相比于全表扫描更慢,则不使用索引

这种情况非常简单,我一说大家就懂,写条代码

explain select * from single_table where key2 > 1;

这条代码,我们可能以为它会使用到idx_key2索引,其实不然,它采用的是全表扫描,看分析结果

2.如果查询条件中用使用了or,即便其中某一列含有索引也不会用到

这个在网上查阅的资料,大多会说:用or分隔开的条件,如果or前的条件中的列有索引,而后面的列没有索引,那么涉及到的索引都不会被用到 但是事实上,并不受在or前后的影响,看如下两条语句

explain select * from single_table where id < 5 or common_field < 'f';

分析结果为all,全表扫描我们把or前后的条件换一下再试

explain select * from single_table where common_field < 'f' or id < 5;

仍然为全表扫描,所以索引列在or前后并无影响,都不走索引(特殊情况Union索引合并会用到索引)

3.对于联合索引,如果没用使用索引的第一部分,则不使用索引

简单,上了代码就能看明白

explain select * from single_table where key_part2 = 'e';

联合索引的第一部分为 key_part1,因为没有使用到,所以不会用到联合索引,对照如下分析结果

4.若模糊查询以%开头,不使用索引(太简单,记住就行)5.如果列为字符串,则where条件中的字符常量必须加引号,否则用不到索引

我们写两个代码对比一下就知道了

explain select * from single_table where key3 = 1;

没加引号的,分析结果如下,全表扫描我们给常量加上引号再写一个

explain select * from single_table where key3 = '1';

这下分析结果中,就显示用引号了

okk,同学们,这节课就上到这,我们下次见!

文末彩蛋

最近读完了《干法》,一本儿也算不错的书。

刚开始读这本书的时候,觉得作者好像一个固执的“傻”老头,对自己要求及其严苛,凡事都要尽善尽美,而且专干没人干的事儿(不走寻常路),同样,他对自己的员工也要求极高,连桌上的文件都要放的与桌子边齐平,万事都不能马虎

其实读到这里的时候,我觉得这本书已经没有这么吸引我了,好像与市面儿上的自我激励的书没什么两样

不过文末穿插了一篇老先生在杭州的一篇演讲,给我留下了及其深刻的印象,先前心里留下的成见可以说一下就打消了

老先生讲了自己的故事、事业和行事的态度,可以感觉到老先生是一个非常非常真诚的人,而且其中有一段话令我印象深刻,我写在下面

付出以笔舌难以道尽的辛劳,勤奋努力、拼命奋斗、守护公司、守护员工、守护社会,感觉到自己在做这些好事的时候,我们经营者同时也能感到喜悦和快乐,我认为,感觉到这种喜悦和快乐就是我们经营者最大的幸福

他的出发点并不是为自己谋求最大的利益,而是心系家人、员工和社会,认为自己有极大的责任要为员工的幸福和社会的发展负责,这一点就很触动我,而且他讲到日后创办的企业,他并不持有股份,也是做到了他的知行合一。

虽然稻盛的行为准则,作为一个普通人难以企及,但是他带给我的触动更能让我想做一个踏实、肯干的人,耐心的往下走,不着急,慢慢来,也许只有那些真正做到稻盛要求的那些准则的人,才能对他说的话有更深的理解吧...

祝大家生活愉快!

查询排序_Mysql在排序和查询时不使用索引的情况相关推荐

  1. 使用mysql内连接查询年龄_Mysql的连表查询

    若一个查询同时涉及到两个以上的表,称为连表查询 准备表 create table department( id int auto_increment PRIMARY KEY, name varchar ...

  2. go mysql 查询数据_MySQL常用语句之查询数据-Go语言中文社区

    简单查询: select [distinct] *| {字段名1,字段名2,字段名3, ...} from 表名 [where 条件表达式1] [group by 字段名 [having 条件表达式2 ...

  3. mysql数据库高级查询笔记_MySQL数据库基础——高级查询

    MySQL数据库入门--day08 高级查询 一.聚合函数: 在实际开发过程中经常需要对数据进行统计,为此MySQL中提供了一些函数来实现某些功能如下表所示: 聚合函数 1.COUNT()函数: CO ...

  4. mysql select查询字段_MySQL基础:SELECT查询语句

    Blog:博客园 个人 概述 SELECT语句用于从表中选取/查询数据,结果被存储在一个结果表中(称为结果集). 语法格式 SELECT [ALL | DISTINCT | DISTINCTROW ] ...

  5. mysql 分页查询分析_mysql 大表分页查询测试分析优化

    http://blog.csdn.net/xluren/article/details/32746183 http://www.cnblogs.com/kupig/archive/2011/10/19 ...

  6. mysql 伪表查询语句_MySQL数据库之select查询语句

    select查询语句 语法 select [选项] 列名 [from 表名] [where 条件] [group by 分组] [order by 排序][having 条件] [limit 限制] ...

  7. mysql 多表查询 优化_Mysql 多表联合查询效率分析及优化

    1. 多表连接类型 1. 笛卡尔积(交叉连接)在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: SELECT * FROM table1 CROSS JOI ...

  8. mysql 嵌套查询性能_MySQL数据库之嵌套查询与连接查询的性能详解

    本文主要向大家介绍了MySQL数据库之嵌套查询与连接查询的性能详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 嵌套查询与连接查询的性能:连接查询一般较快:子查询很难被优化. ...

  9. mysql 指定数字排序_Mysql数据排序

    排序数据 普通字段排序 按照单一字段排序 按照多个字段排序 手动指定排序顺序 单个字段手动排序 多个字段手动排序 普通字段排序 按照单一字段排序 排序采用order by子句,order by后面跟上 ...

最新文章

  1. String spilt时转义特殊字符【转】
  2. 在医学图像分析中使用ICP算法进行点云配准
  3. 保护了无数医护人员的N95口罩,原来是华裔科学家和一位学生共同发明的!
  4. 20165206 2017-2018-2 《Java程序设计》第三周学习总结
  5. 《Deep Learning With Python second edition》英文版读书笔记:第十一章DL for text: NLP、Transformer、Seq2Seq
  6. Codeforce 189B——Counting Rhombi
  7. Python+Selenium练习篇之2-利用ID定位元素
  8. CSS图片布局 flex(竖着的几张图片改为一排)
  9. PDMS二次开发(十二)——螺栓材料统计功能一批bug修复之后再次用sample项目进行验证
  10. 射频可编程数字信号发生器的三大特点
  11. 【3-hexo】为啥我又搭建了一个博客?【服务器自建博客】
  12. Python面向对象版学员管理系统(附源码)
  13. DeFi 2.0的LaaS协议Elephant,或许是你熊市下为数不多的获利手段
  14. 序设计思维与实践 CSP-M4
  15. WPA3功能开发及验证
  16. D435i运行VINS
  17. 六十分之十三——黎明前
  18. 《乔布斯传》圈点(4)
  19. selenium中使用Microsoft Edge浏览器驱动下载
  20. 2022年全球市场外科手术引流设备总体规模、主要生产商、主要地区、产品和应用细分研究报告

热门文章

  1. 用python爬网站评论_python爬取携程景点评论信息
  2. 你真的会读datasheet吗?
  3. HLS_error implicit instantiation of undefined template ‘ssdm_int
  4. n个点组成多少个三角形Java,农田开发 NOJ (已知N个点选取3个求最大三角形面积问题)...
  5. vb.net 如何文件指定打印机打印文件_使用Dropbox文件请求配合Canon Inkjet实现多用户文件打印...
  6. 怎么读取mysql库绘制柱状图_从数据库中取出最近三十天的数据并生成柱状图
  7. php伪静态url运用,再谈 THINKPHP 伪静态url(URL访问模式)的设置
  8. autocad .net开发指南_就业指南||职路明灯(二十)
  9. PIC16F877矩阵键盘的识别
  10. [CocoaPods]常见问题