SlideShare a Scribd company logo
1 of 30
索引介绍
Platform - DBA - 程庆顺
Skype:shunzi_bj
Email:qingshun@douban.com
2015.04.03
1 什么是索引
2 Tree
3 MySQL索引结构
4 索引原则
5 索引优化
OUTLINE
 为什么B+Tree比B-Tree更适合数据库的索引结构?
 为什么单调递增字段(如:AUTO_INCREMENT)比非单调字段
作为InnoDB的主键更好?
 为什么可选择性高的字段创建索引效率更高?
 InnoDB和MyISAM的索引结构有什么异同?
 InnoDB的主键和辅助索引的关系是什么?
 InnoDB中为什么不建议过长的字段作为主键?
 索引都有哪些类型?常用的有哪些?
 什么是索引的最左前缀和可选择性?
 为什么查询要遵循索引的最左前缀原则?
 为什么范围查询字段最好放到组合索引的最后?
 什么是索引覆盖?
…………
什么是索引?
索引是对数据库表中一列或多列的值进行排
序的一种结构。
其作用是什么?
使SQL语句执行得更快。
1 什么是索引
2 TREE
2.1 查找算法
2.2 查找树
2.3 B-Tree
2.4 B+Tree
2.5 索引高度
2.6 范围扫描
查找算法:
1、顺序查找;
2、基于排序结果上的查找;
3、基于hash值的查找。
2.1 查找算法
动态查找树主要有:
二叉查找树(Binary Search Tree)
平衡二叉查找树(Balanced Binary Search Tree)
红黑树(Red-Black Tree )
B-tree/B+-tree
前三者是典型的二叉查找树结构。其它的都是多
叉树。他们的查找时间复杂度O(logaN) ,a是树的阶,
也就是节点的最大出度。
a越大,树的高度越低!
2.2 查找树
2.3 B-TREE
B-Tree结构图:
非叶子节点也包含数据,导致叶子节点不包括全部数据!!
查找:从根节点进行二分查找,如果找到则返回对应节点的
data,否则对相应区间的指针指向的节点递归进行查找,直到找
到节点或找到null指针,前者查找成功,后者查找失败。
2.4 B+TREE
B+树结构图:
1、叶子节点包含所有的关键字信息,且有横向链表;
2、所有非叶子节点仅包含其子树跟节点中最大或最小关键字。
2.4 B+TREE
B树比二叉树的高度更低,也更符合数据库的结构
(以页/块为单位);
B+树又比B树的好的地方在于:可以范围查找。
最终,B+树更合适作为索引结构!
2.5 索引高度
Oracle里索引的统计信息表(all_indexes)有一个字
段—Blevel:
Oracle里见过的Blevel最大的就是3,也就是说,见
过的索引最多只有4层!
MySQL的索引的层次目前不清楚具体怎么算的。。。但和Oracle是类似,
都是B+Tree索引。
2.6 范围扫描
范围扫描(range scan)不就是>、>=、<、<=、
between…and…这些吗?
Not Only!
除了primary key或者unique index上的=、in()查找
之外,其它都是范围扫描!非唯一索引上的=、in都是范
围扫描!(因为不唯一)
是否支持范围扫描是不是很重要。B+树比B树的优点
也就更明显了。
3 MYSQL索引结构
3.1 堆表与索引组织表
3.2 MyISAM索引结构
3.3 InnoDB主键结构
3.4 InnoDB辅助索引结构
按照表数据在磁盘上的组织形式区分:堆表、索
引组织表;
堆表:在磁盘上数据是按照插入顺序堆积起来的
(前面有删除,后面会填补),典型代表有:MySQL的
MyISAM表、Oracle的普通表;
索引组织表:在磁盘上数据是按照主键排序存储
的(单个数据块内),典型代表有:MySQL的InnoDB表。
3.1 堆表与索引组织表
MyISAM主键结构:
3.2 MYISAM索引结构
辅助索
引结构
与主键
一样~
InnoDB主键结构:
聚簇索引:索引即是数据。索引的叶子节点中不
仅包括索引字段,而且还包括其它所有字段!数据是
以主键顺序在磁盘上存储的(单个数据块内)。
3.3 INNODB主键结构
InnoDB辅助索引结构:
辅助索引除了存储索引字段外,还存储了主
键值!以辅助索引检索数据,必须先根据辅助索
引查找到主键值、再去主键索引里面查找数据!
3.4 INNODB辅助索引结构
这种结构和MyISAM的比有什么优缺点?
为什么InnoDB的主键字段长度尽量要短?
为什么InnoDB的主键尽量要用递增类型的?
聚簇和非聚簇表对比图:
3.4 INNODB辅助索引结构
4 索引原则
4.1 索引类型
4.2 索引优点
4.3 最左前缀
4.4 索引可选择性
4.5 覆盖索引
4.1 索引类型
索引类型:
B-Tree、Hash、全文;
主键、唯一索引、非唯一索引;
单列索引、多列索引(组合索引);
函数索引、位图索引、反转索引;(MySQL无)
分区索引、全局索引(MySQL无);
…………
1、大大减少了服务器需要扫描的数据量;--普通索引
2、可以帮助服务器避免排序和临时表;--索引包含by字段
3、可以将随机I/O变成顺序I/O。 --索引覆盖
4.2 索引优点
最左前缀原则:从索引的最左边字段开始组合。
举例:索引(A,B,C)
为什么索引要符合最左前缀:
索引扫描需要先在叶子节点中确定一个起点和终点!
4.3 最左前缀
(A、B、C三列的组合索引,从左到右排好序的叶子节点)
4.3 最左前缀
看看where a=2 and b=3的数据都有哪些?
再看看where b=3 的数据有有哪些?
看看where a=2 and c=3的数据都有哪些?
只能用到第一个字段,然后扫描索引的范围就变成了:
同理,你是否理解了这句话呢:组合索引中,范
围查询字段后面的其它字段,都用不到索引。
假如索引(A,B,C)
Select ……
Where A=1 and B>=2 and B<=3 and C=3;
索引只能用两个字段(A,B)。
4.3 最左前缀
索引的可选择性:不重复的索引值(基数,
cardinality)和表总行数的比值。
为什么可选择性高的字段创建索引效率更高?
最直观的理解:选择性高的字段具有更高的筛选
性。
4.4 索引可选择性
索引覆盖:索引数据包括了需要查找的、筛选的所
有字段。只扫描索引不回表!
辅助索引(A、B、C):
select B,C from table_name order by A,B;
主键:id;辅助索引(A,B):
Select id from table_name order by A,B;
优点:
减小访问量;随机IO基本变为顺序IO;InnoDB避免
了对主键的二次查询。
4.5 索引覆盖
使用独立的列;(索引列上不要有计算或函数)
考虑索引的最左前缀和可选择性;
尽量用多列索引来满足不同查询条件;(一当多用)
选择合适的索引顺序; (视业务而定)
利用索引覆盖;
使用索引扫描来做排序;
避免多个范围条件的查询;(知道为什么了吧)
范围查询的列放到索引最后。
5 索引优化
其它的需要注意的点:
 少用select *,请明确写出需要查找的列;jion中、group by
