iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中怎么设置Hash索引
  • 327
分享到

MySQL中怎么设置Hash索引

2023-06-25 11:06:14 327人浏览 独家记忆
摘要

这篇文章主要讲解了“MySQL中怎么设置Hash索引”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mysql中怎么设置Hash索引”吧!除了B-Tree 索引,mysql还提供了如下索引:H

这篇文章主要讲解了“MySQL中怎么设置Hash索引”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mysql中怎么设置Hash索引”吧!

除了B-Tree 索引,mysql还提供了如下索引:

  • Hash索引

只有Memory引擎支持,场景简单

  • R-Tree索引

MyISAM的一个特殊索引类型,主要用于地理空间数据类型

  • Full-text

MyISAM的一个特殊索引,主要用于全文索引,从Mysql 5.6开始InnoDB支持全文索引

索引 / 存储引擎MyISAMInnoDBMemoryB-Tree索引支持支持支持HASH索引不支持不支持支持R-Tree索引支持支持不支持Full-text索引支持支持不支持

最常用的索引也就是B-tree索引和Hash索引,且只有Memory, NDB两种引擎支持Hash索引。 Hash索引适于key-value查询,通过Hash索引比B-tree索引查询更加迅速。但Hash索引不支持范围查找例如<><==,>==等。 Memory只有在"="的条件下才会使用hash索引

MySQL在 8.0才支持函数索引,在此之前只能对列的前面某一部分进行索引,例如标题title字段,可以只取title的前10个字符索引,这样的特性大大缩小了索引文件的大小,但前缀索引也有缺点,在order by和group by操作时失效。

create index idx_title on film(title(10));

1 特点

只存在数组,用一个hash函数把key转换成一个确定的内存位置,然后把value放在数组的该位置。使用 hash 自然会有哈希冲突可能,MySQL 采取拉链法解决。

Hash索引基于Hash表实现,只有查询条件精确匹配Hash索引中的列时,才能够使用到hash索引。对于Hash索引中的所有列,存储引擎会为每行计算一个hashcode,Hash索引中存储的就是hashcode。

  • 例如一个维护了身份证号和姓名的表,根据身份证号查找对应名字,其hash索引如下:

MySQL中怎么设置Hash索引

比如我们想查ID_card_n4对应username:

  • 将ID_card_n4通过hash函数算出A

  • 按顺序遍历,找到User4

四个ID_card_n值并不一定递增,这样即使增加新的User,速度也快,只需在后追加。 当然缺点也很明显,不是有序,所以hash索引做区间查询速度很慢。比如要找身份证号在[ID_card_X, ID_card_Y]区间的所有用户,就须全表扫描。

2 Hash索引的缺陷

  • 必须二次查找

  • 不支持部分索引查找、范围查找

  • 哈希码可能存在哈希冲突,如果hash 算法设计不好,碰撞过多,性能也会变差

  • 索引存放的是hash值,所以仅支持 < = > 以及 IN

  • 无法通过操作索引来排序,因为存放的时候会经过hash计算,但是计算的hash值和存放的不一定相等,所以无法排序

  • 不能避免全表扫描,只是由于在memory表里支持非唯一值hash索引,即不同的索引键,可能存在相同hash值

  • 因为哈希表是一种根据关键字直接访问内存存储位置的数据结构 ,所以利用其原理的hash 索引,也就需要将所有数据文件添加到内存,这就很耗内存

  • 如果所有的查询都是等值查询,那么hash确实快,但实际上范围查找数据更多

  • 智能处理键值得全值匹配

  • 查询Hash函数决定着索引键的大小

要使InnoDB或MyISAM支持哈希索引,可以通过伪哈希索引来实现,叫自适应哈希索引。

可通过增加一个字段,存储hash值,将hash值建立索引,在插入和更新的时候,建立触发器,自动添加计算后的hash到表里。

哈希表这种结构适用于只有等值查询的场景,比如Memcached。

3 案例应用

假如有一个非常非常大的表,比如用户登录时需要通过email检索出用户,如果直接在email列建索引,除了索引区间匹配,还要进行字符串匹配比对,email短还好,如果长的话这个查询代价就比较大。 若此时,在email建立哈希索引,查询以int查询,性能就比字符串比对查询快多了。

Hash 算法

建立哈希索引,首先就要选定哈希算法,《高性能MySQL》说到的CRC32算法。

INSERT UPDATE SELECT 操作

在表中添加hash值的字段:

ALTER TABLE `User` ADD COLUMN email_hash int unsigned NOT NULL DEFAULT 0;

接下来就是在UPDATE和INSERT时,自动更新 email_hash 字段,通过触发器实现:

DELIMITER |CREATE TRIGGER user_hash_insert BEFORE INSERT ON `User` FOR EACH ROW BEGINSET NEW.email_hash=crc32(NEW.email);END;|CREATE TRIGGER user_hash_update BEFORE UPDATE ON `User` FOR EACH ROW BEGINSET NEW.email_hash=crc32(NEW.email);END;|DELIMITER ;

这样SELECT请求就会变成:

SELECT `email`, `email_hash` FROM `User` WHERE email_hash = CRC32(“xxoo@gmail.com”) AND `email`= “xxoo@gmail.com”;

+----------------------------+------------+
| email                    |  email_hash  |
+----------------------------+------------+
| xxoo@gmail.com | 2765311122 |
+----------------------------+------------+

