当前位置:Gxlcms > 数据库问题 > MySQL 索引

MySQL 索引

时间:2021-07-01 10:21:17 帮助过:7人阅读

 

 B-Tree通常可以支持“只访问索引的查询”,即查询只需要访问索引,而无需访问数据行。、

B-Tree索引的限制:

  • 如果不是按照索引最左列开始查找,则无法使用索引。
  • 不能跳出索引中的列
  • 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找。

这些限制都和索引的顺序有关。在优化性能的时候,可能需要使用相同的列但顺序不同的索引来满足不同类型的查询需求。

  哈希索引

哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希码是一个较小的数值,并且不同键值的行计算出的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。

  在MySQL中只有Memory引擎支持哈希索引。哈希索引是Memory默认的索引类型,Memory引擎同时也支持B-Tree索引。Memory引擎是支持非唯一哈希索引的,这在数据库世界里是比较与众不同的。如果多个列的哈希值相同,索引会以链表的方式存放在多个记录指针到同一个哈希条目中。

哈希索引的限制:

  • 哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。不过,访问内存中的行的速度很快,所以大部分情况这一点对性能的影响并不明显。
  • 哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序。
  • 哈希索引也不支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。例如:如果数据列(A,B)上建立哈希索引,如果查询到数据只有A列,则无法使用该索引。
  • 哈希索引只支持等值比较查询,包括=、IN、技术分享(注意<=>和<>是不同的操作)。也不支持任何范围查询。
  • 范文哈希索引的数据非常快,除非有很多哈希冲突(不同的索引列值却有可能有相同的哈希值。)。当出现哈西冲突的时候,存储引擎必须遍历链表中所有行指针,逐行进行比较,直到找到所有符合条件的行。
  • 如果哈希冲突很多的话,一些索引维护操作的代价也会很高。例如:如果在某个选择性很低(哈希冲突很多)的列上建立哈希索引,那么从表中删除一行时,存储引擎需要遍历对应哈希值的链表中的每一行,找到并删除对应行的引用,冲突越多,代价越大。

未完待续。。。。。。。

 

MySQL 索引

标签:类型   服务器   负载   性能   十分   之间   数值   前缀   头部   

人气教程排行