Mysql高性能的秘密 - 深入理解索引
2021-12-01 15:17
736 查看
Mysql索引
引言
众所周知,Mysql的高性能与索引有着密不可分的关系:
- 正确的创建和使用索引是实现高性能查询的基础。
- 索引是对查询性能优化最有效的手段。
那么正确创建和使用索引的姿势什么样的呢,以及如何优化查询性能呢,本文将进行系统性讲解。
一、创建高性能的索引
1.1 索引类型
B-Tree
特点 所有值按顺序存放。- 每一个叶子页到根的距离相同
- 叶子节点保存了指向数据的指针
- 叶子节点与叶子节点通过指针链接,方便范围查询
- 树的深度与表的大小直接相关
- 索引对多个列排序的依据是,create table语句中定义索引时列的顺序
-
全值匹配
-
注意:跳列无效,只能匹配第一列
-
又叫“覆盖索引”
-
注意:此时范围查询右边的列无法使用索引
-
如果范围查询列值有限,可以通过使用多个等于条件代替范围条件,以提高效率。
Hash index
-
特点
基于哈希表实现,只有精确匹配索引所有列的查询才有效。
-
Memory引擎表的默认存储引擎
与众不同的是,Memory支持非唯一的哈希索引,如果哈希码相同,索引会以列表方式存放多个记录指针到同一个哈希条目中。
-
当某些索引使用很频繁时,会在内存中基于B-Tree索引之上在创建一个哈希索引。
-
如果存储引擎不支持哈希索引,则可以创建自定义哈希索引
R-Tree空间索引
-
MyISAM
全文索引
1.2 索引的优点
索引有以下几个方面的好吃:
1.因为索引可以快速定位到表中指定位置,故大大减少了服务器需要扫描的数据量。《Relational Database Index Design and the Optimizers》--作者:Leach/Lahdenmaki
“三星系统”:
-
衡量一个索引是否适合某个查询
1.索引将相关记录放在一起(数据页),则获得一星
索引的限制:
-
只有索引的好处大于其带来的额外工作时,索引再有必要。
1.对于非常小的表,简单的全表扫描更高校。
1.3 高性能的索引策略
1.必须是“独立的列”,否则不会使用索引
如果是表达式中的一部分,则不是独立的列。2.前缀索引
-
概念:有时候索引很长的字符列会让索引变得大且满。通常可以索引开始的部分字符,在提高效率的同时可大大节约索引空间。
3.多列索引
-
反面教材:在所有字段上创建单列索引
5.0版本前:性能不如全表扫描
4.选择合适的索引列顺序
-
1.正确的索引顺序依赖于使用该索引的查询的顺序,并且需要同时考虑如何更好的满足排序和分组的需要。
5.clustered聚簇索引
-
并不是一种单独的索引类型,而是一种数据存储方式。
-
InnoDB通过主键聚集数据,即在主键上建立聚簇索引。如果没有定义主键,则会选择一个唯一的非空索引代替,如果没有这样的索引,则会隐式的定一个主键来作为聚簇索引。
-
减少了磁盘I/O:将相关数据保存在了一起,仅需查询少量数据页,减少了磁盘I/O。
-
插入速度严重依赖于插入顺序:按照主键的顺序插入是最快的方式。
-
第一次查找到主键值。第二次根据主键值查询聚簇索引!
6.覆盖索引
-
如果一个索引包含(或覆盖)所有查询需要的字段的值,就成为覆盖索引。
7.使用索引扫描来做排序
-
Mysql有两种方式可以生成有序的结果,通过排序操作;或者按照索引顺序扫描。
8.压缩索引(前缀压缩)
-
MyISAM使用前缀压缩来减少索引大小,从而让更多索引可以放入到内存中,在某些情况下能极大提高性能。
默认只压缩字符串,可通过参数设置调整。
-
eg:索引块中的第一个值为“perform”,第二个值为“performance”,压缩后的存储是为“7,ance”这种形式。
9.冗余和重复索引
-
重复索引是指在相同的列上,按照相同的顺序,创建相同类型的索引。
应避免,发现后应该立即移除。
10.索引和列
-
InnoDB只有在访问行的时候才会对其加锁,而索引能减少InnoDB访问的行数,从而减少锁的数量。
1.4 拓展:
-
【InnoDB和MyISAM的数据分别对比】
1.5 最佳实践
创建索引时,一需要考虑列的可选择行(高的),二考虑列的使用频率。
设计索引时,不仅只为现有查询考虑需要哪些索引,还要考虑对查询进行优化。应该同时优化查询和索引以找到最佳的平衡,而不是闭门造车设计最完美的索引。
为了是查询走索引,可以使用IN()语法强制查询走索引。
但是IN()也不能滥用,因为每额外增加一个IN条件,优化器需要做的组合都是以指数形式增加,最终可能会极大的降低查询性能。尽可能将需要做范围查询的列放在索引的后面,以便优化器能尽可能多的使用索引列。
避免多个范围条件:对于范围条件查询,Mysql无法在使用范围列后面的其他索引列了,但是对于“多个等值条件查询”则没有这个限制。
二、查询性能优化
待续
相关文章推荐
- 深入理解Mysql——高性能索引与高性能SQL
- 深入理解Mysql——索引底层数据结构与算法
- MySQL索引的深入理解
- 深入理解MySQL的索引(二)
- MySQL 深入理解索引B+树存储 (二)
- 深入理解MYSQL索引之B+TREE
- mysql索引深入理解
- Mysql索引深入理解
- 理解MySQL——索引与优化
- 统计、案例-深入理解Oracle索引(10):索引列字符类型统计信息的32位限制-by小雨
- 理解MySQL——索引与优化
- 理解MySQL——索引与优化
- 关于mysql索引的一些理解
- 理解MySQL――索引与优化
- 深入理解 MySQL 底层实现
- 【数据库】mysql深入理解乐观锁与悲观锁
- 高性能的MySQL(5)索引策略-覆盖索引与索引排序
- MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询
- 深入理解Oracle索引(22):索引和NULL 协同合作互惠共赢
- 高性能的MySQL(5)索引策略-索引和表的维护