广告
返回顶部
首页 > 资讯 > 数据库 >MySQL索引的用途有哪些
  • 299
分享到

MySQL索引的用途有哪些

2024-04-02 19:04:59 299人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关Mysql索引的用途有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  mysql 索引的作用是什么?一般回答,加速查询,减少磁盘 io.  索引为

这篇文章给大家分享的是有关Mysql索引的用途有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

  mysql 索引的作用是什么?一般回答,加速查询,减少磁盘 io.

  索引为什么可以加速查询,减少磁盘 IO 呢?

  因为索引就像一份字典的目录,可以帮你找到数据的位置。

  嗯,这只是一个比喻,你知道 Mysql 索引的数据结构是长什么样子的吗?

  呃,MySQL 大多数索引都是用的基于 B-tree 的变种,我们习惯叫它 B+ tree,其他的索引还有 hash 索引、R-trees 索引这些。

  好,那你能把 B+tree 画出来,然后讲一下它是如何帮助 MySQL 更快的查询数据的吗?

  很多同学都知道索引的作用是什么、索引是 B+ tree 等等,但是却很少有人能清楚的画出 B+ tree 是如何帮助 MySQL 加速查询的,而不知道这个,也就意味着你无法判断,什么样的 sql 语句会走索引,什么样的 sql 语句走不了索引,而知道这个,则从此一通百通。

  MySQL 的 B+tree 什么样子?

  聚簇索引

  事实上,在你还没有执行 create index 语句的时候,MySQL 里面就已经有棵 B+ tree了。

  执行建表语句:

  CREATE TABLE `student` (

  `id` BIGINT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '主键id',

  `student_no` VARCHAR(64) COMMENT '学号',

  `name` VARCHAR(64) COMMENT '学生姓名',

  `age` INT COMMENT '学生年龄',

  PRIMARY KEY (`id`)

  ) ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='学生信息表';

  插入 5 条数据:

  insert into student(student_no,name,age) values(101,"Alice",18);

  insert into student(student_no,name,age) values(102,"Bob",19);

  insert into student(student_no,name,age) values(104,"Brandt",15);

  insert into student(student_no,name,age) values(105,"David",19);

  insert into student(student_no,name,age) values(109,"David",18);

  在你插入的过程中,MySQL就会用你指定的主键,在这里是递增主键,维护起一颗 B+ 树,用 BPlusTree Visualization 的模拟工具来模拟这颗树的样子:

  如果你有时间,也建议你到这个网站去,从 1 到 5,一个一个插入,你会看到 B+ tree 在插入的过程中是怎么维护它的几个特性的:

  有序:节点左边比右边小;

  自平衡:左右两边数量趋于相等;

  节点分裂:在遇到节点元素过载时,是如何分裂成两个的,其实这个也是 MySQL 页分裂的原理。

  模拟工具只能支持插入一个值,所以你看不到主键之外的其他数据,实际上,B+ tree 的叶子节点是带有行的全部数据的。

  如果没有这棵 B+ tree,你要根据主键查询,比如:

  select * from student where id = 5;

  对不起,数据是无序的,你只能全表扫描。

  现在有了这棵 B+ tree,数据被有规律的存储起来的,查找 id=5 。

  你要访问磁盘的次数,是由这棵树的层数决定的。为了方便说明,我在文章里举的例子的数据量不会太大,所以用不用索引,性能提升的效果不明显,但是你可以自行脑补大数据量的画面。

  如果你没有指定主键呢?没关系, 唯一键 也可以。

  连唯一键也没有?也没关系,mysql会给你建一个 rowid字段 ,用它来组织这棵 B+ tree.

  反正 MySQL 就一个目的,数据要有规律的存储起来,就像之前在 link 数据库是什么 里说的,这是数据库和文件系统的不一样的地方。

  这个 MySQL 无论如何都会建起来,并且存储有完整行数据的索引,就叫 聚簇索引 (clustered index)。

  二级索引

  聚簇索引只能帮你加快主键查询,但是如果你想根据姓名查询呢?

  对不起,看看上面这棵树你就知道,数据并没有按照姓名进行组织,所以,你还是只能全表扫描。

  不想全表扫描,怎么办?那就给姓名字段也加个索引,让数据按照姓名有规律的进行组织:

  create index idx_name on student(name);

  这时候 MySQL 又会建一棵新的 B+ tree。

  你会发现这棵树的叶子节点,只有主键ID,没有完整数据,这时候你执行:

  select * from student where name = "David";

  MySQL 到你刚刚创建的这棵 B+ tree 查询,快速的查到有两条姓名是“David”的记录,并且拿到它们的主键,分别是 4 和 5,但是你是要 select * 呀,怎么办?

  别忘了,MySQL 在一开始就给你建了一颗 B+ tree 了,把这两棵树,放在一起,拿着这两个主键ID,去聚簇索引找,事情不就解决了?

  这个不带行数据信息的索引,就叫 二级索引 (secondary index),也叫辅助索引。

  复合索引

  如果我在根据姓名和年龄同时查询呢?

  select * from student where name = "David" and age = 18;

  还是那个道理,数据虽然按照 name 有规律的组织了,但是没有按照 age 有规律组织,所以我们要给 name 和 age 同时建索引:

  create index idx_name_age on student(name,age);

  这时候 MySQL 又会建一棵 B+ tree,这下 B+ tree 的节点里面,不只有name,还有age了,而且排序时,是先用 name 比较大小,如果 name 相同,则用 age 比较。

  还是那句话,这里举的例子数据量很少,你可以想象下有一万个叫“David”的学生,年龄随机分布在13到20之间,这时候如果没有按照 age 进行有规律的存储,你还是得扫描一万行数据。

  别人都只会用公式,他却时刻牢记这些公式是怎么来的,别人考试就只会套用公司,他却可以用这些公式以外的知识解决问题。

  MySQL 索引也是,很多人都知道索引就像字典的目录,索引是 B+ tree,但是知道这些有什么用呢?

  知识是需要往深里学,才能转化为能力的,你知道的多,并不代表你能解决的问题就多,反而那些知道的没那么多,但是对他知道的东西,都研究透彻的人,才能一通百通。

  当你知道了 MySQL 的聚簇索引-二级索引长成这个样子后,还用去背什么“最左匹配”吗?

  随便问个问题,只给 student 表建 idx_name_age 这个复合索引,这两个 sql 语句,会走索引吗?

  select * from student where name = "David";

  select * from student where age = 18;

  甚至,这么精妙的数据结构设计,就知道用来加速查询吗?

  至少现在我能想到的,索引可以拿来干的事情,就至少有四种。

感谢各位的阅读!关于“MySQL索引的用途有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL索引的用途有哪些

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

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

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

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

下载Word文档
猜你喜欢
  • MySQL索引的用途有哪些
    这篇文章给大家分享的是有关MySQL索引的用途有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  MySQL 索引的作用是什么一般回答,加速查询,减少磁盘 IO.  索引为什...
    99+
    2022-10-19
  • MySQL索引有哪些作用
    这篇文章给大家分享的是有关MySQL索引有哪些作用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、索引简介(1)索引的含义和特定 (2)索引的分类 (3)索引的设计原则二、创建...
    99+
    2022-10-18
  • mysql的索引技巧有哪些
    本篇内容主要讲解“mysql的索引技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql的索引技巧有哪些”吧!一、MySQL三层逻辑架构MySQL的...
    99+
    2022-10-19
  • MySQL索引机制有哪些
    本篇内容主要讲解“MySQL索引机制有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL索引机制有哪些”吧!一、索引是什么MySQL官方对索引的定义为...
    99+
    2022-10-18
  • MySQL索引知识有哪些
    这篇文章主要介绍“MySQL索引知识有哪些”,在日常操作中,相信很多人在MySQL索引知识有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL索引知识有哪些”的疑惑...
    99+
    2022-10-18
  • MySQL索引有哪些法则
    这篇文章给大家介绍MySQL索引有哪些法则,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、最佳左前缀法则1. 定义在创建了多列索引的情况下,查询从索引的最左前列开始且不能跳过索引中的...
    99+
    2022-10-18
  • mysql索引有哪些优点
    本文小编为大家详细介绍“mysql索引有哪些优点”,内容详细,步骤清晰,细节处理妥当,希望这篇“mysql索引有哪些优点”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2022-10-19
  • mysql索引类型有哪些
    这篇“mysql索引类型有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql索引...
    99+
    2022-10-19
  • mysql索引类型有哪些?
    在Mysql数据库当中,我们经常会谈到Sql语句,当然也会谈到索引优化,那么在数据库当中有哪些索引类型呢,博主在这里进行分享,希望对大家能有所帮助。 目录 1、B-Tree索引: 2、Hash索引: 3、Full-text索引: 4、...
    99+
    2023-09-07
    数据库
  • mysql索引的使用原则有哪些
    这篇文章将为大家详细讲解有关mysql索引的使用原则有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、最左前缀原则。一个联合索引(a,b,c),如果有一个查询条件是a,有b,那么他就走索引,如果有一...
    99+
    2023-06-15
  • MySQL的索引知识点有哪些
    本文小编为大家详细介绍“MySQL的索引知识点有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL的索引知识点有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、索引介绍索引(index)是帮助M...
    99+
    2023-06-29
  • MySQL索引面试题有哪些
    这篇文章主要介绍“MySQL索引面试题有哪些”,在日常操作中,相信很多人在MySQL索引面试题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL索引面试题有哪些”...
    99+
    2022-10-19
  • MySQL索引知识点有哪些
    本篇内容主要讲解“MySQL索引知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL索引知识点有哪些”吧! Mysq...
    99+
    2022-10-19
  • mysql索引间有哪些区别
    本篇内容介绍了“mysql索引间有哪些区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • MySQL中有哪些索引类型
    本篇文章给大家分享的是有关MySQL中有哪些索引类型,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.B-Tree索引因为存储引擎不⽤进⾏全表扫描来获取数据,直接从索引的根节点...
    99+
    2023-06-14
  • mysql引发索引失效的情况有哪些
    这篇文章主要讲解了“mysql引发索引失效的情况有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql引发索引失效的情况有哪些”吧!1、在查询条件中计算索引列的使用函数或操作。若已建...
    99+
    2023-06-20
  • mysql中索引的优劣势有哪些
    mysql中索引的优劣势有哪些?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、索引的优劣势优点:可以快速的检索  、可以加快分组和排序缺点: 占用储存空间、降低...
    99+
    2023-06-15
  • mysql创建索引的方式有哪些
    在MySQL中,有以下几种方式可以创建索引:1. CREATE INDEX语句:可以使用CREATE INDEX语句来创建索引。语法...
    99+
    2023-09-26
    mysql
  • mysql不走索引的情况有哪些
    以下是一些可能导致MySQL不走索引的情况:1. 数据量太小:当数据量太小时,MySQL可能会选择全表扫描而不是使用索引。这是因为索...
    99+
    2023-09-20
    mysql
  • mysql创建索引的原则有哪些
    创建索引的原则有以下几点:1. 选择合适的列:选择作为索引的列应该是经常用于查询和连接的列,而不是很少使用的列。2. 索引的选择性:...
    99+
    2023-09-21
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作