2019独角兽企业重金招聘Python工程师标准>>>

 /* *  --------------------------------------------------------        *     高性能MySQL-3rd-Baron Schwartz-笔记         *     第五章 创建高性能的索引*/  --------------------------------------------------------


    5.1 索引基础

简单讲,索引就是书籍后面的“索引”-Index,帮助我们找到特定主题、词语,然后告诉我们具体对应的页码。在MySQL中存储引擎用类似的方法使用索引,先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行。

简单例子: select name from actor where actor_id=5; 前提:actor_id 列上建有索引。MySQL 将使用在该列上创建的索引找到 actor_id 为 5 的行,按值在索引上查找,然后返回包含该值(5)的数据行。

像上面的例子,一般可能直接被认为 actor 表以 actor_id 一个列为索引,但正如大多数人做的那样,一个表的索引可能还会包含一个以上的列(多个列)的值。如果是多个列,那么顺序很重要,因为MySQL只能高效利用 最左前缀列。另外,创建一个包含两个列的索引,和创建两个只包含一个列的索引是大不相同的,未来解释。

无论多么复杂的ORM工具,在精妙和复杂的索引面前都是浮云!

索引有很多类型,索引在存储引擎层实现,不在服务器层,因此不同存储引擎、不同索引类型的底层实现都不相同。基本类型包括B-Tree索引、哈希索引、空间数据索引(R-Tree)、全文索引等。

==================== B-Tree索引 ==============

上面的表中,姓(last_name)、名(first_name)、出生日期(dob)为索引(key),图上为这三个列组成的索引的数据组织形式,其中 last_name (姓)是最左前缀,参考链接《最左前缀原则(博文)》

B-Tree索引适用于全值匹配(索引中所有列匹配,Allen、Cuba、1960-01-01)、匹配最左前缀(索引的前缀列,只使用索引第一列,姓 Allen)、匹配列前缀(索引列的前缀,姓列前缀,查 All开头的姓)、匹配范围值(查找 A字母~B字母开头的姓)、精确匹配某一列并范围匹配另外一列(姓列精确匹配=Allen,名称列范围,以K字母开头的名)、只访问索引的查询(不访问数据行,叫“覆盖索引”,未来解释)。

B-Tree以上查找原则,也使用于 ORDER BY 排序字段,能查找就能排序。

B-Tree有些傻乎乎,像人一样固执得狠!不能跳过最左前缀(last_name),只查满足名字和生日的不行;也不能跳过中间列,只查满足姓和生日的不行;如果中间列有范围查询,则居其右边的列优化用不上,例如:WHERE last_name='Smith' AND first_name LIKE 'J%' dob='1976-12-23',dob的优化用不上,因为 first_name 是个范围查询。

由上可以看出 B-Tree索引列的顺序多么多么的重要,在优化时,需要创建相同的多个列但顺序不同的索引,来满足不同的需求,如:key1(last_name, first_name, dob),key1(first_name, last_name, dob), key1( dob, first_name, last_name)

==================== 哈希索引  ==============

哈希索引,仅用于精确匹配,仅存在于Memory引擎,每行数据都计算一个哈希码(hash code),MySQL接收查询命令后,如:select last_name from People where first_name='Peter' ,先计算 Peter 的哈希值,然后用该哈希值找到记录数据行的指针,通过指针找到数据行,然后判断找到的数据是否为Peter,如果是返回数据。

哈希索引,特点结构紧凑,速度快。

伪哈希索引,因为哈希索引只在 Memory中存在,所以可以参考书中自行在其他引擎中创建伪哈希索引,效果不错,但注意哈希值冲突的解决。

==================== 空间数据索引(R-Tree)  ==============

MyISAM支持空间数据索引,可以用作地理数据存储。但MySQL做得不好,很少使用。

==================== 全文索引  ==============

全文索引,查找的是文本中的关键词,而不是直接比较索引中的值,与其他索引完全不同,不是简单的 WHERE 匹配,而更像搜索引擎做的事情,适用于 MATCH AGAINST 操作。

全文索引,详细见第七章。

===========================================================

   5.2 索引优点

索引优点,大大减少了服务器需要扫描的数据量(快速定位);

索引优点,可以帮助服务器避免排序和临时表(顺序存储,便于ORDER BY、GROUP BY);

索引优点,将随机I/O,变为顺序I/O。

索引辩证法,小表,全表扫描更高效;中大表,索引高效;超大表,索引代价高,可以使用分区技术,见第7章。

===========================================================

   5.3 高性能索引策略

1)将索引列要独立,放在比较符号的一侧,例如 select * from actor where actor_id + 1 = 5; 应写为 select * from actor where actor_id = 4;

2)前缀索引,一般对BLOB、TEXT、很长的VARCHAR使用,需要保证索引的选择性要高,就是索引的值的数量和记录的总数尽量持平,一般的自增id作为索引基本上选择性=1,不会重复。使用前缀索引要先预估选择性的值,书中有实例。

3)多列索引,在多个列上单独建立索引多数情况下不能提高效率,特别对于AND、OR操作,OR操作更浪费。

4)选择合适的索引列顺序,将选择性最高的列放最左,但只是经验做法。

5) 聚簇索引

6)覆盖索引

7)使用索引扫描来做排序!(很重要!!!)

MySQL通过两种方式生成有序结果:通过排序操作,或,按索引顺序扫描。当 Explain的结果中 type 为 index,就说明MySQL用了索引扫描来做排序了!

扫描索引是很快了的,但如果索引没有能覆盖查询中所需的全部列,那就不得不每扫描一条索引记录就回表查询一次对应的行(自问:为什么?:-))这基本就是随机I/O了,慢,慢!