中、有text和BLOB字段的表中,禁用select *;
 禁用UNION,如必要,用UNION ALL代替;
 不需要排序的,请不要用order by;分组后不需要排序的,请
用 order by null;
 关联表的数量尽量少;
 少用 or;
 尽量用jion代替子查询;
 避免类型转换;
 Where中不直接对字段进行函数转换、计算等!
 避免用like '%abc';
5 索引优化
 left join 后面的限制条件只能用于限制left join后面的表,
对left jion前面的表无效!
 避免在sql中用hint;(如:force key())
 数据库中尽量少存日志类型的数据;如必须,尽量定期归档;
 不要增加不必要的列;(有人喜欢备用列:ext1、ext2、...)
 索引字段,尽量用NOT NULL;
 避免不必要的索引;
 尽量少用TEXT、BLOB类型;
 DISTINCT,UNION,MINUS,INTERSECT,ORDER BY、GROUP BY,都
会引起排序操作,需慎用;
 对count、sum、max外加group by的操作,尽量少做,可增加
外部缓存来减少在数据库层的操作。(如:排行榜)
 拒绝:big SQL、big Transaction、big Batch;
5 索引优化
Thanks!

More Related Content

Viewers also liked

Wonder character power point
Wonder character power pointWonder character power point
Wonder character power point20steiner_j
 
Mykytenko uarm-120413015034-phpapp02
Mykytenko uarm-120413015034-phpapp02Mykytenko uarm-120413015034-phpapp02
Mykytenko uarm-120413015034-phpapp02t7260678
 
Trophectoderm dna fingerprinting by quantitative real time pcr successfully d...
Trophectoderm dna fingerprinting by quantitative real time pcr successfully d...Trophectoderm dna fingerprinting by quantitative real time pcr successfully d...
Trophectoderm dna fingerprinting by quantitative real time pcr successfully d...t7260678
 
