哈希索引

  哈希索引就是通过一个哈希函数计算出某个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. Xcode升级10.3后XIB文件报错

    Xcode升级10.3后XiB文件包错,提示: Failed to find or create execution context for description '<IBCocoaTouch ...

  2. C# WPF 擦出效果,刮图效果

    找了很久 <Window x:Class="TestWebbowser.TestMaskWind" xmlns="http://schemas.microsoft. ...

  3. 三:flask-配置文件的两种方式

    项目中,配置的参数一般采用配置文件的形式,方便统一管理 第一种方式:模块的形式:使用app.config.from_object(config)的方式加载配置文件,此方式需要导入配置文件视为模块 第二 ...

  4. 测开之路一百二十六:flask之获取request请求数据

    可以根据flask的request对象获取所有的请求信息 path = request.path # 获取请求地址method = request.method # 获取请求方法ip = reques ...

  5. 【奇技淫巧】使用 SSH 转发 Sock5 流量

    标题:使用 SSH 转发 Sock5 流量 日期:2018-06-27 介绍:使用 ssh 来做个 sock5 的代理,穿透到内网中做后渗透 0x01. 基本信息 在 ubuntu(10.211.55 ...

  6. JDK7新特性

    二进制字面量 数字字面量可以出现下划线 switch语句可以用字符串 泛型简化 异常的多个catch合并 try..with...resource语句 import java.io.FileReade ...

  7. unity监听粒子播放结束

    需要在粒子上挂脚本 脚本添加代码 public void OnParticleSystemStopped() { Debug.Log("粒子停止"); } 这是个生命周期 粒子的 ...

  8. scala 使用case 关键字定义类不需要创建对象直接调用

    1.必须是使用case 定义object类 package config import org.apache.spark.sql.SparkSession import org.apache.spar ...

  9. java中public、private、protected区别

    类中的数据成员和成员函数据具有的访问权限包括:public.private.protect.friendly(包访问权限) 1.public:public表明该数据成员.成员函数是对所有用户开放的,所 ...

  10. uwsgi + nginx 部署python项目(一)

    uWSGI uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI / uws ...