设计时,一定要注意,如果有一条索引(可能多个列),既能满足查找,又能满足排序,那就好了。

参考资料:mysql explain

转载于:https://my.oschina.net/zhmsong/blog/193406

高性能MySQL-3rd-(五)创建高性能索引相关推荐

  1. 高性能mysql看不懂_高性能mysql笔记1

    转载请注明:TheViper http://www.cnblogs.com/TheViper <>这本书写的真的很好,只可惜本屌不才,大部分都看不懂,暂且记下与mysql优化有关,对自己有 ...

  2. 高性能mysql总结笔记_高性能MySQL第三本笔记总结(上)

    无论何时,只要有多个查询需要在同一个时刻修改数据时,就会有并发问题.MySql主要在服务器层与存储引擎层进行并发控制. 假设数据库中国一张邮箱表,每个邮件都是一条记录.如果某个客户正在读取邮箱,同时其 ...

  3. 高性能mysql 小查询_高性能MySQL06-查询优化(慢查询)

    一.分析原因 SQL语句慢查询的原因有多种,如: 1)数据方面: 需要查询的表数据量太大导致性能下降: 是否向数据库请求了不需要的数据行或数据列: MySQL是否在扫描额外的记录 2)SQL语句太过于 ...

  4. mysql能不能创建位图索引_MySQL位图索引解决用户画像问题(简化创建流程)

    基于前文,创建索引的时候有一个问题 每个bigint类型包括60个记录的位信息. 但是第0位表示第六十个记录的位 第1位至第59位表示第一至五十九的记录的位信息. 这样记录的位信息保存并不连续, 使用 ...

  5. 高性能mysql 小查询_高性能MySql进化论(十一):常见查询语句的优化

    总结一下常见查询语句的优化方式 1        COUNT 1.       COUNT的作用 ·        COUNT(table.filed)统计的该字段非空值的记录行数 ·         ...

  6. MySQL常见的创建索引的方式

    一.创建表时创建索引 1. 创建普通索引 create table book (     book_id int,     book_name varchar(100),     AUTHORS va ...

  7. 【MySQL优化(六)】InnoDB索引优化与索引规约

    序 上一篇讲解了建表规范后,本章重点分析下创建索引的一些规范 由于索引是工作在存储引擎层,所以以下规约都是基于InnoDB引擎 题外话 在满足语句需求的情况下, 尽量少地访问/消耗资源是数据库设计的重 ...

  8. mysql 8.0空间索引_牛逼!MySQL 8.0 中的索引可以隐藏了…

    MySQL 8.0 虽然发布很久了,但可能大家都停留在 5.7.x,甚至更老,其实 MySQL 8.0 新增了许多重磅新特性,比如栈长今天要介绍的 "隐藏索引" 或者 " ...

  9. mysql第五章项目二_高性能MySQL笔记 第5章 创建高性能的索引

    索引(index),在MySQL中也被叫做键(key),是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化最有效的手段. 5.1 索引基础 索引的类型 索引是在存储引擎层而不是服务器层 ...

  10. 高性能MySQL读书摘要(五)创建高性能的索引

    索引优化应该是最有效的优化手段了."最优"的索引有时比一个"好的"索引性能要好两个数量级.创建一个真正的"最优"的索引经常需要重写查询,所以 ...

最新文章

  1. deepin tim(wine)无法安装_利用HyperV虚拟机,如何在Win10上安装Deepin国产操作系统?深度好文!...
  2. Google和网易有道合作开课了
  3. oracle批量更新数据从另一表_常用SQL系列之(五):多表和禁止插入、批量与特殊更新等...
  4. 天才基本法_强推|高人气合集狙击蝴蝶天才基本法春日玛格丽特难哄
  5. Qt 模态对话框不模态的问题
  6. Linux用户登出之后保持后台进程(nohup)
  7. 28天肝完阿里面试通关宝典,含答案解析
  8. 易语言教你制作onoQQ机器人
  9. Windows系统与虚拟机共享文件夹,映射的磁盘显示“信号灯超时”
  10. 人月神话札记:未雨绸缪
  11. 龙果学院Elasticsearch顶尖高手系列-高手进阶篇完整版
  12. python四则运算表达式,用Python自动生成小学四则运算题目2.0版
  13. 设计模式——工厂方法模式
  14. 加载java ie停止工作_IE报错“Internet Explorer 已停止工作”的解决方法
  15. 计算二叉树中各结点的最大元素的值
  16. 260. 只出现一次的数字 III【我亦无他唯手熟尔】
  17. scratch小猫钓鱼 电子学会图形化编程scratch等级考试四级真题和答案解析2021-9
  18. paper weekly_Java Weekly 24/15:JCache,Hibernate OGM,微服务
  19. 「硬见小百科」电子器件封装缺陷和失效的形式
  20. 游戏服务器为什么老被攻击?被攻击了的一些常见的处理方法

热门文章

  1. WebSocket 解决javascript跨域问题一剂良药
  2. webpack 运行提示“The ‘mode‘ option has not been set”的原因和解决方法
  3. Eclipse中Errors occurred during the build最简单的解决方法
  4. 解决xshell6评估过期,需采购问题
  5. 如何基于列值从DataFrame中选择行?
  6. idea安装配置tomcat
  7. win11应用商店怎么联网 Windows11应用商店无法联网的解决步骤
  8. JDBC的API与德鲁伊Druid连接池配置
  9. 全向轮机器人特性分析
  10. 问答| 为什么四轮驱动机器人(SSMR)的质心(COM)没有横向分速度vy呢?