iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL面试题讲解之如何设置Hash索引
  • 706
分享到

MySQL面试题讲解之如何设置Hash索引

2024-04-02 19:04:59 706人浏览 泡泡鱼
摘要

除了B-Tree 索引,Mysql还提供了如下索引: Hash索引 只有Memory引擎支持,场景简单 R-Tree索引 MyISAM的一个特殊索引类型,主要

除了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 BEGIN
SET NEW.email_hash=crc32(NEW.email);
END;
|
CREATE TRIGGER user_hash_update BEFORE UPDATE ON `User` FOR EACH ROW BEGIN
SET 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/155854.html(转载时请注明来源链接)

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

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

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

下载Word文档
猜你喜欢
  • MySQL面试题讲解之如何设置Hash索引
    除了B-Tree 索引,MySQL还提供了如下索引: Hash索引 只有Memory引擎支持,场景简单 R-Tree索引 MyISAM的一个特殊索引类型,主要...
    99+
    2024-04-02
  • 如何解析MySQL索引问题
    今天就跟大家聊聊有关如何解析MySQL索引问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。0 前言这篇文章不会讲解索引的基础知识,主要是关于MyS...
    99+
    2024-04-02
  • ASP索引、JavaScript面试官会问到的问题?——如何在面试中应对ASP索引和JavaScript问题?
    在Web开发中,ASP索引和JavaScript是两个非常重要的概念。在面试中,面试官经常会询问关于这两个概念的问题。因此,了解这些问题并且知道如何应对它们,对于成功通过面试至关重要。 一、ASP索引 ASP索引是一种用于加快Web应用程...
    99+
    2023-07-21
    索引 面试 javascript
  • 如何准备 Python 和 Apache 相关的索引面试问题?
    Python 和 Apache 是当今最受欢迎和广泛使用的技术之一。如果你想在这些技术领域找到一份工作,那么你需要在面试中展示你的知识和技能。在本文中,我们将介绍一些与 Python 和 Apache 相关的常见面试问题,并提供一些示例代码...
    99+
    2023-08-10
    apache 索引 面试
  • oracle设置索引失效如何解决
    当Oracle中的索引失效时,可以尝试以下解决方法:1. 重新构建索引:使用ALTER INDEX语句来重新构建索引。例如,ALTE...
    99+
    2023-08-23
    oracle
  • ASP面试题:如何优化索引以提高程序效率?
    在ASP程序开发中,优化索引是提高程序效率的一种常见方法。索引是数据库中用于提高查询效率的重要工具,它可以使得查询数据的速度得到大幅度的提升。在本文中,我们将介绍如何优化索引以提高程序效率,并通过演示代码来帮助理解。 一、索引的基本概念 ...
    99+
    2023-06-08
    面试 索引 编程算法
  • 如何在面试中回答关于 Java 索引缓存的问题?
    Java 索引缓存是一个非常重要的话题,特别是在面试中可能会被问到。本文将介绍 Java 索引缓存的概念、工作原理以及如何在面试中回答相关问题。 什么是 Java 索引缓存? Java 索引缓存是一种在内存中存储数据库索引数据的技术。它的作...
    99+
    2023-10-29
    索引 缓存 面试
  • 网站页面索引问题如何解决以提高SEO
    网站页面索引问题对SEO有显著影响,解决方案可以分为三个主要领域:一、识别和分析索引问题;二、采取适当措施解决索引问题;三、监控和持续优化。索引问题可能导致搜索引擎无法正确抓取和显示网站内容,进而影响排名。例如,通过确保搜索引擎可以访问和理...
    99+
    2023-10-29
    如何解决 索引 页面
  • MySQL位图索引如何解决用户画像问题
    这篇文章主要介绍了MySQL位图索引如何解决用户画像问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。用户画像的原始表,有一亿记录,100多...
    99+
    2024-04-02
  • 如何解决MySQL批量插入和唯一索引问题
    这篇文章主要介绍了如何解决MySQL批量插入和唯一索引问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MySQL批量插入问题在开发项目时,...
    99+
    2024-04-02
  • 如何在Java面试中回答关于索引和异步编程的问题?
    在Java面试中,面试官通常会询问你关于索引和异步编程的问题。这些问题非常重要,因为它们涉及到Java编程中的关键概念和技术。在本文中,我们将深入探讨如何回答这些问题,并提供一些演示代码。 一、索引 索引是一种用于优化数据库查询性能的技术。...
    99+
    2023-06-15
    面试 索引 异步编程
  • 如何在 HTTP 面试中准确地回答与 PHP 索引相关的问题?
    HTTP 面试中的 PHP 索引问题可能是许多 PHP 开发人员面试过程中会遇到的问题。在这篇文章中,我们将讨论如何准确地回答与 PHP 索引相关的问题。 在 PHP 中,索引是一个非常重要的概念。 PHP 支持多种类型的索引,包括数字索引...
    99+
    2023-10-03
    索引 http 面试
  • 如何解决MySQL报错:错误的索引文件,尝试修复
    解决MySQL报错“错误的索引文件,尝试修复”的步骤如下:1. 首先,停止MySQL服务。可以使用命令行输入以下命令来停止MySQL...
    99+
    2023-10-12
    MySQL
  • 如何解决MySql整型索引和字符串索引失效或隐式转换问题
    这篇文章主要为大家展示了“如何解决MySql整型索引和字符串索引失效或隐式转换问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决MySql整型索引和字符串索引失效或隐式转换问题”这篇文章...
    99+
    2023-06-25
  • 如何使用MySQL位图索引解决用户画像问题
    这篇文章给大家分享的是有关如何使用MySQL位图索引解决用户画像问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。每个bigint类型包括60个记录的位信息.但是第0位表示第六十...
    99+
    2024-04-02
  • 面试官最关注的技能之一:如何在Java面试中展示您的索引和异步编程能力?
    在Java面试中,面试官最关注的技能之一就是索引和异步编程能力。索引和异步编程是Java开发中非常重要的技能,能够帮助开发者更好地处理海量数据和高并发请求。本文将介绍如何在Java面试中展示您的索引和异步编程能力,并提供一些示例代码。 一、...
    99+
    2023-06-15
    面试 索引 异步编程
  • 如何解决win10系统设置搜索不到问题
    这篇文章主要介绍了如何解决win10系统设置搜索不到问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。点击任务栏中的小娜按钮,在弹出的搜索框中输入:控制面板 点击打开控制面板...
    99+
    2023-06-28
  • 如何在Go语言面试中展示你对二维码和索引的理解?
    在Go语言面试中,展示自己对于二维码和索引的理解是非常重要的。这两个概念是在Go语言编程中经常用到的,因此掌握它们对于一个程序员来说是非常必要的。 二维码是一种矩阵式的条码,它可以存储大量的信息,并且可以被快速扫描读取。在Go语言中,我们可...
    99+
    2023-07-03
    二维码 索引 面试
  • 索引和异步编程:在Java面试中被问到的常见问题和如何回答?
    在Java面试中,索引和异步编程是两个非常常见的问题。本文将介绍这两个问题,并提供如何回答这些问题的一些提示。 索引 在数据库中,索引是一种用于加速查询的数据结构。在Java中,我们可以使用索引来加速数组、列表和映射等数据结构的访问。 在...
    99+
    2023-06-15
    面试 索引 异步编程
  • 如何解决MySql远程连接的设置问题
    这篇文章将为大家详细讲解有关如何解决MySql远程连接的设置问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 如果使用 web 和数据库不在同一台服务器上,MySQL...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作