mysql 字典索引_【大白话mysql】你真的了解 mysql 索引吗?

本文来源于公众号: 跬步匠心

什么是索引?

当我们使用汉语字典查找某个字时,我们会先通过拼音目录查到那个字所在的页码,然后直接翻到字典的那一页,找到我们要查的字,通过拼音目录查找比我们拿起字典从头一页一页翻找要快的多,数据库索引也一样,索引就像书的目录,通过索引能极大提高数据查询的效率。

索引的实现方式

在数据库中,常见的索引实现方式有哈希表、有序数组、搜索树。

哈希表

哈希表是通过键值对(key-value)存储数据的索引实现方式,可以将哈希表想象成是一个数组,将索引通过哈希函数计算得到该行数据在数组中的位置,然后将数据存到数组中,容易发现一个问题,如果两个索引通过哈希函数计算后得到的数组位置相同要怎么办?我们可以采用哈希链表,数组的每个 value 都是一个链表,新数据直接添加到链表尾部。

8e0803c1627619a4fa8e19d2f62102d1.png 所以数据库查询过程为:索引通过哈希函数计算数据所在位置 --> 遍历指定位置的链表,找到满足条件的数据。

每次有新数据加入时,新数据时直接添加到链表尾部,所以添加数据时很方便。

哈希表不擅长进行区间查询,一般都用于等值查询,因为两个相邻索引通过 hash 函数后计算得到的数组位置不一定还保持相邻,需要哈希多次才能把区间的数据全查出来。

有序数组

顾名思义,有序数组是按索引大小将数据保存在一个数组上,因为该数组是有序的,可以通过二分法很容易查到位置,找到第一个位置后,通过向左或者向右遍历很容易得到所求区间的数据。因此,无论是等值查询还是区间查询,效率都极高。

但缺陷也是显而易见的,当向数组中间 n 位置插入一条数据时,需将 n 后面的数据全部往后移动,所以,这种索引一般用于静态存储引擎。

搜索树

二叉搜索树:一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;二叉搜索树的左、右子树也分别为二叉搜索树。

平衡二叉树:平衡二叉树是在二叉搜索树的基础上引入的,指的是结点的左子树和右子树的深度差不超过 1。

多叉树:每个结点可以有多个子结点,子节点的大小从左到右依次递增。

数据库一般使用平衡树来当索引的存储数据结构,当使用平衡二叉实现索引时,结构如下图。

09c4be0392d08ab08e4dd31e9966d783.png 从图中可发现,每次查询最多需要访问 4 个节点必能得到所要数据。例如查询 user2 时,查询过程为:userA-->userC-->userF-->user2。所以查询速度很高,复杂度为 O (log (n));平衡二叉树的更新复杂度也为 O (log (n))。

区间查询时,由于搜索树的特性(左子树小于右子树),可以很快的排除掉不满足条件的节点,查起来速度也是很快的。

思考下为什么用平衡搜索树呢?

因为普通的二叉树可能因为插入的数据最后变成一个很长的链表,查询复杂度退化成 O (n)。

如果搜索树存于内存中,与多叉树相比,二叉树的搜索速率是最高的,但实际上数据库使用的是 n 叉树而不是二叉树。

索引不仅存于内存,还是写到磁盘上,搜索树上的每个结点在磁盘上表现为一个数据块。

多叉树每个结点下可以有多个子节点,所以存储相同数据量时多叉树的树高比二叉树小,查询一个数据需要访问的结点数更少,即查询过程访问更少的数据块。查询速度较高。

在 mysql 的 innodb 引擎中,使用 B + 树来存储数据,B + 树是一种多叉平衡查找树。

innodb 的索引模型

在 B + 树中,我们将节点分为叶子结点和非叶子结点,非叶子结点上保存的是索引,而且一个节点可以保存多个索引;数据全部存于叶子结点上,并且叶子结点之间通过指针连接起来。

根据叶子结点的内容不同,innodb 索引分为主键索引和非主键索引。非主键索引也称为二级索引。主键索引的叶子结点中保存的数据为整行数据,而非主键索引叶子节点保存的是主键的值。

26db9067febdcbf027a9b9035fe8efe9.png

540891afa36077470ada88f07d3890b8.png 通过主键索引查询数据时,我们只需查找主键索引树便可以获取数据;通过非主键索引查询数据时,我们先通过非主键索引树查找到主键值,然后再在主键索引树搜索一次,这个过程称为回表,也就是说非主键索引查询会比主键查询多搜索一棵树。所以我们应尽可能使用主键查询。

B + 树是一颗 N 叉树,N 是由什么决定的?能否调整?

通过修改 page 的大小来间接调整 N 的大小。一个节点上的所有数据都在一个 page 中,页越大,每页存放的索引就越多,N 就越大。数据页调整后,如果数据页太小层数会太深,数据页太大,加载到内存的时间和单个数据页查询时间会提高,需要达到平衡才行。

修改索引的大小。每个索引包括固定字节数的 Point 指针和索引字段内容,索引字段越小,每页能存的索引就越多,N 就越大。

索引维护

