(3)mysql index

2023-05-16

生活中的索引

最常见的书籍是有目录的,也可以叫做为索引。


为啥用索引?

为快不破,为了快速的查找到我们想要的东西,书中的索引可以快速查询到我们想看的章节内容。DB中的索引亦是如此。


索引本质

本质就是查找算法和数据结构,学过很多查找算法,顺序查找、二分查找、归并查找等等,如果DB不加索引就是对全表进行扫描,所说的全表扫描就是顺序查找。而mysql InnoDB中的索引就是有二分查找算法中的二分思想,二分查找是需要数据的排列是有序的
索引是对数据表中的一个或者多个列进行排序的数据结构,以协助快速查询、更新数据库表中数据。


mysql索引类型

B+ 树索引
全文索引
哈希索引
常用的和最有效的是B+树索引,本篇主要说B+树索引

磁盘IO与预读

考虑到磁盘IO是非常昂贵的操作,计算机操作系统做了一下优化,当一次IO时,不仅把当前磁盘地址的数据读取到内存缓冲区,也会把相邻的数据也会读取到缓存区。因为当计算机访问一个地址的时候,与其相邻的数据也会很快被访问到,每一次IO读取称为一页。

mysql一个区中有多少页被顺序访问时,InnoDB存储才启用预读?
我们可以查看参数innodb_read_ahead_threshold

mysql> show variables like 'innodb_read_ahead_threshold';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| innodb_read_ahead_threshold | 56    |
+-----------------------------+-------+
1 row in set (0.01 sec)

当一个区中的56个页已经被访问过并且为顺序访问的,则会预读下一个区的所有页。(来自《mysql内幕 InnoDB存储引擎》)


B+树索引

B+树索引的构造类似于二叉树,根据(key value)快速找到数据。
B+数(balance Tree)能找到被查找数据所在的页。然后数据库通过把页读入到内存再在内存中进行查找,最后得到要查找的数据。

索引是对数据表中一个或者多个列的值进行排序的数据结构,以协助快速查询更新数据库表中的数据。索引加快了访问速度,因为存储引擎不会再去扫描整张表得到需要的数据;相反,他从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速的寻找数据。)
图片来自网络

非叶子节点: 不存储真实的数据,只存储指引搜索方向的数据项。
叶子节点:存储真实的数据,每个磁盘块中是一页,一页4k或8k

叶子和叶子之间:B+tree所有的叶子节点通过指针连接在一起

B+树的查找过程及其性质
例如查找3,从根节点开始查找,会把根节点的磁盘块加载到内存,此时会发生一次IO,然后根据磁盘块1的指针,找到磁盘块2,把磁盘块2加载到内存,然后通过指针指向找到磁盘块5,把磁盘块5加载到内存。
在内存中用二分查找法查找到3。所以找到3一共发生了三次IO,3层的b+树可以表示上百万的数据,如果上百万数据查找需要三次IO,性能将是很大的提高,如果索引顺序查找百万数据成本是非常高的。
一般索引要求索引字段越小越好,一页的大小是固定的,当索引字段(例如int bigint )所占字节大的,磁盘块中存放的数据就会少,树的高度就会越高,这样IO次数就会增加,反之就会减少

最左匹配原则
(A,B,C)组合索引,索引生效的是A AB ABC ,而AC只是A走索引了,C不会走索引,而BC也完全不会走索引。因为b+树是按照从左向右的顺序来建立搜索树的,只有当搜索到A才会搜索到B,才会找到C。也就是搜索的方向确定了,如果是AC,只会搜索到A,下一个字段B缺失了。

为什么B+树比B树更适合作为数据库和文件的索引?

数据库采用B+树为非B树: B+树只要遍历叶子节点就可以实现整棵树的遍历,而在数据库中基于范围的查找是非常频繁的,而B树查找只能用中序遍历,效率较低。
B+树查询效率稳定:叶子节点是索引,非叶子节点是指向,任何查找都是从根节点到叶子节点的路程,所以查找路径长度相同,每个数据的查询效率相当。


什么情况下需要建立索引?

1 、表的主键会自动添加上主键索引。
2、经常与其他表进行连接的字段,需要在这个字段上添加上索引。
3、经常出现在where字段后,特别是需要大表查询的,需要建立索引。
4、索引需要建立在小的字段上,对于大文本或者超长的字段不要建立索引。
5、复合索引建立需要仔细分析;尽量用单字段索引代替。
6、如果复合索引中包含的字段超过3个,考虑必要性,考虑减少复合自断。
7、复合索引字段是否经常以and方式出现在where字句中?单个查询是否极少或者没有?如果是,则建立复合索引,否则需要建立单个索引。
8、经常出现在order by 、group by、distinct后面字段。


