理解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但不是在index2或index3* /…在哪里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使用索引,因为它可以更快地找到结果中要返回的几行。