【高性能索引1】

东西有点杂,是读书杂记。

B-TREE的索引适用于全键值、键值范围,或键前缀查找。


其限制:

如果不是按照索引的最左列开始查找,则无法使用索引。key(a,b,c) 要查 b c 列将不能使用到该索引

不能跳过索引中的列。例如 key(a,b,c) 要查满足 a c 的行 这样也不行。已经跳过了b

如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找。

where last_name='Smaith' AND first_name LIKE 'J%' AND dob ='2014-02-08' 即使建立了索引 key(last_name,first_name,dob) dob就利用不到索引了

所有顺序至关重要



哈希索引 链表记录值

只存储哈希值 和行指针 不存储字段值

无法用于排序

无法支持部分索引列匹配查询。如在数据列(a,b) 建立哈希索引,如果只想查a 则无法使用该缩影

适用于memory 引擎

只支持等值比较  = in <=> <>不支持范围比较 如a>11


创建自定义哈希索引

应用场景 索引需要存储大量的url数据

如 select id from urltable where url = "http://www.1030car.com" ;

我们删除原来在url 上的索引建立新的索引列  url_crc 列的索引

select id from urltable where url = "http://www.1030car.com" and url_crc=CRC32("http://www.1030car.com") ;


举例

CREATE TABLE urlcelect(

id int unsigned NOT NULL auto_increment,

url varchar(255) NOT NULL,

url_crc int unsigned NOT NULL DEFAULT 0,

PRIMARY KEY(id)

);

但是需要维护哈希值

因而我们创建触发器解决这个问题

DELIMITER @@

CREATE TRIGGER urlcelect_crc_ins BEFORE INSERT ON urlcelect

FOR EACH ROW

BEGIN

SET NEW.url_crc = crc32(NEW.url);

END;

@@


CREATE TRIGGER urlcelect_crc_upd BEFORE UPDATE ON urlcelect

FOR EACH ROW

BEGIN

SET NEW.url_crc=crc32(NEW.url);

END;

@@

DELIMITER ;

接下来就只是测试数据了。

INSERT INTO urlcelect(url) VALUES('http://www.1030car.com');

select * from urlcelect;

update urlcelect set url='http://www.1030car.com/' where id=1;

select * from urlcelect;

wKioL1L2RpfBF7ecAAHdWDaeZjE018.jpg

如果用这种伪哈希索引不要使用 sha1() 和md5() 作为哈希函数 因为他们会产生非常长的字符串。目前我们用的crc32 是9位长度

但是会不会起冲突呢。会的。数据量大的话。

解决哈希冲突

select id from url where url_crc = CRC_32("http://www.1030car.com") where url = "http://www.1030car.com";


想索引能给我们带来什么好处?

挖空脑瓜子想了3个

索引能大大减少服务器需要扫描的数据量

索引可以帮助服务器避免排序和临时表

索引可以将随机I/0 变为有序I/O



你可能感兴趣的:(索引,B-Tree,哈希索引)