10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册摘录

MySQL 8.0参考手册// B-Tree和哈希索引的比较

8.3.9 B-Tree和Hash索引比较

理解b -树和哈希数据结构可以帮助预测在索引中使用这些数据结构的不同存储引擎上的不同查询是如何执行的,特别是对于内存允许您选择b -树或散列索引的存储引擎。

b -树索引特征

属性的表达式中可以使用B-tree索引进行列比较=,>,> =,<,< =,或之间的操作符。索引也可以用于就像比较如果参数就像不以通配符开头的常量字符串。例如,如下选择语句使用索引:

SELECT * FROMtbl_name在哪里key_col“帕特里克%”;SELECT * FROMtbl_name在哪里key_col“帕特% _ck %”;

在第一个语句中,只有行与“帕特里克。”< =key_col<“Patricl”被认为是。在第二个语句中,只有行与“拍”< =key_col<“保罗”被认为是。

以下选择语句不使用索引:

SELECT * FROMtbl_name在哪里key_col像“%帕特里克%”;SELECT * FROMtbl_name在哪里key_col就像other_col;

在第一个语句中就像值以通配符开头。在第二个表述中就像价值不是一个常数。

如果你使用…像“%字符串%’字符串大于3个字符,MySQL使用涡轮Boyer-Moore算法初始化字符串的模式,然后使用此模式更快地执行搜索。

一个搜索使用col_name为空使用索引,如果col_name是索引。

任何不能跨越所有的索引水平在哪里子句不用于优化查询。换句话说,为了能够使用索引,必须在每个索引中使用索引的前缀组。

以下在哪里条款使用索引:

…在哪里index_part1= 1,index_part2= 2,other_column= 3 / *指数= 1或指数= 2 */…在哪里指数=1或a =10和指数=2 /*优化like "index_part1= '你好' " * /…在哪里index_part1= '你好'index_part3=5 /*可以使用索引index1但不是在index2index3* /…在哪里index1= 1,index2= 2或index1= 3,index3= 3;

这些在哪里条款做使用索引:

/ *index_part1不使用*/…在哪里index_part2= 1,index_part3=2 /*在WHERE子句的两个部分都没有使用索引*/…在哪里指数=1 OR A=10 /*没有索引跨越所有行*/…在哪里index_part1= 1或index_part2= 10

有时MySQL不使用索引,即使索引是可用的。出现这种情况的一种情况是,优化器估计使用索引将需要MySQL访问表中很大比例的行。(在这种情况下,表扫描可能要快得多,因为它需要更少的查找。)但是,如果这样的查询使用限制为了只检索一些行,MySQL使用索引,因为它可以更快地找到结果中要返回的几行。

哈希索引特征

哈希索引有一些与刚才讨论的不同的特征:

  • 它们仅用于使用=< = >操作符(但非常快)。类的比较操作符不使用它们<找到一个值的范围。依赖于这种单值查找类型的系统称为键值存储;为了在这样的应用程序中使用MySQL,尽可能使用散列索引。

  • 优化器不能使用哈希索引来加速命令操作。(这种类型的索引不能用于按顺序搜索下一个条目。)

  • MySQL无法确定两个值之间大约有多少行(这被范围优化器用来决定使用哪个索引)。这可能会影响一些查询,如果您更改MyISAMInnoDB表到一个散列索引内存表格

  • 只能使用整个键来搜索一行。(对于B-tree索引,键最左边的任何前缀都可以用来查找行。)