MySQL技巧--伪哈希索引
哈希索引
哈希索引就是通过一个哈希函数计算出某个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技巧--伪哈希索引的更多相关文章
- mysql优化之伪哈希索引
想法非常简单,在标准的B-Tree索引上创建一个伪哈希索引.它和真正的哈希索引不是一回事,因为它还是使用B-Tree索引进行查找.然而,它将会使用键的哈希值进行查找,而不是键自身.你所要做的事情就是在 ...
- mysql在B-Tree上创建伪哈希索引
构建哈希的过程 select过程 长字符串下,构建索引可通过自定义哈希作为索引,本人通过实验,在3百多个数据记录的下,性能效果很明显,完全不是一个等级.以下为索引前后几种情况对比 无索引的url:直接 ...
- MySQL中自适应哈希索引
自适应哈希索引采用之前讨论的哈希表的方式实现,不同的是,这仅是数据库自身创建并使用的,DBA本身并不能对其进行干预.自适应哈希索引近哈希函数映射到一个哈希表中,因此对于字典类型的查找非常快速,如SEL ...
- [日常] MySQL的哈希索引和原理研究测试
1.哈希索引 :(hash index)基于哈希表实现,只有精确匹配到索引列的查询,才会起到效果.对于每一行数据,存储引擎都会对所有的索引列计算出一个哈希码(hash code),哈希码是一个较小的整 ...
- mysql索引之一:索引基础(B-Tree索引、哈希索引、聚簇索引、全文(Full-text)索引区别)(唯一索引、最左前缀索引、前缀索引、多列索引)
没有索引时mysql是如何查询到数据的 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储10 ...
- SQL Server2014 哈希索引原理
SQL Server2014 哈希索引原理 翻译自:http://www.sqlservercentral.com/blogs/sql-and-sql-only/2015/09/08/hekaton- ...
- MySQL B+树索引和哈希索引的区别
导读 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议. 二者区别 备注:先说下,在MySQL文档里,实际上是把B+树索引写成了BT ...
- MySQL中的自适应哈希索引
众所周知,InnoDB使用的索引结构是B+树,但其实它还支持另一种索引:自适应哈希索引. 哈希表是数组+链表的形式.通过哈希函数计算每个节点数据中键所对应的哈希桶位置,如果出现哈希冲突,就使用拉链法来 ...
- MySQL B+树索引和哈希索引的区别(转 JD二面)
导读 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议. 二者区别 备注:先说下,在MySQL文档里,实际上是把B+树索引写成了BTRE ...
随机推荐
- C#学习基础
c#的值类型存储在栈里,而引用类型的引用存储在栈里,数据存储在堆里. c#new关键字为对象分配一个引用而非存储数据. 引用类型关键字ref: For example: Int y; void mym ...
- 性能测试工具之WebBench
一.简介 WebBench是一款在Linux下使用非常简单的压力测试工具.它的原理是:WebBench首先fork出多个子进程,每个子进程都循环做web访问测试.子进程把访问的结果通过pipe告诉父进 ...
- python获取csv文本的某行或某列数据
#coding = 'utf-8' import csv # 使用list,只能读取列,而且是全文读取,csv.reader会自动把CSV内容生成数组 ''' df = csv.reader(open ...
- Java与C#不同
1.C#方法定义可以有默认参数,而Java则不支持该方式. C#方法定义 public void ShowMessage(string text,string orderId="" ...
- [转帖]NetSuite 进入中国市场满一年,甲骨文公布首份成绩单
NetSuite 进入中国市场满一年,甲骨文公布首份成绩单 https://baijiahao.baidu.com/s?id=1617073148682281883&wfr=spider&am ...
- 【监控实践】【4.2】perfmon监控性能计数器(基于typeperf命令)
关键词:typeperf typeperf 命令 使用示例: 案例1:#使用typeperf收集windows cpu.内存.硬盘性能 #使用typeperf收集windows cpu.内存.硬盘性能 ...
- 制作的第一个java小游戏
package java1; import java.awt.*; public class java1 extends Frame { //球桌和桌球图片 Image ball = Toolkit. ...
- 算法(C#版)动态规划和贪心算法
https://blog.csdn.net/kouzhuanjing1849/article/details/88954811
- python查询mysql中是否存在某张表(传参)
客户端输入了表的名字,服务端判断表是否存在. 参考:https://blog.csdn.net/qq_36523839/article/details/80639297 需要导入re模块: impor ...
- IBM公司的面试题,看看你能做出多少。
进入IBM差不多是每一个IT人的梦想.IBM公司向来以高素质人才作为企业持续竞争力的保证,所以经常出一些千奇百怪的面试题,来考验一个人的综合能力,以下是5道IBM曾经出过的面试题,看看你能作出几道: ...