高性能MySQL-3rd-(五)创建高性能索引
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-(五)创建高性能索引相关推荐
- 高性能mysql看不懂_高性能mysql笔记1
转载请注明:TheViper http://www.cnblogs.com/TheViper <>这本书写的真的很好,只可惜本屌不才,大部分都看不懂,暂且记下与mysql优化有关,对自己有 ...
- 高性能mysql总结笔记_高性能MySQL第三本笔记总结(上)
无论何时,只要有多个查询需要在同一个时刻修改数据时,就会有并发问题.MySql主要在服务器层与存储引擎层进行并发控制. 假设数据库中国一张邮箱表,每个邮件都是一条记录.如果某个客户正在读取邮箱,同时其 ...
- 高性能mysql 小查询_高性能MySQL06-查询优化(慢查询)
一.分析原因 SQL语句慢查询的原因有多种,如: 1)数据方面: 需要查询的表数据量太大导致性能下降: 是否向数据库请求了不需要的数据行或数据列: MySQL是否在扫描额外的记录 2)SQL语句太过于 ...
- mysql能不能创建位图索引_MySQL位图索引解决用户画像问题(简化创建流程)
基于前文,创建索引的时候有一个问题 每个bigint类型包括60个记录的位信息. 但是第0位表示第六十个记录的位 第1位至第59位表示第一至五十九的记录的位信息. 这样记录的位信息保存并不连续, 使用 ...
- 高性能mysql 小查询_高性能MySql进化论(十一):常见查询语句的优化
总结一下常见查询语句的优化方式 1 COUNT 1. COUNT的作用 · COUNT(table.filed)统计的该字段非空值的记录行数 · ...
- MySQL常见的创建索引的方式
一.创建表时创建索引 1. 创建普通索引 create table book ( book_id int, book_name varchar(100), AUTHORS va ...
- 【MySQL优化(六)】InnoDB索引优化与索引规约
序 上一篇讲解了建表规范后,本章重点分析下创建索引的一些规范 由于索引是工作在存储引擎层,所以以下规约都是基于InnoDB引擎 题外话 在满足语句需求的情况下, 尽量少地访问/消耗资源是数据库设计的重 ...
- mysql 8.0空间索引_牛逼!MySQL 8.0 中的索引可以隐藏了…
MySQL 8.0 虽然发布很久了,但可能大家都停留在 5.7.x,甚至更老,其实 MySQL 8.0 新增了许多重磅新特性,比如栈长今天要介绍的 "隐藏索引" 或者 " ...
- mysql第五章项目二_高性能MySQL笔记 第5章 创建高性能的索引
索引(index),在MySQL中也被叫做键(key),是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化最有效的手段. 5.1 索引基础 索引的类型 索引是在存储引擎层而不是服务器层 ...
- 高性能MySQL读书摘要(五)创建高性能的索引
索引优化应该是最有效的优化手段了."最优"的索引有时比一个"好的"索引性能要好两个数量级.创建一个真正的"最优"的索引经常需要重写查询,所以 ...
最新文章
- deepin tim(wine)无法安装_利用HyperV虚拟机,如何在Win10上安装Deepin国产操作系统?深度好文!...
- Google和网易有道合作开课了
- oracle批量更新数据从另一表_常用SQL系列之(五):多表和禁止插入、批量与特殊更新等...
- 天才基本法_强推|高人气合集狙击蝴蝶天才基本法春日玛格丽特难哄
- Qt 模态对话框不模态的问题
- Linux用户登出之后保持后台进程(nohup)
- 28天肝完阿里面试通关宝典,含答案解析
- 易语言教你制作onoQQ机器人
- Windows系统与虚拟机共享文件夹,映射的磁盘显示“信号灯超时”
- 人月神话札记:未雨绸缪
- 龙果学院Elasticsearch顶尖高手系列-高手进阶篇完整版
- python四则运算表达式,用Python自动生成小学四则运算题目2.0版
- 设计模式——工厂方法模式
- 加载java ie停止工作_IE报错“Internet Explorer 已停止工作”的解决方法
- 计算二叉树中各结点的最大元素的值
- 260. 只出现一次的数字 III【我亦无他唯手熟尔】
- scratch小猫钓鱼 电子学会图形化编程scratch等级考试四级真题和答案解析2021-9
- paper weekly_Java Weekly 24/15:JCache,Hibernate OGM,微服务
- 「硬见小百科」电子器件封装缺陷和失效的形式
- 游戏服务器为什么老被攻击?被攻击了的一些常见的处理方法
热门文章
- WebSocket 解决javascript跨域问题一剂良药
- webpack 运行提示“The ‘mode‘ option has not been set”的原因和解决方法
- Eclipse中Errors occurred during the build最简单的解决方法
- 解决xshell6评估过期,需采购问题
- 如何基于列值从DataFrame中选择行?
- idea安装配置tomcat
- win11应用商店怎么联网 Windows11应用商店无法联网的解决步骤
- JDBC的API与德鲁伊Druid连接池配置
- 全向轮机器人特性分析
- 问答| 为什么四轮驱动机器人(SSMR)的质心(COM)没有横向分速度vy呢?