MySQL索引模型
数据库索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。 索引的常见模型 哈希表 数组加链表实现,添加新数据较快,但是由于不是有序的,所以区间查询速度是很慢的。 哈希表适用于只有等值查询的场景,比如Memcached及其他NOSQL引擎。 有序数组 有序数组是讲索引字段有序的存放在数组中,所以在等值查询和范围查询场景中的性能就都非常优秀。 但是有序数组在插入更新时就比较麻烦,需要移动后面所有记录,成本太高;所以有序数组索引只适用于静态存储引擎。 二叉搜索树 二叉树的查询和更新复杂度均为O(log(N));假如一棵 100 万节点的平衡二叉树,树高 20,一次查询可能需要访问 20 个数据块。 所以大多数数据存储引擎采用N叉树 MySQL的索引 在MySQL中,索引是在存储引擎层实现的。Mysql索引使用的数据结构主要有 BTree索引 和 哈希索引 。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。 MyISAM中的索引 B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。 InnoDB中的索引