Internet Marketing In Asia
Internet Marketing In AsiaInternet Marketing In Asia
Internet Marketing In AsiaKeith Jones
 
10 Tips to Modernize Your PTA
10 Tips to Modernize Your PTA10 Tips to Modernize Your PTA
10 Tips to Modernize Your PTANichole Montoya
 
Michele evans
Michele evansMichele evans
Michele evanst7260678
 
EuroTrike 150 Brochure (1)
EuroTrike 150 Brochure (1)EuroTrike 150 Brochure (1)
EuroTrike 150 Brochure (1)Andrew Troy
 
Oracle scm online training in hyderabad
Oracle  scm online training in hyderabadOracle  scm online training in hyderabad
Oracle scm online training in hyderabadRudra IT Solutions
 

Viewers also liked (9)

Wonder character power point
Wonder character power pointWonder character power point
Wonder character power point
 
Mykytenko uarm-120413015034-phpapp02
Mykytenko uarm-120413015034-phpapp02Mykytenko uarm-120413015034-phpapp02
Mykytenko uarm-120413015034-phpapp02
 
Uses of photography
Uses of photographyUses of photography
Uses of photography
 
Trophectoderm dna fingerprinting by quantitative real time pcr successfully d...
Trophectoderm dna fingerprinting by quantitative real time pcr successfully d...Trophectoderm dna fingerprinting by quantitative real time pcr successfully d...
Trophectoderm dna fingerprinting by quantitative real time pcr successfully d...
 
Internet Marketing In Asia
Internet Marketing In AsiaInternet Marketing In Asia
Internet Marketing In Asia
 
10 Tips to Modernize Your PTA
10 Tips to Modernize Your PTA10 Tips to Modernize Your PTA
10 Tips to Modernize Your PTA
 
Michele evans
Michele evansMichele evans
Michele evans
 
EuroTrike 150 Brochure (1)
EuroTrike 150 Brochure (1)EuroTrike 150 Brochure (1)
EuroTrike 150 Brochure (1)
 
Oracle scm online training in hyderabad
Oracle  scm online training in hyderabadOracle  scm online training in hyderabad
Oracle scm online training in hyderabad
 

Similar to Mysql index Introduction

Mysql的索引及优化策略
Mysql的索引及优化策略Mysql的索引及优化策略
Mysql的索引及优化策略fog001
 
Oracle&mysql数据库模式设计
Oracle&mysql数据库模式设计Oracle&mysql数据库模式设计
Oracle&mysql数据库模式设计Beenyoung Lee
 
Sql Server 高级技巧系列之一:索引详解
Sql Server 高级技巧系列之一:索引详解Sql Server 高级技巧系列之一:索引详解
Sql Server 高级技巧系列之一:索引详解向 翔
 
SEO简介及商城SEO可行性探讨(公开版)
SEO简介及商城SEO可行性探讨(公开版)SEO简介及商城SEO可行性探讨(公开版)
SEO简介及商城SEO可行性探讨(公开版)suso zhang
 
20110224 seo培训稿
20110224 seo培训稿20110224 seo培训稿
20110224 seo培训稿nigel wu
 
Seo design strategy
Seo design strategySeo design strategy
Seo design strategyBaidu
 

Similar to Mysql index Introduction (6)

Mysql的索引及优化策略
Mysql的索引及优化策略Mysql的索引及优化策略
Mysql的索引及优化策略
 
Oracle&mysql数据库模式设计
Oracle&mysql数据库模式设计Oracle&mysql数据库模式设计
Oracle&mysql数据库模式设计
 
Sql Server 高级技巧系列之一:索引详解
Sql Server 高级技巧系列之一:索引详解Sql Server 高级技巧系列之一:索引详解
Sql Server 高级技巧系列之一:索引详解
 
SEO简介及商城SEO可行性探讨(公开版)
SEO简介及商城SEO可行性探讨(公开版)SEO简介及商城SEO可行性探讨(公开版)
SEO简介及商城SEO可行性探讨(公开版)
 
20110224 seo培训稿
20110224 seo培训稿20110224 seo培训稿
20110224 seo培训稿
 
Seo design strategy
Seo design strategySeo design strategy
Seo design strategy
 

Mysql index Introduction

