哈希索引

  哈希索引就是通过一个哈希函数计算出某个key的hash值,并以这个hash值去找到目标数据。例如:对于数据库的一行数据,对其主键进行hash运算,得到一个地址,这个地址指向这行记录的存储地址,key与hash值的对应关系就构成了哈希索引。根据某一列进行查询时,如果为这一列建立了哈希索引,那查询的速度是非常快的,只需对其进行一次hash运算即可直接得到地址拿到数据,时间复杂度为O(1)。

  但是众多MySQL存储引擎中,支持哈希索引的引擎却比较少,如Memory、NDB等。广泛使用的InnoDB引擎也只是会自适应的建立哈希索引,如某几行记录的查询频率非常高的情况,但是不能手动建立。这是因为,哈希索引虽然查询速度非常快,但是它的特性是通过key经过hash函数运算得到地址,散列存储即连续的key得到的地址却不是连续的。这就决定了哈希索引只适合等值查询,而不适合范围查询,而范围查询又是非常普遍的,还有就是数据规模一大hash运算的冲突概率会上升的非常快,等值查询的速度也没有优势了。

伪哈希索引

  虽然使用哈希索引有诸多不便,但我们也可以从它做法中得到某些启示。比如将复杂且长数据进行hash运算得到一个简单映射值,但不将这个映射值作为地址,而是为这些映射值建立一个B+树的索引,这样再走索引查询时效率就会提高很多。比如有一个列存储url,这是一个比较长的字符串比较时效率不高,则可以考虑增加一列hashUrl,存储url经过hash运算的值,最好是一个整数。例如:

  url                                                    hahsUrl

----------------------------------------------------------------------

"http://www.mysql.com"                     118291010

"http://www.apache.com"                   318291011

然后为hashUrl建立B+树的索引,查询url时:

 select * from table1 where hashUrl  = hashFunc("http://www.mysql.com");         //hashFunc就是某个hash函数

为了一次性的解决hash冲突的问题,可以在后面加上直接按url查询的条件:

 select * from table1 where hashUrl  = hashFunc("http://www.mysql.com")
and url = "http://www.mysql.com"; //hashFunc就是某个hash函数

当 hashFunc("http://www.mysql.com")得到的整数在索引中不止一个时,即发生了冲突,这时第二个条件就发挥了作用,做进一步筛选。最重要的是:经过第一个用整数的条件筛完后,第二个直接用字符串筛选的记录就非常少了,不会又导致了效率的降低。因此使用伪哈希索引查询时,把原本的列也加入查询条件是一种很好的办法。

注意:一定要仔细衡量使用伪哈希索引的得失,有时它带来的收益可能是负的。因为这样做表就要徒增一列,浪费存储空间,且每次更改、插入原数据都要用hash函数运算哈希值写到存储其哈希值的列,也是一笔开销。当某列的数据类型确实长度大、且比较时效率低,且通过它查询的情况十分多,则可以考虑伪哈希索引。

MySQL技巧--伪哈希索引的更多相关文章

  1. mysql优化之伪哈希索引

    想法非常简单,在标准的B-Tree索引上创建一个伪哈希索引.它和真正的哈希索引不是一回事,因为它还是使用B-Tree索引进行查找.然而,它将会使用键的哈希值进行查找,而不是键自身.你所要做的事情就是在 ...

  2. mysql在B-Tree上创建伪哈希索引

    构建哈希的过程 select过程 长字符串下,构建索引可通过自定义哈希作为索引,本人通过实验,在3百多个数据记录的下,性能效果很明显,完全不是一个等级.以下为索引前后几种情况对比 无索引的url:直接 ...

  3. MySQL中自适应哈希索引

    自适应哈希索引采用之前讨论的哈希表的方式实现,不同的是,这仅是数据库自身创建并使用的,DBA本身并不能对其进行干预.自适应哈希索引近哈希函数映射到一个哈希表中,因此对于字典类型的查找非常快速,如SEL ...

  4. [日常] MySQL的哈希索引和原理研究测试

    1.哈希索引 :(hash index)基于哈希表实现,只有精确匹配到索引列的查询,才会起到效果.对于每一行数据,存储引擎都会对所有的索引列计算出一个哈希码(hash code),哈希码是一个较小的整 ...

  5. mysql索引之一:索引基础(B-Tree索引、哈希索引、聚簇索引、全文(Full-text)索引区别)(唯一索引、最左前缀索引、前缀索引、多列索引)

    没有索引时mysql是如何查询到数据的 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储10 ...

  6. SQL Server2014 哈希索引原理

    SQL Server2014 哈希索引原理 翻译自:http://www.sqlservercentral.com/blogs/sql-and-sql-only/2015/09/08/hekaton- ...

  7. MySQL B+树索引和哈希索引的区别

      导读 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议. 二者区别 备注:先说下,在MySQL文档里,实际上是把B+树索引写成了BT ...

  8. MySQL中的自适应哈希索引

    众所周知,InnoDB使用的索引结构是B+树,但其实它还支持另一种索引:自适应哈希索引. 哈希表是数组+链表的形式.通过哈希函数计算每个节点数据中键所对应的哈希桶位置,如果出现哈希冲突,就使用拉链法来 ...

  9. MySQL B+树索引和哈希索引的区别(转 JD二面)

    导读 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议. 二者区别 备注:先说下,在MySQL文档里,实际上是把B+树索引写成了BTRE ...

随机推荐

  1. Windows环境下Mysql 5.7读写分离简单记录

    一.目的 本文记录了在Windows环境中,mysql数据库读写分离配置过程. 二.准备: Master机器:Windows 10 虚拟机,IP:192.168.3.32 Slave机器:Window ...

  2. Delphi的类与继承

    既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解.有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样:也有人说dephi实际上是面向过程的,他 ...

  3. <nginx.conf> nginx设置用户权限

    问题在于,我们使用weblogic在前台系统获取其他系统的文件,然后保存在webloigc目录下,然后配置了nginx来当http服务器,这样,其他的系统可以来下载文件,但是访问的时候提示403错误, ...

  4. hibernate 2 多对多映射

    一.实体类 1.Classes.java package cn.gs.wwg.entity; import java.util.Set; public class Classes { private ...

  5. 2d平台怪物逻辑

    2d来回巡逻 遇到坑会自动转向 可配置单次方向行走的时间,转向等待时间等 using System; using System.Collections; using System.Collection ...

  6. MSSQL注入--反弹注入

    明明是sql注入的点,却无法进行注入,注射工具拆解的速度异常的缓慢,错误提示信息关闭,无法返回注入的结果,这个时候你便可以尝试使用反弹注入, 反弹注入需要依赖于函数opendatasource的支持, ...

  7. 伯努利分布、二项分布、多项分布、Beta分布、Dirichlet分布

    1. 伯努利分布 伯努利分布(Bernoulli distribution)又名两点分布或0-1分布,介绍伯努利分布前首先需要引入伯努利试验(Bernoulli trial). 伯努利试验是只有两种可 ...

  8. centos7下执行firewall-cmd显示ImportError: No module named 'gi'

    centos7 安装tomcat 及问题处理(No module named 'gi')(Job for firewalld.service failed because the control) 2 ...

  9. centos 7 里如何判断IP是否合法

    ip=123.23.2.32; [[ $ip =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9 ...

  10. Linux运维的第三周总结

    01. 下列文件中, 包含了主机名到IP地址的映射关系的文件是()       A. /etc/HOSTNAME    B. /etc/hosts    C. /etc/resolv.conf    ...