添加新行时,将会在索引表上添加一条记录,如果是索引递增插入时,数据都是追加在当前最大索引之后,不会对树中其他数据造成影响;如果新加入的数据的索引值位于节点的中间,需要挪动部分节点的位置,从而保持索引树的有序性。

而且,相邻多个节点是存储在同一个数据页上的,此时,如果是在已经存储满状态的数据页中插入节点,会申请新的数据页,将部分数据挪动到新的数据页,这个过程称为页分裂,页分裂除了会影响性能,还会降低磁盘空间利用率。不规则数据插入时,会造成频繁的页分裂。所以,一般情况下会采用递增主键,使新数据递增插入。

当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。

什么情况下应该使用业务逻辑字段做主键?有什么优缺点?

业务逻辑字段不容易保证索引树结点有序插入,这样写入成本较高。

innodb 默认使用整数类型作为主键,主键长度较小,二级索引的叶子结点中保存的是主键值,主键长度越小,二级索引的叶子结点占用空间也就越小。

当然,使用业务逻辑字段做主键也有好处,可以避免回表,每次只需扫描一次主键索引树即可。

综上,从性能和存储空间方面考量,自增主键往往是更合理的选择,但是当业务场景有且只有一个索引,而且该索引为唯一索引时,此时更适合使用业务逻辑字段作为主键,一个是避免回表,还有一个是只有一个索引也不需要考虑二级索引的空间占用情况了。

索引重建

因为数据修改、删除、页分裂等原因,会导致数据页空间利用率降低,此时,可以考虑重建索引,将数据按顺序插入,提高磁盘空间利用率。

重建普通索引时,直接先删除索引,再重新创建即可。

alter table T drop index k;

alter table T add index(k);

复制代码

主键索引不能通过上面的语句去重建,因为删除主键索引后,innodb 会如下处理:

如果存在非空且字段类型为数值的唯一索引(INT and NOT NULL and UNIQUE INDEX), 会将第一个满足条件的索引作为主键索引 , _rowid 为对应主键,值与唯一索引相同。(可通过 select _rowid from table 查询)。

如果找不到合适的索引,那么 InnoDB 会自动生成一个不可见的名为 ROW_ID 的列名为 GEN_CLUST_INDEX 的主键索引,该列是一个 6 字节的自增数值,随着插入而自增。

所以删除主键索引的结果其实是修改了主键字段,而普通索引的叶子节点存的是主键的值,所以,一旦修改了主键字段,普通索引也会有影响,叶子节点的值将被修改成新的主键字段。

当主键索引需要重建时,更好的做法是直接使用 alter table t engine=innodb 重建表。

写在最后

喜欢本文的朋友,欢迎关注公众号「跬步匠心」,专注大白话分享实用技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql使用jtable_jtable 的简单使用

做后台管理管理系统时,基于ajax的数据操作和富有表现力的数据绑定插件jtable绝对是一个不错的选择,他接收来自服务器端的json格式的数据。而且他是一款开源的基于jquery和jquery ui的插件,您可以根据自己的需要修改其表现,如css&a…

java自定义菜单跳转页面_微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解...

微信公众号开发 自定义菜单请先读完本文再进行配置开发请先前往微信平台开发者文档阅读“网页授权获取用户基本信息”的接口说明在微信公众账号开发中,往往有定义一个菜单,然后用户点击该菜单就进入用户个人中心的功能,通常应用于各个公众账号…

贝叶斯理论基础理解

从贝叶斯方法谈到贝叶斯网络: http://blog.csdn.net/zdy0_2004/article/details/41096141 1 思考模式 比如往台球桌上扔一个球,这个球落会落在何处呢?如果是不偏不倚的把球抛出去,那么此球落在台球桌上的任一位置都有着相同的机…

C++如何实现DNS域名解析转

C如何实现DNS域名解析 这片文章介绍了C如何实现DNS域名解析,还有对相关技术的介绍,代码很详细,需要的朋友可以参考下一、概述 现在来搞定DNS域名解析,其实这是前面一篇文章C实现Ping里面的遗留问题,要干的活是ping的过程中画红线的…

高等代数第3版下 [丘维声 著] 2015年版_2020年成人高考 专升本 高等数学复习攻略...

成人高考的高等数学考试按照专业属性分为理工类和经管类,高等数学一直是成考中的比较不好拿分的科目,也是大家复习备考的难点。今天,小编给大家分享一些答题技巧和必备的公式,帮助大家一起来搞定高等数学,希望这份资料…

java虚拟机10.内存模型与线程

多任务处理在现代计算机操作系统中是一项必备的功能,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,更重要的原因是计算机的运算速度与它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O,网…

php仿微信上传图片压缩,PHP仿微信多图片预览上传实例代码

生产图片区域,上传按钮#btn可替换自己想要的图片plupload上传var uploader new plupload.Uploader({//创建实例的构造方法runtimes: html5,flash,silverlight,html4, //上传插件初始化选用那种方式的优先级顺序browse_button: btn, // 上传按钮url: "ajax.php…

笔记本电脑如何保养_嘉兴专业笔记本电脑喷漆加工厂价格实惠