索引注意事项

以”%”号开头的like模糊匹配语句,不会走索引。
or语句前后没有同时使用索引。
类型出现隐式转换,不会使用索引。
最左匹配原则。


索引分类

普通索引和唯一索引:索引列值唯一性
单个索引和复合索引:索引列包含的列数
聚集索引和非聚集索引:
聚集索引的叶子节点是数据页、每个页通过一个双链表来进行链接的;聚集所以不是物理上连续,而是逻辑上的连续。
非聚集索引(辅助索引):叶子节点除了包含键值外,每个叶节点还包括一个书签。当通过非聚集索引叶子节点的指针,来指向主键索引的主键,然后通过主键索引来找一个完整的行记录。(通过非聚集索引找到聚集索引)


索引与磁盘

我们知道固态硬盘的读写速度要大于普通的机械硬盘。mysql数据库使用ssd呢?

http://fewstreet.com/2014/01/06/mysql-hard-disk-vs-SSD-performance.html
但是也有文章说放到ssd上并没有很大的效果,可能是我们的索引数据结构在机械硬盘和固态硬盘上并没有什么差别,没有利用固态硬盘的优势。

https://blog.2ndquadrant.com/tables-and-indexes-vs-hdd-and-ssd/
而且固态硬盘数据不容易恢复,价格也比普通的机械硬盘昂贵。

书上这样说的,

固态硬盘的接口规范、定义、功能和使用等方面与传统机械硬盘相同,但是他们的内部构造完全不同,固态硬盘没有读写磁头,读取数据需要围绕中心轴旋转,因此,在随机读取性能上有了质的飞跃

mysql官方文档:https://dev.mysql.com/doc/refman/5.6/en/optimizing-innodb-diskio.html

欢迎留言讨论哈

参考:http://blog.csdn.net/justloveyou_/article/details/78308460
参考:https://tech.meituan.com/mysql-index.html