AND email = "xxoo@gmail.com" 是为了防止哈希碰撞时数据不准确。

感谢各位的阅读,以上就是“MySQL中怎么设置Hash索引”的内容了,经过本文的学习后,相信大家对MySQL中怎么设置Hash索引这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中怎么设置Hash索引

本文链接: https://www.lsjlt.com/news/304311.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中怎么设置Hash索引
    这篇文章主要讲解了“MySQL中怎么设置Hash索引”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中怎么设置Hash索引”吧!除了B-Tree 索引,MySQL还提供了如下索引:H...
    99+
    2023-06-25
  • MySQL面试题讲解之如何设置Hash索引
    除了B-Tree 索引,MySQL还提供了如下索引: Hash索引 只有Memory引擎支持,场景简单 R-Tree索引 MyISAM的一个特殊索引类型,主要...
    99+
    2024-04-02
  • mysql中B+Tree索引和Hash索引有什么区别
    这篇文章主要为大家展示了“mysql中B+Tree索引和Hash索引有什么区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql中B+Tree索引和Hash索引有什么区别”这篇文章吧。1、...
    99+
    2023-06-15
  • mysql中怎么设置唯一索引
    在mysql中设置唯一索引的方法:1.命令行启动mysql服务;2.登录mysql;3.进入数据库;4.执行“ALTER TABLE `表名` ADD UNIQUE (`列名`);”创建唯一索引;在mysql中设置唯一索引的方法首先,在命令...
    99+
    2024-04-02
  • mysql中聚合索引怎么设置
    在mysql中设置聚合索引的方法:1.命令行启动mysql服务;2.登录mysql;3.进入数据库;4.执行“ALTER TABLE `表名` ADD INDEX (`索引1` ,`索引2`) ;”命令添加聚合索引;在mysql中设置聚合索...
    99+
    2024-04-02
  • mysql怎么设置主索引
    在mysql中设置主索引的方法:1.命令行启动mysql服务;2.登录mysql;3.进入数据库;4.执行“ALTER TABLE `表名` ADD PRIMARY KEY ( `列名` )”命令添加主索引;在mysql中设置主索引的方法首...
    99+
    2024-04-02
  • 怎么使用PostgreSQL中Hash索引
    本篇内容介绍了“怎么使用PostgreSQL中Hash索引”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!逻...
    99+
    2024-04-02
  • mysql索引长度怎么设置
    在mysql中为索引设置长度的方法:1.命令行启动mysql服务;2.登录mysql;3.进入数据库;4.执行“alter table '表名' add index index_title(`列名`);”创建索引;5.执行“...
    99+
    2024-04-02
  • mysql前缀索引怎么设置
    在mysql中设置前缀索引的方法:1.命令行启动mysql服务;2.登录mysql;3.选择数据库;4.执行“CREATE INDEX '表名' ON products('列名'(13)); ”命令创建前缀索...
    99+
    2024-04-02
  • mongodb怎么建立hash索引
    在MongoDB中,可以通过使用`createIndex()`方法来建立一个哈希索引。首先,连接到MongoDB数据库。然后,选择要...
    99+
    2023-09-06
    mongodb
  • mysql一两种索引方式hash和btree
    索引是帮助mysql获取数据的数据结构。最常见的索引是Btree索引和Hash索引。 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引。 1. Hash索引: H...
    99+
    2023-09-01
    mysql 数据库
  • MongoDB中使用hash索引有什么限制
    在MongoDB中,使用hash索引有以下限制: Hash索引仅适用于精确匹配查询,不支持范围查询或排序操作。 在对大型数据集进行...
    99+
    2024-04-19
    MongoDB
  • MySQL中怎么设置存储引擎
    今天就跟大家聊聊有关MySQL中怎么设置存储引擎,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。MySQL设置存储引擎 1)查询存储引擎l ...
    99+
    2024-04-02
  • mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用
    这篇文章主要介绍了mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。聚集索引(Clustered Index)聚集索引就是...
    99+
    2023-06-29
  • mysql中groupby怎么用索引
    在 mysql 中使用 group by 时,索引的使用可以极大地提高性能,前提是:确保索引列与 group by 子句中的列匹配。创建复合索引以提高分组涉及多个列时的性能。使用覆盖索引...
    99+
    2024-05-09
    mysql 聚合函数
  • MySQL中怎么使用索引
    今天就跟大家聊聊有关MySQL中怎么使用索引,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  MySQL何时使用索引  对一个键码使用>,&g...
    99+
    2024-04-02
  • mysql中怎么查看索引
    本篇文章为大家展示了mysql中怎么查看索引,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。SHOW INDEX FROM tbl_name [FROM db_nam...
    99+
    2024-04-02
  • MySQL中怎么创建索引
    在MySQL中,可以使用CREATE INDEX语句来创建索引。语法如下: CREATE INDEX index_name ON t...
    99+
    2024-04-09
    MySQL
  • Mysql索引该怎么设计与优化
    小编给大家分享一下Mysql索引该怎么设计与优化,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是索引?数据库索引是一种数据结构,它以额外的写入和存储空间为代价来提高数据库表上数据检索操作的速度。通俗来说,索引类似于书的...
    99+
    2023-06-08
  • oracle设置索引失效怎么解决
    当Oracle的索引失效时,可能是因为统计信息不准确或者索引损坏等原因导致。解决方法如下: 重新收集索引的统计信息:可以使用DB...
    99+
    2024-04-09
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作