mysql中的Btree和Hash

最近在做项目的时候要经常建表,会考虑到数据较大时的处理办法,其中给字段加索引就是一个很好的优化方法,所以对索引的选择就显得至关重要。

先来看看一些常用索引:

PRIMARY 主键(唯一且不能为空)

INDEX       普通索引

UNIQUE   唯一索引(不能有重复)

FULLTEXT 全文索引(检索文本信息)

如上所见我就不过多叙述了

 

按字段需求选择合适的索引后会考虑到选择Btree还是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 索引有着与刚才所讨论特点的相比截然不同的特点:

1.Hash 索引只能够用于使用 = 或者 <=> 运算符的相等比较(但是速度更快)。Hash 索引不能够用于诸如 < 等用于查找一个范围值的比较运算符。依赖于这种单值查找的系统被称为 "键-值存储";对于这种系统,尽可能地使用 hash 索引。

2.优化器不能够使用 hash 索引来加速 ORDER BY 操作。这种类型的索引不能够用于按照顺序查找下一个条目。

3.MySql 无法使用 hash 索引估计两个值之间有多少行(这种情况由范围优化器来决定使用哪个索引)。如果你将一张 4.MyISAM 或 InnoDB 表转换成一个 hash 索引的内存表时,一些查询可能会受此影响。

查找某行记录必须进行全键匹配。而 B-tree 索引,任何该键的左前缀都可用以查找记录。


原文地址:http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值