参考:
https://mp.weixin.qq.com/s?__biz=MzI2NjA3NTc4Ng==&mid=2652079363&idx=1&sn=7c2209e6b84f344b60ef4a056e5867b4&chksm=f1748ee6c60307f084fe9eeff012a27b5b43855f48ef09542fe6e56aab6f0fc5378c290fc4fc&scene=0&pass_ticket=75GZ52L7yYmRgfY0HdRdwlWLLEqo5BQSwUcvb44a7dDJRHFf49nJeGcJmFnj0cWg#rd

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(3)mysql index 的相关文章

  • HTAccess - 令人困惑的干净网址

    如果我想简单地重定向 clients page to clients php view page我会使用像这样简单的东西 它效果很好 Options FollowSymlinks RewriteEngine on RewriteRule c
  • MySQL 导入 125000 行 CSV 的最快方法?

    这是我第一次使用 MySQL 除了对现有数据库进行一些基本查询之外 所以我不擅长解决这个问题 我有一个包含 125 000 条记录的 CSV 我想将其加载到 MySQL 中 我安装了版本 8 和工作台 我使用导入向导加载 CSV 它开始导入
  • Java 从 SQL 数组获取 ResultSet 失败

    我试图从数据库中检索电子邮件地址 但没有成功 我的代码如下 Main System out println PortfolioData getEmails 58 So Far Returning null 投资组合数据 public sta
  • MySQL Workbench 6.0 错误无法获取管理员的管理访问权限?

    我在这里使用 MySQL Workbench 6 0 当我选择服务器状态时 出现此错误 对此 我尝试在Google和StackOverflow上寻找解决方案 e g 这个结果 https stackoverflow com question
  • MySQL用户创建的临时表已满

    我使用内存引擎创建了一个临时表 如下所示 CREATE TEMPORARY TABLE IF NOT EXISTS some text id INT DEFAULT 0 string varchar 400 DEFAULT engine m
  • Codeigniter 加入多个条件

    我正在使用 Codeigniter Active Records 课程 我想加入我的users与我的桌子clients表 这样我就可以显示用户的 真实 姓名 而不仅仅是他们的 ID 这是什么clients表看起来像 示例 列 a 1 a 2
  • MySQL 按主键排序

    某些 SQL 服务器允许使用通用语句 例如ORDER BY PRIMARY KEY 我不相信这适用于 MySQL 是否有任何此类解决方法可以允许跨多个表自动选择 或者是否需要查找查询来确定主键 我一直在研究的解决方法包括调用SHOW COL
  • 无法使用 Django 应用程序从容器连接到 MySQL docker 容器

    当我尝试从运行 Django 应用程序的 docker 容器连接到运行 MySQL 的容器时 出现以下错误 django db utils OperationalError 2003 Can t connect to MySQL serve
  • C#:SQL 查询生成器类

    在哪里可以找到好的 SQL 查询构建器类 我只需要一个简单的类来构建 SQL 字符串 仅此而已 我需要它用于 C 和 MySql 我真的不需要像 Linq 或 NHibernate 这样的东西 谢谢 由于 Google 将我引导至此页面 我
  • 将 UPDATE 转换为 INSERT INTO ON DUPLICATE KEY UPDATE 语句

    我有这个 UPDATE MySQL 语句 效果很好 UPDATE table1 Inner Join table2 ON table2 id table1 gw id SET table1 field1 1 table1 field2 2
  • 单行的总和值?

    我有一个 MySQL 查询 它返回由一系列 1 和 0 组成的单行 它用于进度条指示器 我现在在代码中对它进行求和 但我尝试对查询中的值求和 并意识到我无法使用 SUM 因为它们有很多列 但只有一行 有没有办法可以在查询中自动求和 就像这样
  • 在 MacOSX10.6 上运行 python 服务器时 MySQLdb 错误

    运行我的服务器 python manage py runserver 产生以下错误 django core exceptions ImproperlyConfigured 加载 MySQLdb 模块时出错 没有名为 MySQLdb 的模块
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • 无法启动 MySQL 服务器 - 控制进程退出并出现错误代码

    我的 mysql 服务器停止后无法启动 命令使用 sudo etc init d mysql restart Error 重新启动 mysql 通过 systemctl mysql serviceJob for mysql service
  • Python:如何使用生成器来避免 sql 内存问题

    我有以下方法来访问 mysql 数据库 并且查询在服务器中执行 我无权更改有关增加内存的任何内容 我对生成器很陌生 并开始阅读更多有关它的内容 并认为我可以将其转换为使用生成器 def getUNames self globalUserQu
  • 为什么这会返回资源 id #2? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样

随机推荐

  • 一个老外提供的google docs代码。 看着蛋疼..

    最近终于找到些google docs的实现相关文章与代码 xff0c 之前一直在gdocs上面挖掘 现在看到官方的描述感觉蛮亲切的 xff0c 活活 官网描述的google docs的实现思路 xff1a http googledocs b
  • 详解各种iou损失函数的计算方式(iou、giou、ciou、diou)

    本文主要是理解各个回归损失函数的区别和改进 xff0c 其实最主要的还是这些损失函数在yolo中起到了非常大的作用 xff0c 包括从最原始的yolov3中引入 xff0c 到v4 v5中变成真正的官方损失函数 xff0c 确实很有效 本文
  • 1.机器视觉标准框架学习

    在工业机器视觉上 xff0c 常见的图像处理库有opencv halcon visionpro sherlcok等 其中visionpro和sherlcok是拖拽式编程 xff0c 方便用户开发视觉项目 但对于opencv 和halcon则
  • 我的2013,我的回归本质

    以前每到年头年尾总是要求自己要写年度总结 xff0c 写年度计划 xff0c 但到后面都不了了之了 xff0c 想起都觉得惭愧 我是一个大专生 xff0c 专业是电子信息工程 现在大三了 xff0c 感触良多 给自己的大学打个分吧 xff0
  • 二进制的浪漫

    0 基本性质 0 1 交换律 相同运算符下可任意交换 xff0c 不同的运算符不可交换 0 2 结合律 相同运算符是可结合的 0 3 分配律 a amp b
  • 安全多方计算新突破!阿里首次实现“公开可验证” 的安全方案

    阿里妹导读 xff1a 近日 xff0c 阿里安全双子座实验室与马里兰大学等高校合作的论文 Covert Security with Public Verifiability Faster Leaner and Simpler 1 被欧洲密
  • 书--益友--从不孤单

    看看自己的豆瓣读书 想读79 想读的书太多 xff0c 但工作会让读书变成一件奢侈的事情 xff0c 不过庆幸还是有奢侈的时间的 读书让我们快乐 雨果说过 xff0c 书籍是造就灵魂的工具 不知道你和我是否有相同的感受 读书能让我们开心 读
  • (九)分支限界法

    分支限界法 xff08 branch and bound method xff09 按广度优先策略搜索问题的解空间树 xff0c 在搜索过程中 xff0c 对待处理的节点根据限界函数估算目标函数的可能取值 xff0c 从中选取使目标函数取得
  • (七)贪心法

    贪心法比较简单 xff0c 从这个算法的名字看来差不多都了解了 xff0c 贪心 xff0c 贪心的人是只顾一时的利益 xff0c 不顾长远的利益 贪心法把一个问复杂问题分解为一系列较为简单的局部最优选择 xff0c 每一步选择都是对当前的
  • Struts旅程(一)Struts简介和原理

    struts 简介 Struts 是 Apache 软件基金会 xff08 ASF xff09 赞助的一个开源项目 它最初是 jakarta 项目中的一 个子项目 xff0c 并在 2004 年 3 月成为 ASF 的顶级项目 它通过采用
  • Struts旅程(六)Struts页面转发控制ActionForward和ActionMapping

    上篇讲述了 struts 控制器 Action 和 DispatchAction 以及 LookupDispatchAction xff0c 本篇主要说说 struts 中的页面转发控制 xff0c struts 提供了 ActionFor
  • Hibernate旅程(四)Hibernate对数据库删除、查找、更新操作

    上篇 xff0c 我们以向数据库添加操作来演示 hibernate 持久化对象的三种状态 本节继续 hibernate 对数据库的其他操作 xff0c 删除 查询 修改 Hibernate 对数据删除操作 删除 User 表中个一条数据 x
  • 二分查找算法(递归与非递归两种方式)

    首先说说二分查找法 二分查找法是对一组有序的数字中进行查找 xff0c 传递相应的数据 xff0c 进行比较查找到与原数据相同的数据 xff0c 查找到了返回对应的数组下标 xff0c 没有找到返回 1 xff1b 如下示例 xff0c 其
  • 调用微信高级群发接口--视频群发接口出问题(微信官方文档错误纠正)

    这几天在弄项目与微信对接 xff0c 我主要负责将素材 xff08 视频 xff0c 图片 xff0c 缩略图 xff0c 音频 xff09 材料上传到微信服务器上 xff0c 并推送到所关注本平台的用户中 xff0c 从获取accessT
  • (七)Intellij 中的git操作

    git原理以后会分章节介绍 xff0c 本次主要说一下intellij怎样操作git intellij有很好的git操作界面 xff0c 可以拉取代码 xff0c 拉取分支详情 xff0c 提交代码到本地仓库 xff0c 提交代码到远程仓库
  • git 远程代码回滚master

    人总是会有犯错的时候 xff0c 所以我们的代码有时候就需要回滚 当我们要回滚的代码还没有提交到远程的时候 xff0c 可以进行本地回滚 xff0c 较为简单 一 本地回滚 git reset 回退内容到上一个版本 就像现在的自己为成年人
  • 如何搞定技术面试?阿里大牛为你选了8本必备好书

    当工作 生活的节奏越来越快 xff0c 阅读充电似乎也成为了一件奢侈的事 四月既是最美人间天 xff0c 也是阿里春招面试季 为此 xff0c 阿里妹特别策划了 阿里技 书 成长月 xff0c 多位技术大牛为你精挑细选荐好书 xff0c 相
  • (2)mysql--查询部门人数最多的部门

    简述 xff1a 找出部门人数大于或等于10个人的部门 要点 在上一篇的基础上 xff0c 考察having的使用 上篇链接 xff1a http blog csdn net lovesummerforever article detail
  • ll -bash: ls: command not found

    问题简单描述 xff1a centos6安装软件的时候 不知道执行了啥操作 ll ls 命令都不好用了 问题所在 在centos6系统上安装jdk 配置 etc profile 只配置了jdk的环境变量 忘记加入系统的变量 1 网上查了查是
  • (3)mysql index

    生活中的索引 最常见的书籍是有目录的 xff0c 也可以叫做为索引 为啥用索引 xff1f 为快不破 xff0c 为了快速的查找到我们想要的东西 xff0c 书中的索引可以快速查询到我们想看的章节内容 DB中的索引亦是如此 索引本质 本质就