如果需要存储大量的URL并需要根据URL进行搜索查找。如果使用B-Tree 来存储URL,存储的内容就会很大,因为URL本身都很长。正常情况下会有如下查询:

SELECT id FROM url WHERE url="http://www.baidu.com";

  若删除原来URL上的索引,而新增一个被索引的url_crc列,使用CRC32做hash ,就可以用下面的方式查询:

SELECT id FROM url WHERE url='http://www.baidu.com' AND rul_crc=CRC32('http://www.baidu.com');

  这样做性能非常高,因为MySQL 优化器会使用这个选择性很高而体积很小的基于url_crc列的索引来完成查找。即使有多个相同的索引值,查找任然很快,只需要根据hash值做快速的整数比较就能找到索引条目,然后一一返回对应的行。另外一种方式就是对完整的URL字符串做索引,那样会非常慢。

  这样实现的缺陷是需要维护hash值。可以手动维护,可以触发器实现。如果采用这种方式,记住,不要使用SHA1()和MD5()作为哈希函数。因为这两个函数计算出来的hash值时非常长的字符串,会浪费更大的空间,比较时也会更慢。SHA1()和MD5()是强加密函数,设计目标是最大限度的消除冲突,蛋这里并不需要这样搞的要求。简单hash函数的冲突在一个可以接受的范围,同事有能提供更好的性能。

  如果数据表非常大,CRC32()会出现大量的hash冲突,则可以考虑自己实现一个简单的64位hash函数。这个自定义的函数要返回整数,而不是字符串。一个简单的办法可以使用MD5()函数返回值的一部分来作为自定义hash函数。这肯能比自己写一个hash算法的性能要差,不过这样实现最简单。

  SELECT CONV(RIGHT(MD5('http://www.baidu.com'),16),16,10) AS HASH64.

  处理hash冲突。当使用hash索引进行查询的时候,必须在WHERE子句中包含常量值:

  SELECT id from url WHERE url=crc32('http://www.baidu.com') AND url='http://www.baidu.com';

  一旦出现hash冲突,另一个字符串的hash值也恰好是相同的,则下面的语句是无法正确工作的:

  SELECT id from url WHERE url=crc32('http://www.baidu.com');

  因为所谓的‘生日悖论’ 出现hash冲突的概率的增长率可能比想象的要快的多,CRC32()返回的是32位整数,当索引有9.3W条记录时,出现冲突的概率是1%。例如,我们将'/usr/share/dic/words' 中的词倒数数据表,并进行crc32()计算,最后会有98569行。这就已经出现一次hash冲突了。要避免hash冲突问题,必须在WHERE 条件中带入hahs值和对应的列值。如果不是想查询具体的值,例如只是统计记录数(不精确的),则可以不带入列值,直接使用crc32()的hash值查询即可。还可以使用FNV64()函数作为hash函数,hash值为64位,速度非常快,且冲突比crc32()要少很多。

  

  

    

转载于:https://www.cnblogs.com/zhengyanqiu/p/4979195.html

