码迷,mamicode.com
首页 > 数据库 > 详细

数据库索引(一)

时间:2018-04-15 23:28:50      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:java

索引在mysql中也叫做键(key),是存储引擎用于快速找到记录的一种数据结构。

常见索引类型:

1. B-Tree索引

大多数mysql引擎都支持这种索引;B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同;存储引擎不需要进行全表扫描来获取需要的数据,取而代之是从索引的根节点开始进行搜索;

适用于:

A. 全键值查找(全值匹配)

B. 键值范围(若是有多列的合并索引,需要精确匹配某一列并范围匹配另一列)

C. 键前缀查找

D. 按顺序查找(order by

限制:

A. 如果不是按照索引的最左列开始查找,则无法使用索引

B. 不能跳过索引中的列

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

2. 哈希索引

mysql中,只有memory引擎显式支持哈希索引;基于哈希表实现,只有精确匹配索引所有列的查询才有效;对于每一行数据,存储引擎会对所有的索引列计算一个哈希码,不同的键值行计算出的哈希码不一样,哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针;(hash索引结构:hash值:指针)

优势:

查找速度非常快

限制:

A. 无法用于排序

B. 不支持部分索引列匹配查找

C. 只支持等值比较查询

存储引擎不支持哈希索引时,可以建立自定义哈希:

如:建表pseudohashidurlurl_crc;

建立触发器:insert数据时 set new.url_crc = crc32(new.url);

Update数据时 set new.url_crc = crc32(new.url);

查找:select url , url_crc from pseudohash where url_crc = crc32(www.baidu.com) and url = www.baidu.com;

where语句中带人hash值和对应列值。

索引的优点:

1. 大大减少了服务器需要扫描的数据量

2. 帮助服务器避免排序和临时表

3. 将随机I/O变为顺序I/O

索引优化

1. 前缀索引

问题:有时候索引需要存储很长的字符串,会让索引变得大且慢

解决:1. hash索引 2. 前缀索引

索引的选择性:不重复的索引值 / 数据表的记录总数,数值越高性能越好;

唯一索引的选择性是1,性能是最好的

计算适合的前缀长度,使前缀的选择性接近于完整列的选择性。Mysql无法使用前缀索引做order bygroup by,也无法使用前缀索引做覆盖扫描;

2. 选择合适的索引列顺序

将选择性最高的列放在索引最前列


数据库索引(一)

标签:java

原文地址:http://blog.51cto.com/13580976/2103750

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!