Editor's Notes

  1. 什么是索引? 索引是对数据库表中一列或多列的值进行排序的一种结构。 作用是什么? 使SQL语句执行得更快。
  2. B树: B树又叫平衡多路查找树。一棵m阶的B树 的特性如下: 1.树中每个结点最多含有m个孩子(m>=2); 2.除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]个孩子(其中ceil(x)是一个取上限的函数); 3.若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点); 4.所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息(可以看做是外部接点或查询失败的接点,实际上这些结点不存在,指向这些结点的指针都为null); 5.每个非终端结点中包含有n个关键字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中: a) Ki (i=1...n)为关键字,且关键字按顺序升序排序K(i-1)< Ki。 b) Pi为指向子树根的接点,且指针P(i-1)指向子树种所有结点的关键字均小于Ki,但都大于K(i-1)。 c) 关键字的个数n必须满足: [ceil(m / 2)-1]<= n <= m-1。 由于B-Tree的特性,在B-Tree中按key检索数据的算法非常直观: 首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败。 由于插入删除新的数据记录会破坏B-Tree的性质,因此在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持B-Tree性质。
  3. B+树: 一棵m阶的B+树和m阶的B树的异同点在于: 1.有n棵子树的结点中含有n-1 个关键字; (与B 树n棵子树有n-1个关键字 保持一致) 2.所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息) 3.所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息) B*-Tree B*-tree是B+-tree的变体,在B+树的基础上(所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针),B*树中非根和非叶子结点再增加指向兄弟的指针; B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2)。 B+树的分裂: 当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针; B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,因为它不需要指向兄弟的指针。 B*树的分裂: 当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了); 如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针。 所以,B*树分配新结点的概率比B+树要低,空间使用率更高。 B+树重复键问题及处理: 当重复键很多时,可能会出现叶节点无法容纳具有给定键值所有记录项的情况。 常用处理方法有:用溢出页来处理重复键问题;把重复键俺一般非重复键一样处理,这时重复键项将出现在一个活连续的多个页节点中;将rid值也作为搜索键的一部分。
  4. B+树: 一棵m阶的B+树和m阶的B树的异同点在于: 1.有n棵子树的结点中含有n-1 个关键字; (与B 树n棵子树有n-1个关键字 保持一致) 2.所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息) 3.所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息) B*-Tree B*-tree是B+-tree的变体,在B+树的基础上(所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针),B*树中非根和非叶子结点再增加指向兄弟的指针; B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2)。 B+树的分裂: 当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针; B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,因为它不需要指向兄弟的指针。 B*树的分裂: 当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了); 如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针。 所以,B*树分配新结点的概率比B+树要低,空间使用率更高。 B+树重复键问题及处理: 当重复键很多时,可能会出现叶节点无法容纳具有给定键值所有记录项的情况。 常用处理方法有:用溢出页来处理重复键问题;把重复键俺一般非重复键一样处理,这时重复键项将出现在一个活连续的多个页节点中;将rid值也作为搜索键的一部分。
  5. http://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_1069.htm#i1578369
  6. B+树: 一棵m阶的B+树和m阶的B树的异同点在于: 1.有n棵子树的结点中含有n-1 个关键字; (与B 树n棵子树有n-1个关键字 保持一致) 2.所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息) 3.所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息) B*-Tree B*-tree是B+-tree的变体,在B+树的基础上(所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针),B*树中非根和非叶子结点再增加指向兄弟的指针; B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2)。 B+树的分裂: 当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针; B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,因为它不需要指向兄弟的指针。 B*树的分裂: 当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了); 如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针。 所以,B*树分配新结点的概率比B+树要低,空间使用率更高。 B+树重复键问题及处理: 当重复键很多时,可能会出现叶节点无法容纳具有给定键值所有记录项的情况。 常用处理方法有:用溢出页来处理重复键问题;把重复键俺一般非重复键一样处理,这时重复键项将出现在一个活连续的多个页节点中;将rid值也作为搜索键的一部分。
  7. 其实,表在磁盘上的组织主要就两种,堆表、索引组织表; 堆表:在磁盘上数据是按照插入顺序堆积起来的(前面有删除,后面会填补),典型代表有:MySQL的MyISAM表、Oracle的普通表; 索引组织表:在磁盘上数据是按照主键排序存储的(单个数据块内),典型代表有:MySQL的InnoDB表、Oracle的IOT表(Index Organized Table)。 MyISAM的数据在磁盘上的组织是无序的,是按照插入前后顺序堆积的(如果前边有删除,会填补漏洞)。堆积表! 其辅助索引与主键在结构上没有任何区别。只是主索引要求key是唯一的,而辅助索引的key可以重复。 MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。 MyISAM的索引组织方式跟Oracle的非常相似,MyISAM叶子节点的date域存的是数据行的行号/地址(具体与MyISAM表是变长还是定长有关); Oracle的叶子节点的data域存的数据行的rowid(可以定位数据行的物理存储位置)。 Rowid格式: OOOOOO FFF BBBBBB RRR 数据对象号 相对文件号 数据块号 行号
  8. 其实,表在磁盘上的组织主要就两种,堆表、索引组织表; 堆表:在磁盘上数据是按照插入顺序堆积起来的(前面有删除,后面会填补),典型代表有:MySQL的MyISAM表、Oracle的普通表; 索引组织表:在磁盘上数据是按照主键排序存储的(单个数据块内),典型代表有:MySQL的InnoDB表、Oracle的IOT表(Index Organized Table)。 MyISAM的数据在磁盘上的组织是无序的,是按照插入前后顺序堆积的(如果前边有删除,会填补漏洞)。堆积表! 其辅助索引与主键在结构上没有任何区别。只是主索引要求key是唯一的,而辅助索引的key可以重复。 MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。 MyISAM的索引组织方式跟Oracle的非常相似,MyISAM叶子节点的date域存的是数据行的行号/地址(具体与MyISAM表是变长还是定长有关); Oracle的叶子节点的data域存的数据行的rowid(可以定位数据行的物理存储位置)。 Rowid格式: OOOOOO FFF BBBBBB RRR 数据对象号 相对文件号 数据块号 行号
  9. InnoDB索引实现: 聚簇索引/聚集索引(Oracle里面的聚簇和MySQL里面的聚簇不是一个意思,MySQL里面的聚簇索引在Oracle里面叫做索引组织表-IOT),数据文件本身就是索引文件。 因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。 InnoDB的辅助索引data域存储相应记录主键的值而不是地址。 聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。但好处是,减少了维护索引的工作。
  10. InnoDB索引实现: 聚簇索引/聚集索引(Oracle里面的聚簇和MySQL里面的聚簇不是一个意思,MySQL里面的聚簇索引在Oracle里面叫做索引组织表-IOT),数据文件本身就是索引文件。 因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。 InnoDB的辅助索引data域存储相应记录主键的值而不是地址。 聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。但好处是,减少了维护索引的工作。
  11. B-Tree索引 可用的查询类型有: 全值匹配 匹配最左前缀 匹配列前缀 匹配范围值 精确匹配某一列并范围匹配另外一列 只访问索引的查询 索引还可以用于查询中的order by操作。 B-Tree索引的限制: 如果不是按照最左列开始查找,则无法使用索引; 不能跳过索引中的列; 如果查询中有某个列的范围查询,则其右边所有的列都无法使用索引优化查找。
  12. 为什么索引要符合最左前缀: 索引扫描需要先确定起点和终点!(Oracle的一种特殊情况除外~) MySQL所有索引扫描都是要先确定一个起点和终点。Oracle有一个例外,就是index skip scans 组合索引的实际应用:(A,B,C) A=val1 and B=val2 and C=val3; A=val1 and C=val2; B=val1 and C=val2; A=val1 and B>val2 and B<val3 and C=val4; A like 'aaa%' and B=val2; A like '%aaa' and B like 'bbb%'; A + n=val1 and B=val2;
  13. C B A 1 1 1 2 1 1 3 1 1 1 2 1 2 2 1 3 2 1 1 3 1 2 3 1 3 3 1 1 1 2 2 1 2 3 1 2 1 2 2 2 2 2 3 2 2 1 3 2 2 3 2 3 3 2 1 1 3 2 1 3 3 1 3 1 2 3 2 2 3 3 2 3 1 3 3 1 3 3 3 3 3
  14. 对于BLOB、TEXT或者很长的varchar的列,必须使用前缀索引,因为mysql不允许索引这些列的完整长度。 前缀长度选择诀窍:选择足够长的前缀以保证较高的选择性,同时又不能太长(节约空间)。 alter table cit_demo add key(city(7)); 前缀索引优缺点:使索引更小、更快;但无法做order by和group by,也无法做覆盖扫描。 B+树重复键问题及处理: 当重复键很多时,可能会出现叶节点无法容纳具有给定键值所有记录项的情况。 常用处理方法有:用溢出页来处理重复键问题;把重复键俺一般非重复键一样处理,这时重复键项将出现在一个活连续的多个页节点中;将rid值也作为搜索键的一部分。 MySQL中前缀索引的优缺点:减小了索引的占用空间、加快了查询速度,但不能用order by和group by操作,也不能用于覆盖索引。但text、blob只能是前缀索引。只有Memory引擎显式支持哈希索引。 Hash索引的优缺点:速度快、占用空间少,但只能做等值查询!最前缀、order by、group by都不能用! 最大填充因子(默认是15/16),类似于Oracle里面的PCTFREE(粒度更细,可以控制单个表、索引、分区)。
  15. 6、覆盖索引 只扫描索引不回表的好处: * 索引条目通常远小于数据行大小,极大地减小数据访问量; * 索引时按照值顺序存储的(至少单个页内是如此),所以对于IO密集型的范围查询会比随机从磁盘读取每一行数据的IO要少得多; * 一些存储引擎如MyISAM在内存中是缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用。这可能会导致严重的性能问题; * 对Inodb来说,如果二级索引能够覆盖查询,可以避免对主键的二次查询; 只有B-Tree索引能够覆盖查询,因为覆盖索引必须存储索引列的值,而哈希索引、空间索引、全文索引等都不存储索引列的值。(Memory存储引擎不支持覆盖索引) 覆盖查询时,explain的Extra列可以看到“Using index”的信息。
  16. 1、独立的列 索引列不能是表达式的一部分,也不能是函数的参数。 2、前缀索引和索引选择性 3、多列索引 单列索引一般也只能满足一星。 多个列上创建单列索引大部分情况下并不能提高MySQL的查询性能。但MySQL5.0以后版本引入了“索引合并”(index merge)的策略,一定程度上可以使用表上的多个单列索引来定位指定的行。三个变种算法:OR条件(union)、AND条件(intersection)、OR和AND的组合。索引合并策略有时候是一种优化的结果,但更多的说明了表上的索引建得很糟糕: * 当出现多个索引相交操作时(AND),通常以为着需要一个包含所有列的多列索引; * 当出现多个索引联合操作时(OR),通常需要耗费大量CPU和内存资源在算法的缓存、排序、合并操作上。 * 更重要的是,优化器不会把这些计算到“查询成本”(cost)中,优化器只关心随机页面的读取。这会使查询的成本被“低估”,导致该执行计划还不如直接走全部扫描。 optimizer_switch可以关闭索引合并功能。 4、选择合适的索引顺序 正确的索引顺序依赖于索引的查询,并且同时需要考虑如何更好地满足排序和分组的需要。 经验法则:将选择性最高的列放到索引最前列。但需要全面考虑。更应该考虑如何避免随机IO和排序。 5、聚簇索引 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。在同一个结构中保存B-Tree索引和数据行。 因为是存储引擎负责实现索引,因此不是所有的存储引擎都支持聚簇索引。 叶子页包含了行的全部数据,但节点页只包含了索引列。 InnoDB通过主键聚簇,如果没有定义主键,InnoDB会选择一个唯一的非空索引代替,如果没有这样的索引,InnoDB会隐式定义一个主键作为聚簇索引。InnoDB只聚集在同一个页面中的记录,相邻键值得页面可能会相距很远。 聚集的数据的优点: * 可以把相关数据保存在一起; * 数据访问更快; * 使用覆盖索引扫描的查询可以直接使用页节点中的主键值。 聚簇索引的缺点: * 如果数据全部都放在内存中,访问顺序就没那么重要了,聚簇索引也就没什么优势了; * 插入速度严重依赖于插入顺序;无顺序插入之后,可以使用optimize table命令优化; * 更新聚簇索引列的代价很高; * 插入新行、主键被更新导致需要移动行的时候,可能面临“页分裂(page split)”的问题; * 可能导致全表扫描变慢,尤其是行比较稀疏或者由于页分裂导致数据存储不连续的时候; * 二级索引可能比想象的药更大; * 二级索引访问需要两次索引查找,而不是一次。 6、覆盖索引 7、使用索引扫描来做排序 8、避免多个范围条件 explain的输出是无法区分是“范围查询”还是“列表查询”,type列都将显示为“range"。但这两种访问效率是不一样的,Mysql无法再使用范围列后面的其它索引列了,但对于多等值条件查询,则没有这个限制。 9、多种过滤条件 你可能主要到了,我们一直将age列放到索引的最后,这是因为:我们总是尽可能让MySQL使用更多的索引列,因为查询只能使用索引的最前缀,直到遇到第一个范围条件列! 这里描述的基本原则:尽可能将需要做范围查询的列放到索引的最后,以便优化器能使用尽可能多的索引列。