嘉兴专业笔记本电脑喷漆加工厂价格实惠 [xznugcbx]不宜大量储存或久存,做好通风设施。自喷漆如果大量泄露操作人员应迅速撤离泄露污染区人员到安全区域,因罐内的二甲醚气体具有轻微的毒性,并将污染区域进行隔离,罐内的气体跟空气中…

css 滤镜之AlphaImageLoader

CreateTime--2017年12月25日17:05:37 Author:Marydon ie滤镜特效之AlphaImageLoader 作用: 用于设置背景图片特效样式 使用条件: IE8及以下版本不支持属性background-size,可以使用AlphaImageLoader来代替 语法: filter : progid:…

企业是否应该实现对客户需求的快速响应_互联网企业的数据化迭代和数据化应用...

数字时代,品牌和消费者正经历数字化的变革,谁能真正实现企业数据赋能,谁就是残酷市场竞争下的优胜者。企业需要加快实现全数据治理工具的研发,用数据推动企业发展。本文作者结合案例分享了关于企业数字化的方法论与感知响应模型&a…

windows server 触屏_宜昌触屏万能蒸烤箱价格-华春新能源有限公司

首页 > 新闻列表 > 浏览文章发布时间:2020-10-27 08:47:06 浏览量: 5导读:华春新能源有限公司为您提供宜昌触屏万能蒸烤箱价格的相关知识与详情: 所述水箱与水较少时的水位达到一个比预定热气体电磁阀被打开时系统压力平衡…

3ds Max制作碗实例教程

一、 碗的建模。模型的结果如图WB—1所示: 图WB—1 1. 创建圆柱,并调节参数,转换到多边形,最终的结果图WB—2所示: 图WB—2 2.使用Inset(插入)插入一个面,再次执行Extrude&#xff0…

unity hub服务器无响应_累积更新KB4541335反馈称无法安装 出现无响应情况

几天前微软面向Windows 10 Version 1903/Version 1909功能更新,发布了累积更新KB4541335,主要改善了开始菜单和文件管理器。不过部分用户在Feedback Hub上反馈无法安装该更新,过程中会收到错误信息。用户反馈称会收到“2020-03 Cumulative Up…

电脑二维码怎么扫描_扫描模组方案是如何满足多种应用场景需求?

随着自动识别技术的发展,扫描模组逐渐成为各个领域上的配套,然而很多人还停留在“主扫”的观念上,殊不知如今的“被扫”更受人们的欢迎,即采用硬件解码的方式去识读条形码或二维码。远景达作为扫描模组方案公司,在不断…

cad刷新快捷键_第16期分享:常用电脑快捷键是哪些?

电脑键盘快捷键的使用能很好的提高工作效率,所谓的快捷键就是使用键盘上某一个或某几个键的组合完成一条功能命令,从而达到提高操作速度的目的。善于使用快捷键能更快捷的使用电脑,那么电脑键盘快捷键有哪些呢?下面小编就来详细介绍一下常用…

ALSA声卡12_从零编写之添加音量控制_学习笔记

1、设置音量时应用程序的调用过程 (1)strace分析: amixer cset numid1 30 (设置音量) /dev/snd/controlC0 open SNDRV_CTL_IOCTL_CARD_INFO SNDRV_CTL_IOCTL_PVERSION SNDRV_CTL_IOCTL_ELEM_INFO SNDRV_CTL_IOCTL_ELEM_READSNDRV_CTL_IOCTL_E…

twrp3.3.0刷n9002_插画师必备笔刷,送你5套iPad5.0新出300款大神笔刷

由于插画行业的蒸蒸日上,人们对于插画的喜爱程度也大大提高。本身由于插画的趣味性,因此插画成为了不论在男女老幼之间都十分受欢迎的存在。尤其是目前来说最受欢迎之一的iPad插画绘制设计,相信很多在做的同学都有过想要学习插画设计的冲动&a…

恒压板框过滤实验数据处理_高考化学实验中:那些不常见的【特殊仪器】与装置,难得的资料...

高考化学实验试题中有时会涉及到一些不常见的仪器装置,增大了试题分析解答的难度。学长现将一些特殊仪器与装置都一一整理出来,供小伙伴们参考学习,以后试题中再见到它们就再也不怕啦!1.三颈烧瓶(三颈烧瓶&…

pr如何处理音效,如何让你的声音变得干净又清晰?PR音频降噪教程

大家好,我是兴业,欢迎来到我的PR教程。受周围环境的影响,相信很多小伙伴在录制自己的vlog视频时都会产生或多或少的噪音,就拿笔者来说,本来就是合租的房子,室友又经常打游戏,所以很难找到一个安…

苹果笔记本电脑好用吗_苹果新品发布会消息汇总(8月25日)

随着苹果秋季发布会的临近,各种关于新 iPhone 的爆料也逐渐由外观向一些更具体的产品细节上聚焦。就在近日,一向在苹果新品上有着较准确爆料信息的彭博社又发文对未来数周和数月内苹果将发布或升级的一系列新产品进行了信息汇总。我们一起来了解下。  …