MySQL的InnoDB引擎的索引知识小结
2017-05-20 00:00
295 查看
InnoDB存储引擎支持两种常见的索引:B+树索引、Hash索引。
B+树索引是目前关系型数据库系统中最常见、最有效的索引。
B+树中的B代表的不是二叉(binary),而是平衡(balance),所以,B+树是平衡树并不是二叉树。
B+树索引能找到的只是被查找数据行所在的页。然后数据库把页读入内存,再从内存中进行查找,最后得到要查找的数据。
在数据库中,B+树的高度一般在2-3层,也就意味着在查找某一个键所对应的值的时候,大概需要2-3次IO。
数据库中的B+树索引分为聚集索引和非聚集索引(辅助索引)
聚集索引就是按照每张表的主键构造一个B+树,B+树的一个叶子几点中记录着表中一行记录的所有值。只要找到这个叶子节点也就得到了这条记录的所有值。
辅助索引的叶节点中不包含行记录的所有值。只包含一个键值和一个书签(bookmark),书签用于定位与索引对应的数据行。
每张表只能有一个聚集索引,可以有多个辅助索引。
辅助索引通过叶级别的指针获得指向主键的索引,然后再通过聚集索引定位数据行。
对于索引的添加或删除操作,MySql数据库会先创建一张临时表,然后把数据导入临时表中,删除原表,再把临时表名改为原来的表名。所以,增加和删除索引有成本。
当某个字段的取值分布范围比较广的时候(高选择性)适合使用B+树索引。如果某字段只有Y和N两个取值,那么没必要使用索引。
如果要查询的字段具有高选择性,但是本次检索的数据占总数据量的一半以上时,MySql就不会使用索引进行查询。
联合索引是指对表上的多个列做索引。
如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col3)和(col1,col2,col3)上建立了索引;这就是最左前缀原则。
搜索的索引列,不一定是所要选择的列。换句话说,最适合索引的列是出现在 WHERE 子句中的列,或连接子句中指定的列,而不是出现在 SELECT 关键字后的选择列表中的列。
使用短索引。如果对字符串列进行索引,应该指定一个前缀长度,只要有可能就应 该这样做。例如,如果有一个 CHAR(200)列,如果在前 10 个或 20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。
不要过度索引。
Hash只用于使用=或<=>操作符的等式比较。
B+树索引,当使用>、<、>=、<=、BETWEEN、!=或者<>,或者 LIKE ‘pattern'(其
中’pattern’不以通配符开始)操作符时,都可以使用相关列上的索引。
文章来源网络,如有侵权请联系小编
喜欢的可以加Q群162542073一起讨论,交流
B+树索引是目前关系型数据库系统中最常见、最有效的索引。
B+树中的B代表的不是二叉(binary),而是平衡(balance),所以,B+树是平衡树并不是二叉树。
B+树索引能找到的只是被查找数据行所在的页。然后数据库把页读入内存,再从内存中进行查找,最后得到要查找的数据。
在数据库中,B+树的高度一般在2-3层,也就意味着在查找某一个键所对应的值的时候,大概需要2-3次IO。
数据库中的B+树索引分为聚集索引和非聚集索引(辅助索引)
聚集索引就是按照每张表的主键构造一个B+树,B+树的一个叶子几点中记录着表中一行记录的所有值。只要找到这个叶子节点也就得到了这条记录的所有值。
辅助索引的叶节点中不包含行记录的所有值。只包含一个键值和一个书签(bookmark),书签用于定位与索引对应的数据行。
每张表只能有一个聚集索引,可以有多个辅助索引。
辅助索引通过叶级别的指针获得指向主键的索引,然后再通过聚集索引定位数据行。
对于索引的添加或删除操作,MySql数据库会先创建一张临时表,然后把数据导入临时表中,删除原表,再把临时表名改为原来的表名。所以,增加和删除索引有成本。
当某个字段的取值分布范围比较广的时候(高选择性)适合使用B+树索引。如果某字段只有Y和N两个取值,那么没必要使用索引。
如果要查询的字段具有高选择性,但是本次检索的数据占总数据量的一半以上时,MySql就不会使用索引进行查询。
联合索引是指对表上的多个列做索引。
如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col3)和(col1,col2,col3)上建立了索引;这就是最左前缀原则。
搜索的索引列,不一定是所要选择的列。换句话说,最适合索引的列是出现在 WHERE 子句中的列,或连接子句中指定的列,而不是出现在 SELECT 关键字后的选择列表中的列。
使用短索引。如果对字符串列进行索引,应该指定一个前缀长度,只要有可能就应 该这样做。例如,如果有一个 CHAR(200)列,如果在前 10 个或 20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。
不要过度索引。
Hash只用于使用=或<=>操作符的等式比较。
B+树索引,当使用>、<、>=、<=、BETWEEN、!=或者<>,或者 LIKE ‘pattern'(其
中’pattern’不以通配符开始)操作符时,都可以使用相关列上的索引。
文章来源网络,如有侵权请联系小编
喜欢的可以加Q群162542073一起讨论,交流
相关文章推荐
- mysql 索引长度tips innodb和myisam引擎
- MySql中InnoDB引擎索引
- Mysql innodb引擎和myisam引擎 使用索引区别
- mysql 索引长度tips innodb和myisam引擎
- mysql InnoDB引擎支持hash索引吗
- mysql中存储引擎为Innodb的索引介绍
- 做一个合格的程序猿之MYSQL存储引擎INNODB简介--初识索引(三)
- MySQL技术内幕-InnoDB存储引擎读写笔记(索引概述)
- mysql引擎InnoDB索引中的cardinality关键字
- mysql 存储引擎 innodb 学习复习 之 索引
- mysql innodb 引擎 key - 和 Primary key的区别 以及 索引的用法总结
- 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)
- mysql的存储引擎innodb、myisam对插入影响和索引对插入的影响
- Mysql (InnoDB引擎)聚集索引和辅助索引
- MySQL5.5索引数在InnoDB引擎内与索引数在mysql中定义的数量是不一致问题
- MySQL InnoDB引擎索引长度受限怎么办?
- mysql innodb存储引擎的聚集索引
- mysql 存储引擎 InnoDB和myisam存储引擎的区别 /(自己小结)
- MySQL InnoDB引擎B+树索引简单整理说明
- Mysql innodb引擎和myisam引擎使用索引区别