百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

MYSQL-索引分类(三)

toyiye 2024-06-21 12:14 8 浏览 0 评论

1、索引定义

MySql官方定义是这样的

Indexes are used to find rows with specific column values quickly.

Without an index, MySQL must begin with the first row and then read through the entire table to find the relevant rows.

The larger the table, the more this costs.

If the table has an index for the columns in question, MySQL can quickly determine the position to seek to in the middle of the data file without having to look at all the data. This is much faster than reading every row sequentially.

索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。表越大,成本越高。如果表中有相关列的索引,MySQL可以快速确定要在数据文件中间寻找的位置,而无需查看所有数据。这比按顺序读取每一行要快的多。

通俗的理解就相当于一本字典的目录,如果你想快速查找某个字,就可以根据目录查找出对应的页码位置。

2、索引分类

索引从存储引擎的角度来看,共分4类索引,分别为B+Tree索引,哈希索引,全文索引,空间索引。

2.1 索引对比

索引类型

优点

不足

应用场景

B+Tree

  1. 最左前缀匹配,查询速度快
  2. 顺序存储,适合范围查询
  1. 不按照索引最左列开始查找,无法使用索引;
  2. 不能跳过索引列;
  1. 范围查询eg: like,右边所有列无法使用索引;

InnoDb存储引擎默认索引

哈希索引

查询速度非常快

  1. 索引数据非顺序存储,无法应用排序;
  2. 不支持部分索引列匹配查找。
  1. eg:数据列(A,B)建立索引,只查数据列A无法应用索引。
  2. 只支持等值查询(=,in),不支持范围查询(>)
  1. 哈希冲突过多,索引维护代价大

Memory存储引擎默认索引;

NDB集群引擎;

全文索引

查找关键词,适合长文本场景匹配

  1. 相关性判断方式单一(词频)
  2. 数据量过大,无法全部加载到内存,搜索速度很慢。
  1. 影响查询优化器(索引选择,where子句,order by)


相似度查询,搜索引擎

空间索引(R_Tree)

各类维度组合查询数据,无需前缀匹配

MySQL对GIS支持不完善

MyISAM支持,但更好的替代是postgresql的PostGIS

2.2 索引原理介绍

接下来重点针对我们常用的两类索引,b+tree索引,哈希索引进行原理的浅析

2.2.1 B+Tree 索引

  1. 非叶子节点只存储键值对信息。
  2. 所有的值存储在最底层叶子节点,节省空间。
  1. 顺序存储,便于范围搜索。


如上图说明

b+树索引数据的存储方式

浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(橙色所示)和指针(红色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。

真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非叶子节点不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。

b+树的查找过程

举例说明:要查找数据项29的过程,

1、首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计。

2、通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针。

3、通过指针加载磁盘块7到内存,发生第三次IO,同时内存中做二分查找,找到29,结束查询。

总计三次IO。真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。

2.2.2 哈希索引

1、基于哈希表实现

2、哈希冲突,链表存储

存储方式

如上图,用户U2和U4根据哈希算法计算出来的值都是N,虽然形成哈希冲突,后续的值以链表的形式存储。

查找过程

键值key通过Hash映射找到桶bucket。在这里桶(bucket)指的是一个能存储一条或多条记录的存储单位。一个桶的结构包含了一个内存指针数组,桶中的每行数据都会指向下一行,形成链表结构,当遇到Hash冲突时,会在桶中进行键值的查找。

假设,这时候你要查U2对应的名字是什么,处理步骤就是:

首先,将U2通过哈希函数算出N;然后,按顺序遍历,找到U2对应的节点,得到对应的值NAME2。

需要注意的是,图中四个用户的值并不是递增的,这样做的好处是增加新的用户时速度会很快,只需要往后追加。但缺点是,因为不是有序的,所以哈希索引做区间查询的速度是很慢的。

你可以设想下,如果你现在要找身份证号在[U_X, U_Y]这个区间的所有用户,就需要全表扫描。

Hash冲突定义

如果桶的空间小于输入的空间,不同的输入可能会映射到同一个桶中,这时就会产生Hash冲突,如果Hash冲突的量很大,就会影响读取的性能。

通常Hash值的字节数比较少,简单的4个字节就够了。在Hash值相同的情况下,就会进一步比较桶(Bucket)中的键值,从而找到最终的数据行。

Hash值的字节数多的话可以是16位、32位等,比如采用MD5函数就可以得到一个16位或者32位的数值,32位的MD5已经足够安全,重复率非常低。

总结

今天介绍了MySQL的常见索引分类,对比了每一类索引的优缺点及适用场景,同时对B+tree索引,Hash索引的原理进行深入浅出的讲解,下一节,将重点介绍MySQL B+tree索引的最佳实践。


个人主页网站:https://travelprogrammer.com/

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码