Mysql 索引的基础(下)相关推荐

  1. mysql索引的使用[下]

    接着上篇,我们继续来探究索引.这次我们主要来探究关于联合索引的使用和联合.多表查询的规范. 继续看一下数据: mysql> select * from student order by ID d ...

  2. mysql索引 物理文件_MySQL架构和MySQL索引

    1.MySQL架构 1.1逻辑架构图 1.1.1Connection Pool:连接池 *管理缓冲用户连接,线程处理等需要缓存的需求. *负责监听对MySQL Server的各种请求,接收连接请求,转 ...

  3. 一文搞懂底层mysql 索引那些事

    前言 因为一些原因,最近总有人问起mysql的一些问题,这个似乎成为检验程序员的技术的基本问题,今天就做个系统性的总结,留作以后复习,也分享给需要的同学. 索引是为了加速对表中数据行的检索而创建的一种 ...

  4. Linux下Mysql数据库的基础操作

    Linux下Mysql数据库的基础操作 一.Mysql数据介绍 二.数据库相关术语介绍 1.数据库相关名词 2.相关术语介绍 三.Mysql数据库的管理 1.创建数据库用户 2.查询用户状态 3.修改 ...

  5. (19)一篇掌握MySQL数据库基础下 基本操作(外键约束、建表原则、多表查询、子查询)

    MySQL数据库基础下 一.修改表--添加外键约束 二.多表之间的建表原则 1.建数据库原则:通常情况下,一个项目/应用建一个数据库 2.多表之间的表原则: (1)一对多:分类和商品 (一个分类对应多 ...

  6. MySQL索引基础续

    背景 承接上文MySQL索引基础,本文讨论查询优化(Query optimization) 写在前面 参考文章http://blog.codinglabs.org/articles/theory-of ...

  7. Mysql索引的原理、调优及其相关基础知识

    索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是一种数据结构. 数据库查询是数据库的主要功能之一,最基本的 ...

  8. mysql按升序创建索引_MySQL建立索引的基础规则

    1.mysql索引(基础与规则) 索引规则: 一.MySQL建表,字段需设置为非空,需设置字段默认值. 二.MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三.MySQL建表 ...

  9. mysql索引排序算法_MySQL中利用索引对数据进行排序的基础教程

    MySQL中,有两种方式生成有序结果集:一是使用filesort,二是按索引顺序扫描.利用索引进行排序操作是非常快的,而且可以利用同一索引同时进行查找和排序操作.当索引的顺序与ORDER BY中的列顺 ...

最新文章

  1. Gut:刘星吟/王益超/曹爱华等揭示孤独症患儿肠道菌群发育轨迹图谱(赵方庆点评)...
  2. ML之SVM:基于SVM(sklearn+subplot)的鸢尾花iris数据集的前两个特征(线性不可分的两个样本),判定鸢尾花是哪一种类型
  3. 【渝粤题库】陕西师范大学210006幼儿园课程作业(高起专)
  4. 谷歌跟oracle_谁赢得了Google VS Oracle? 开发人员赢了。
  5. DotNet 网上相关资源
  6. 求整数 在二进制表示中有多少个1的方法
  7. 单镜头反光相机是什么
  8. windows无法访问指定设备_恢复 你的电脑/设备需要修改 未连接或无法访问所需设备。...
  9. 微信java版s40_微信诺基亚下载
  10. 35岁没成高管被优化了.... 网友炸了!!!
  11. 顶岗实习周记java方向_java程序员的实习周记
  12. 雷电模拟器一直android正在启动,雷电安卓模拟器启动后没反应、无法启动、闪退的3种解决办法-针对2020年4月4号出现的...
  13. 地理信息安全在线培训考试-判断题
  14. 微信小程序开发入门与实战(Behaviors使用)
  15. python3安装完,出现 No module named '_ssl',解决方案
  16. GBA火焰纹章改版-智慧的结晶
  17. Socket实战——Teardrop代码编程
  18. Android 软键盘功能键(EditText)
  19. 使用python画函数图像
  20. 计算机考研英语大纲,考研计算机大纲

热门文章

  1. php mysql int string_php从mysql取出int数据,变成了string
  2. 二等水准测量记录数据_公路水准测量培训道路放样测量学习
  3. 【Nginx】截取URL中某个参数Parameter
  4. 【微信小程序】给绑定事件传参数
  5. 【maven】Missing artifact javax.jms:jms:jar:1.1:compile
  6. mysql collectset_005.hive列转行 (collect_set() 去重)
  7. r型聚类分析怎么做_营销型网站怎么做?
  8. android活动管理器,Android 中管理所有的 Acyivity 活动
  9. python中exception类的_什么是Python异常?Python异常的种类
  10. 树型列表结构宽度调整_Material Design 网格列表