1. 普通青年的索引使用方式

假设我们有一个用户表 tb_user,内容如下:

name age sex
jack 22
rose 21
tom 20
... ... ...

执行SQL语句:

SELECT name FROM tb_user WHERE age = 20;

默认情况下,MySQL需要遍历整张表,才能找到符合条件的记录。如果在age字段上建立索引,那么MySQL可以很快找到所有符合条件的记录(索引本身通过B+树实现,查起来很快。简单起见,想象一下二分查找和遍历查找的区别。)

2. 文艺青年的玩法

2.1 用冗余的联合索引加速查询

接着上面的例子,我们假设,tb_user表有一百万行,通常情况下,"WHERE age = 20"这样的语句,会返回几万行数据,实际测试下发现,速度不够快。

原因是,MySQL根据索引查询到符合条件的记录后,还需要到表空间里一一查找这些记录(实际上,索引里同时记录了age字段和关联记录的物理行号),这意味着,MySQL必须读取表空间多达几万次,才能返回最终结果。

聪明的你可能已经想到了,如果age字段的索引上有name字段的值话,MySQL就不用再费事地去访问表空间了。

最终解决方案:建立联合索引,让MySQL直接从索引中取出name字段的值

KEY `age_with_name` (`age`,`name`)

注意这里的顺序,必须是先age后name,反之不行(除非你是根据name查age)。

2.2 用冗余的联合索引加速排序

依然是之前的表,假设要做这样的查询:

SELECT * FROM tb_user ORDER BY age;

因为我们在age上有索引,所以排序是很快的(索引的本质就是将表记录的物理行号按照特定规则排序)

实际项目中,SQL可能比这个复杂些,比如:

SELECT * FROM tb_user WHERE sex='男' ORDER BY age;

这个时候,age字段上的索引就派不上用场了。因为,age索引是面向整个表的,筛选后的表和age索引是对不上的。

解决方案:依然是联合索引!

KEY `age_with_name` (`sex`,`age`)

这个联合索引,同时记录了sex和age,并且排序的规则是,先按sex排,sex相同时按age排。那么,通过"WHERE sex='男'",MySQL先对索引进行筛选,然后剩下的索引正好就是按照age排序的了。因此,整个SQL的排序速度依然很快。

最后,附上MySQL性能优化系列的全部链接:

最新文章

  1. G:首页调用“图片视频”的分类和文章(难点)
  2. 安卓中的Model-View-Presenter模式介绍
  3. BestCoder Round #89 Fxx and string
  4. java.lang.UnsatisfiedLinkError: C:\apache-tomcat-8.0.21\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
  5. Delphi FindowWindow,FindowWindowEx
  6. SQL SERVER完整、差异和事务日志备份及还原(脚本和GUI实现) [原创]
  7. hihoCoder 1385 A Simple Job
  8. iOS 8创建交互式通知
  9. MFC 设置窗口背景图片
  10. 在linux下读取bmp文件头的完整代码。
  11. spring实现文件上传(图片解析)
  12. 那些在django开发中遇到的坑
  13. 在angular 6中使用 less
  14. 二叉搜索树BST
  15. [LeetCode&Python] Problem 429. N-ary Tree Level Order Traversal
  16. Flex4学习笔记 checkBox RadioButton DropDownList colorPicker
  17. Scala学习(三)----数组相关操作
  18. 2、Arx二次开发创建第一个应用程序
  19. thinkCMF----自定义配置调用
  20. TypeScript安装

热门文章

  1. JS原生第三篇 (帅哥)
  2. Linux下的磁盘分割和文件系统
  3. [JSP]自定义标签库taglib
  4. SSM项目搭建(提供源码)
  5. Bootstrap 4-alpha 初体验
  6. JQuery的核心的一些方法[扒来的]
  7. visual studio 编辑窗口 设置固定选项卡 使窗口选项卡多行显示
  8. Elastic学习第一天遇到的问题以及添加的一些操作
  9. 《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项
  10. linux(六)__进程与任务控制