索引是帮助mysql获取数据的数据结构。最常见的索引是Btree索引和Hash索引。

不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引。

Hash索引

所谓Hash索引,当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过多次的磁盘IO,但是innodb和myisam之所以没有采用它,是因为它存在着好多缺点:

1、因为Hash索引比较的是经过Hash计算的值,所以只能进行等式比较,不能用于范围查询

1、每次都要全表扫描

2、由于哈希值是按照顺序排列的,但是哈希值映射的真正数据在哈希表中就不一定按照顺序排列,所以无法利用Hash索引来加速任何排序操作

3、不能用部分索引键来搜索,因为组合索引在计算哈希值的时候是一起计算的。

4、当哈希值大量重复且数据量非常大时,其检索效率并没有Btree索引高的。

 

Btree索引

至于Btree索引,它是以B+树为存储结构实现的。

但是Btree索引的存储结构在Innodb和MyISAM中有很大区别。

在MyISAM中,我们如果要对某张表的某列建立Btree索引的话,如图:

所以我们经常会说MyISAM中数据文件和索引文件是分开的。

因此MyISAM的索引方式也称为非聚集,Innodb的索引方式成为聚集索引。

至于辅助索引,类似于主索引,唯一区别就是主索引上的值不能重复,而辅助索引可以重复。

因此当我们根据Btree索引去搜索的时候,若key存在,在data域找到其地址,然后根据地址去表中查找数据记录。

至于Innodb它跟上面又有很大不同,它的叶子节点存储的并不是表的地址,而是数据

我们可以看到这里并没有将地址放入叶子节点,而是直接放入了对应的数据,这也就是我们平常说到的,Innodb的索引文件就是数据文件,

那么对于Innodb的辅助索引结构跟主索引也相差很多,如图:

我们可以发现,这里叶子节点存储的是主键的信息,所以我们在利用辅助索引的时候,检索到主键信息,然后再通过主键去主索引中定位表中的数据,这就可以说明Innodb中主键之所以不宜用过长的字段,由于所有的辅助索引都包含主索引,所以很容易让辅助索引变得庞大。

我们还可以发现:在Innodb中尽量使用自增的主键,这样每次增加数据时只需要在后面添加即可,非单调的主键在插入时会需要维持B+tree特性而进行分裂调整,十分低效。

Btree索引中的最左匹配原则:

Btree是按照从左到右的顺序来建立搜索树的。比如索引是(name,age,sex),会先检查name字段,如果name字段相同再去检查后两个字段。

所以当传进来的是后两个字段的数据(age,sex),因为建立搜索树的时候是按照第一个字段建立的,所以必须根据name字段才能知道下一个字段去哪里查询。

所以传进来的是(name,sex)时,首先会根据name指定搜索方向,但是第二个字段缺失,所以将name字段正确的都找到后,然后才会去匹配sex的数据。

建立索引的规则:

1、利用最左前缀:Mysql会一直向右查找直到遇到范围操作(>,<,like、between)就停止匹配。比如a=1 and b=2 and c>3 and d=6;此时如果建立了(a,b,c,d)索引,那么后面的d索引是完全没有用到,当换成了(a,b,d,c)就可以用到。

2、不能过度索引:在修改表内容的时候,索引必须更新或者重构,所以索引过多时,会消耗更多的时间。

3、尽量扩展索引而不要新建索引

4、最适合的索引的列是出现在where子句中的列或连接子句中指定的列。

5、不同值较少的列不必要建立索引(性别)。

原文链接:http://blog.csdn.net/u014307117/article/details/47325091

转载于:https://www.cnblogs.com/yiweiyihang/p/8340351.html

Hash索引和BTree索引相关推荐

  1. Hash索引和BTree索引区别

    Hash索引和BTree索引区别 Hash仅适用于对等比较(=.>.<.>=.<=.between),而BTree可以支持like模糊查询. 不同的引擎支持不同的索引:Inno ...

  2. Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——2-5

    --理解适当使用每个索引对性能的影响 Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?--1-5 Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?--2-5 ...

  3. Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——4-5

    --理解适当使用每个索引对性能的影响 Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?--1-5 Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?--2-5 ...

  4. mysql索引btree hash_Hash索引和BTree索引

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  5. MySQL索引类型 btree索引和hash索引的区别

    来源一 Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 ...

  6. Mysql Hash索引和B-Tree索引区别(Comparison of B-Tree and Hash Indexes)

    上篇文章中说道,Mysql中的Btree索引和Hash索引的区别,没做展开描述,今天有空,上Mysql官方文档找到了相关答案,看完之后,针对两者的区别做如下总结: 引用维基百科上的描述,来解释一下这两 ...

  7. mysql 的hash和b tree_mysql索引hash索引和b-tree索引的区别

    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...

  8. PostgreSql索引(B-tree索引 Hash索引 GiST索引 SP-GiST索引 GIN 索引 BRIN 索引)

    索引 语法: CREATE INDEX test1_id_index ON test1 (id); 索引的名字test1_id_index可以自由选择,但我们最好选择一个能让我们想起该索引用途的名字. ...

  9. mysql btree检索策略_MySQL之Btree索引和HASH索引的区别以及索引优化策略

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

最新文章

  1. 硬盘老大哥被曝豪掷200亿美元,要收了全球第二大闪存芯片厂,外媒:半导体行业秩序要变...
  2. char string 区别
  3. Redis的快照与AOF
  4. python统计窗口函数怎么处理_python时间序列:移动窗口函数前篇
  5. 本博客弃用,请移步http://ningios.com查看最新
  6. 优先级反转和解决方法
  7. 盘点Spring Boot最核心的27个注解
  8. Preparing Cities for Robot Cars【城市准备迎接自动驾驶汽车】
  9. Yarn分布式集群操作系统
  10. 预测纽约出租车行程时间
  11. 计算机和数学 论文参考文献,数学与计算机参考文献外国 数学与计算机核心期刊参考文献哪里找...
  12. C语言中文件指针,文件位置指针,详细解析
  13. 阿里年薪百万的P7架构师简历都长什么样?他们都是怎么学习的?
  14. python关键词排名批量查排名_Python批量查询百度排名
  15. 秒杀系统学习-seckill
  16. 系统—怎么关闭windows自带的安全中心
  17. android设置wifi蓝牙共享文件,无需互联网或蓝牙即可通过WiFi通过android共享文件...
  18. [WARNING IsDockerSystemdCheck]: detected “cgroupfs“ as the Docker cgroup driver. The recommended dri
  19. 哈佛结构与冯诺依曼结构(含STM32系统结构解析)
  20. 史上最牛总结!电源完整性设计请看这一篇

热门文章

  1. js动态添加meta标签
  2. echarts生成json地图最简单代码
  3. java的poi导出Excel文件
  4. 三维重建4:Jacobian矩阵和Hessian矩阵
  5. OpenCV:Adaboost训练时数据扩增
  6. ObjecT4:On-line multiple instance learning (MIL)学习
  7. 理解ATL中的一些汇编代码
  8. PHP脚本占用内存太多,解决方案
  9. Spring Boot集成CKFinder
  10. JUnit测试框架的使用经验分享