第5章 创建高性能的索引
正文:
1.索引(key):是存储引擎用于快速找到记录的一种数据结构。
2.索引优化应该是查询性能优化最有效的手段了。(数据量越多越明显)
3.原理:
- 在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行。(固态硬盘中,索引原则依然成立)
4.索引中如果包含多个列,那么顺序非常重要,mysql只能高效的使用左前列。
5.索引是在存储引擎层实现的(所以各种引擎实现方式不一样,没有特殊指定InnoDB)。(mysql 大致可分为三层,最低层是存储引擎)
6.mysql支持的索引类型:
- BTree(大多数是这个):所有的值是按照顺序存储的,并且每一个叶子页到根的距离是相同的。每一个页都用指向下一个页的指针。
- InnoDB根据主键饮用被索引的行,MyISAM使用前缀压缩技术使得索引更小。
- 哈希索引:用所用的索引列计算一个hash值然后存放在索引中,当查的时候先将键算出哈希吗,通过哈希吗匹配到对应的行引用,所以只用精确匹配所有列才会生效。
- 哈希索引的优点:索引存储的是哈希所以非常小。一旦适用哈希,性能提升非常显著。查找非常快。(等值查找)
- 哈希索引的缺点:只支持全匹配的等值比较,不支持范围。哈希冲突会影响性能。(计算不一样的值的哈希值相同)
7.BTree优点:不用全表扫描来获取需要的数据,只用从索引的根节点开始搜索。
8.BTree是顺序存储的,很适合做键值范围,全键值,键前缀。(在xx和xx之间的数据)
9.如果不是从最左列开始查找,则无法使用索引。(key(a,b,c)直接查找b 中的值)
10.如果查询中有某个列使用的是范围查找,那么在此右边的索引将无法使用索引优化。(如a like ‘’ and b =‘’那么 b 就不能优化)
11.在实际情况中有可能由于顺序问题 ,要在相同的列上建立不同的索引顺序。
12.InnoDB有“自适应哈希索引”:对于某一个索引被频繁的时候,就会在BTree的基础上建立一个哈希索引。这样使用这个索引的查找会自动的将这个列进行哈希计算,然后到新建的哈希索引中查找。
13.自定义哈希索引:在表中添加一个字段,这个字段是想要被索引的列的哈希计算值,然后建立BTree索引,在搜索的时候值需要使用函数进行计算。where URL=CRC32(“xxxx”)适用于比较长的值列作为索引。(函数使用 不要使用 sha1()md5()因为计算的值比原来的还长)
14.处理哈希冲突:可以在查找的后面添上 and 对应非索引列=‘’。哈希冲突会返回多个值,可以根据后面的筛选出正确的值。
未完待续。。。。。