联合索引避免临时表排序

在上一篇笔记(MySQL——order by逻辑(全字段排序与rowid排序))中,讲到查询语句查询多个字段的时候使用order by语句实现返回值是有序的,而order by是使用到了临时表的,会带来时间和空间损失。
其实使用联合索引,就可以避免临时表的排序操作。
只要保证city这个索引上取出来的行天然就是按照name递增排序的话,就可以不用再排序了。

alter table t add index city_user(city,name);

在这个索引里面,通过树搜索的方式定位到第一个满足city = '杭州’的记录,并且额外确保了,接下来按顺序取“下一条记录”的遍历过程中,只要city值是杭州,name值一定有序。
查询流程变为:
1、从索引(city,name)找到第一个满足city = '杭州’条件的主键id;
2、到主键id索引取出整行,取name、city、age三个字段值,作为结果集的一部分直接返回
3、从索引(city,name)取下一个记录主键id;
4、重复step2、3直到查到第1000条记录,或者不满足city = '杭州’条件时循环结束。

覆盖索引优化查询

可以使用覆盖索引继续优化查询的执行流程:
覆盖索引指,索引上的信息足够满足查询请求,不需要再回到主键索引上取数据。
针对select city,name,age from t 这个查询,可以创建一个city、name和age的联合索引,对应语句为:

alter table t add index city_user_age(city,name,age);

这时,对于city字段的值相同的行来说,还是按照name字段的值递增排序。查询语句的执行流程变为:
1、从索引(city,name,age)找到第一个满足city = '杭州’条件的记录,取出其中的city、name和age三个字段值,作为结果集的一部分直接返回
2、从索引(city,name,age)取下一个记录,同样取出这三个字段的值,作为结果集的一部分直接返回
3、重复步骤2,直到查到第1000条记录,或者是不满足city = '杭州’条件时循环结束。

当然,并不是说每个查询能用上覆盖索引,就要把语句中涉及的字段都建上联合索引。因为索引有维护代价。

思考

假设表里面已经有了city_name(city,name)联合索引。你需要查询杭州和苏州两个城市中所有市民的名字,并且按名字排序,显示前100条记录。

select * from t where city in('杭州','苏州') order by name limit 100;

这个语句会有排序。因为条件是苏州或杭州。如果只有一个条件如只有杭州,那么就不需要排序操作。
如果我们需要实现一个在数据库端不需要排序的方案,可以这么实现:
把这一条语句拆成两条语句,流程如下:
1、执行select * from t where city = '杭州' order by name limit 100;
(这个语句不需要排序,客户端用一个长度为100的内存数组A保存结果)
2、执行select * from where city = '苏州' order by name limit 100;
(相同的方法,结果被存入内存数组B)
3、对AB两个有序数组采用归并排序,得到name最小的前100值,这就是我们需要的结果了。

《MySQL——使用联合索引、覆盖索引,避免临时表的排序操作》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. 简单搭建zookeeper集群分布式/伪分布式
  2. centos下rmp包离线下载
  3. IDEA中创建类时,自动在文件头中添加作者以及创建时间
  4. d3.js中的选择元素
  5. 【PAT甲级 - 1028】List Sorting (25分)(模拟,排序)
  6. 我的AI之路 —— 从裸机搭建GPU版本的深度学习环境
  7. 解决sqlalchemy连接mysql报错ModuleNotFoundError: No module named ‘pymysql‘
  8. Docker学习文档之三 其他相关-Dockerfile指令
  9. 小米9疑似入网工信部 官宣暗示发布时间
  10. 《零边际成本社会》书中的精髓:零边际成本所引发的共享经济,将颠覆资本主义和社会主义。
  11. Android编程 不显示菜单,网易MuMu模拟器不显示Menu(菜单)键的解决办法
  12. 阴阳师服务器维护内容,阴阳师8月1日维护内容介绍_友人帐弈鬼切内容介绍_3DM手游...
  13. MySQL 是如何保证一致性、原子性和持久性的
  14. 2020测试工具索引
  15. 【机器学习】显卡、GPU、NVIDIA、CUDA、cuDNN
  16. 用python编写AutoCAD插件日志
  17. 用html css JavaScript写一个功能全面的王者荣耀轮播图 (仿淘宝京东轮播图)通俗易懂
  18. 《网络安全》零基础教程-适合小白科普
  19. 关闭win10自动更新——组策略
  20. 【蓝桥杯——单片机学习笔记】五.数码管显示(STC15F2K60S2)

热门文章

  1. mysql 触发器示例_MySQL触发器示例
  2. 通过url,获取html内容,并解析,如何使用 JavaScript 解析 URL
  3. java跳转_java servlet 几种页面跳转的方法
  4. ps怎么对比原图快捷键_PS教程:P图前后,你还能认出这是同一个人吗?
  5. 深入理解JavaScript之Event Loop
  6. hdu-1728(贪心bfs的灵活运用吧)
  7. [折半搜索][has] Jzoj P4250 路径
  8. 深入c#的string类
  9. node源码详解(五)
  10. CentOS 7安装redis及php扩展