Tree 索引和 Hash 索引的对比

对于 B-tree 和 hash 数据结构的理解能够有助于预测不同存储引擎下使用不同索引的查询性能的差异,尤其是那些允许你选择 B-tree 或者 hash 索引的内存存储引擎。

B-Tree 索引的特点B-tree 索引可以用于使用 =, >, >=, <, <= 或者 BETWEEN 运算符的列比较。如果 LIKE 的参数是一个没有以通配符起始的常量字符串的话也可以使用这种索引。比如,以下 SELECT 语句就使用索引:SELECT * FROM tbl_name WHERE key_col LIKE ‘Patrick%’;SELECT * FROM tbl_name WHERE key_col LIKE ‘Pat%_ck%’;在第一个句子中,只会考虑 ‘Patrick’ <= key_col < ‘Patricl’ 的记录。第二句中,则只会考虑 ‘Pat’ <= key_col < ‘Pau’ 的记录。以下 SELECT 语句不使用索引:SELECT * FROM tbl_name WHERE key_col LIKE ‘%Patrick%’;SELECT * FROM tbl_name WHERE key_col LIKE other_col;第一句里面,LIKE 的值起始于一个通配符。在第二句里,LIKE 的值不是一个常量。如果你这样使用: … LIKE ‘%string%’,其中的 string 不大于三个字符,MySql 将使用 Turbo Boyer-Moore 算法来对该字符串表达式进行初始化,并使用这种表达式来让查询更加迅速。如果 col_name 列创建了索引,那么一个使用了 col_name IS NULL 的查询是可以使用该索引的。任何没有涵盖 WHERE 从句中所有 AND 级别的条件的索引将不会被使用。换句话讲,要想使用索引,该索引的前导列必须在每一个 AND 组合中使用到。以下 WHERE 从句使用索引:… WHERE index_part1=1 AND index_part2=2 AND other_column=3/* index = 1 OR index = 2 */… WHERE index=1 OR A=10 AND index=2/* optimized like "index_part1=’hello’" */… WHERE index_part1=’hello’ AND index_part3=5/* Can use index on index1 but not on index2 or index3 */… WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;这些 WHERE 从句不使用索引: /* index_part1 is not used */… WHERE index_part2=1 AND index_part3=2/* Index is not used in both parts of the WHERE clause */… WHERE index=1 OR A=10/* No index spans all rows */… WHERE index_part1=1 OR index_part2=10

有时,,即使有索引可以使用,MySql 也不使用任何索引。发生这种情况的场景之一就是优化器估算出使用该索引将要求 MySql 去访问这张表的绝大部分记录。这种情况下,一个表扫描可能更快,因为它要求更少量的查询。但是,如果这样的一个查询使用了 LIMIT 来检索只是少量的记录时,MySql 还是会使用索引,因为它能够更快地找到这点记录并将其返回。

Hash 索引的特点Hash 索引有着与刚才所讨论特点的相比截然不同的特点:原文链接:。

接受自己的失败面,是一种成熟,更是一种睿智

Tree 索引和 Hash 索引的对比

相关文章:

你感兴趣的文章:

标签云: