媒介:相识B树和哈希数据结构有助于展望查询在这些运用差别索引数据结构的存储引擎上的执行状况,特别是关于MEMORY存储引擎,它是许可您挑选B树或哈希作为索引的存储引擎。
1. B树指数特性
B树索引可以在运用表达式中运用的对列的比较 =, >, >=, <, <=,或BETWEEN关键字。假如运用LIKE 或to LIKE且是一个不以通配符开首的常量字符串,则索引也可用于比较 。
1.比方,以下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'
2.以下SELECT语句不运用索引:
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE other_col;
在第一个语句中,LIKE 值以通配符开首。在第二个语句中,该LIKE值不是常量。
假如运用了像'%string%'且长度凌驾三个字符的字符串查询,那末MySQL将运用Turbo Boyer-Moore算法初始化这个模子,用这个模子来婚配速率会更快.
不逾越子句中的一切AND级别的 任何索引 WHERE不用于优化查询。换句话说,为了可以运用索引,必须在每一个AND组中运用索引的前缀 。
3.以下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;
4.这些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无论如何都邑运用索引,由于它可以更快地找到在效果中返回几行。
2. 哈希指数特性
散列索引与适才议论的特性有些差别:
它们仅用于运用=或<=>(文章末端有此标记申明) 运算符的相称比较 (但速率非常快)。它们不用于比较运算符,比方 <找到一系列值。依赖于这类范例的单值查找的体系被称为“ 键值存储 ” ; 要将MySQL用于键值查找类,请尽量运用哈希索引。
优化器没法运用哈希索引来加快 ORDER BY操纵。(此类索引不能用于按顺序搜刮下一个条目。)
MySQL没法肯定两个值之间大约有若干行(局限优化器运用它来决议运用哪一个索引)。假如将 MyISAM或 InnoDB表更改成哈希索引 MEMORY表,则能够会影响某些查询。
只要悉数键可用于搜刮行。(运用B树索引,键的任何最左侧的前缀都可用于查找行。)
附录
诠释=和<=>的区分:
相同点:像通例的=运算符一样,两个值举行比较,效果是0(不等于)或1(相称),换句话说:’A'<=>’B'得0和’a'<=>’a‘得1,都是值的比较。
差别点:NULL的值是没有任何意义的。所以=号运算符不能把NULL作为有用的效果。所以:请运用<=>,'a' <=> NULL 得0 NULL<=> NULL 得出 1。和=运算符正相反,=号运算符规则是 'a'=NULL 效果是NULL 以至NULL = NULL 效果也是NULL。趁便说一句,mysql上险些一切的操纵符和函数都是如许事情的,由于和NULL比较基本上都没有意义。
用途当两个操纵数中能够含有NULL时,你须要一个一致的语句,此时就可以用<=>.
本篇文章到这里就已悉数完毕了,更多其他精彩内容可以关注ki4网的MySQL视频教程栏目!
以上就是B树和哈希索引的比较(代码示例)的细致内容,更多请关注ki4网别的相干文章!