MySQL之索引(入门级讲解)

这篇具有很好参考价值的文章主要介绍了MySQL之索引(入门级讲解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.索引的概念  

1.1索引的简介 

1.2.索引的优缺点

二.MySQL索引语法

2.1查看索引

2.2创建索引

2.2.1 创建表时创建索引

 2.2.2存在的表上创建索引

2.3删除索引

三.索引的数据结构      

3.1B+tree索引

 3.2Hash索引

3.4Hash索引和B+tree索引的对比


🎁个人主页:tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主
🎥 本文由 tq02 原创,首发于 CSDN🙉
🎄 本章讲解内容:MySQL索引

🎁欢迎各位→点赞👍 + 收藏⭐ + 评论📝+关注

MySQL之索引(入门级讲解),MySQL,mysql,数据库

🎥学习专栏:  C语言         JavaSE       MySQL基础 

一.索引的概念  

1.1索引的简介 

        索引是什么?本质而言是一种数据结构, 实现通常使用B树及其变种B+树 。

        抽象点:我们把索引比作一本书的目录,而目录的作用就是使我们迅速地找到我们需要的内容,而为什么需要索引?当数据表中含有上亿条数据时,我们进行查询是通过遍历表,一条一条筛选时,是不现实的,但是我们可以使用索引,就可知我们需要的数据大概的位置。

        常见的索引方式:字典,可以有两种方式进行查询,第一种是拼音,第二种是部首,而这就是两种不同的索引方式。

1.2.索引的优缺点

优点:

  1. 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
  2. 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点:

  1. 创建索引需要消耗额外的空间
  2. 有可能会拖慢 增删改 的速度,试想一下,当你修改了数据表的信息时,你的目录也就是索引也可能需要修改的。

结:个人而言,缺点相比较与优点,我们还是利大于弊的,在很多情况下,我们都是以查询操作为主,而增删改较少。


二.MySQL索引语法

        索引分为:普通索引、唯一索引、全文索引、单列索引、多列索引、空间索引

2.1查看索引

        查看索引,有人会问,我未创建索引,也会有索引嘛?在数据库中有三种约束类型存在时会自动生成索引,因此在查询时,即使未创建索引,若有这种条件存在,依然会生成索引。

三种约束类型主键、unique、外键 

也称:主键索引、唯一索引

语法:show index from 表名;


 存在主键时

MySQL之索引(入门级讲解),MySQL,mysql,数据库

 主键不允许重复,因此进行插入或者修改时,需要先查询,查看插入/修改后结果是否存在。

存在unique时

MySQL之索引(入门级讲解),MySQL,mysql,数据库

存在外键约束时 

MySQL之索引(入门级讲解),MySQL,mysql,数据库

当然除了以上的三种,我们还可以查看到手动创建的索引。 


2.2创建索引

  • 索引创建分为2种,第一种是创建表时创建索引,第二种是给存在的表创建索引
  • 索引的创建,前提是表中的数据较少或者无数据,若含有大量数据会引起非常大规模的硬盘IO操作,进一步导致数据库卡死。

2.2.1 创建表时创建索引

语法格式: CREATE TABLE 表名(

                        字段名称 字段类型 [完整性约束条件],

                ...,

[UNIQUE / FULLTEXT / SPATIAL] INDEX / KEY [索引名称](字段名称[(长度)] [ASC|DESC])

);

  • 创建普通索引

创建了2个索引,分别为id和username

CREATE TABLE test1(
id int,
username varchar(20),
index in_id(id),
KEY in_username(username)
);
  • 创建唯一索引
CREATE TABLE test2(
id int,
username varchar(20) unique;    //自动生成
);
  • 创建全文索引
CREATE TABLE test3(
id int
username VARCHAR(20) ,

FULLTEXT INDEX full_userDese(username)
);
  • 创建单列索引
CREATE TABLE test4(
id int UNSIGNED AUTO_INCREMENT KEY,
test1 VARCHAR(20) NOT NULL,
test2 VARCHAR(20) NOT NULL,

INDEX in_test1(test1),
UNIQUE in_test1(test1)
);
  • 创建多列索引
CREATE TABLE test4(
id int UNSIGNED AUTO_INCREMENT KEY,
test1 VARCHAR(20) NOT NULL,
test2 VARCHAR(20) NOT NULL,
test3 VARCHAR(20) NOT NULL,

INDEX mul_t1_t2_t3(test1,test2,test3)
UNIQUE KEY mul_t1_t2_t3(test1,test2,test3)  //二者都可以
);
  • 创建空间索引
CREATE TABLE test1(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,

SPATIAL INDEX spa_test(test)
)ENGINE=MyISAM;

 2.2.2存在的表上创建索引

概念:在存在的表上创建索引,可以直接创建,也可以将某列修改为某种索引

直接创建:CREATE [UNIQUE|FULLTEXT|SPATIAL]  INDEX 索引名称 ON 表名 {字段名称[(长度)] [ASC|DESC]};

简化:create index 索引名 on 表名(字段名)  //其他条件不设置


修改表方式创建:ALTER TABLE 表名  ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名称](字段名称[(长度)] [ASC|DESC]);                //将某个列修改为索引

  •  创建普通索引

1、CREATE INDEX 索引名  ON 表名(列名);

2、ALTER TABLE 表名  ADD INDEX  索引名(列名);

  • 创建唯一索引

1、CREATE  UNIQUE INDEX 索引名  ON 表名(列名);

2、ALTER TABLE 表名  ADD   UNIQUE INDEX  索引名(列名);

  • 创建全文索引

1、CREATE  FULLTEXT INDEX 索引名  ON 表名(列名);

  • 创建多列索引

1、ALTER TABLE 表名  add INDEX  索引名(列名,列名.....);


2.3删除索引

  • 索引的删除,只能删除手动创建的索引,而自动生成的索引无法删除哦

语法:drop index 索引名 on 表名;


三.索引的数据结构      

    MySQL的索引的数据结构到底是什么样的呢?其实并不是定式的,取决于MySQL使用的存储引擎。

  • 存储引擎: 在mysql程序中,拥有很多模块,有的负责解析sql语句、有的负责网络通信、有的负责存储数据等等。存储引擎就是负责存储数据的,本质而言就是代码中的一个模块(包含了若干个代码文件...以及一大堆具体的代码)

具体如何存储数据,MySQL提供了多种存储方案。而目前最为流行的便是Innodb存储引擎。而Innodb引擎选择使用B+tree索引结构。而至于为什么不选别的索引结构呢?下解:

适合索引的数据结构有 B+tree索引、Hash索引等。

3.1B+tree索引

        B+tree数据结构的演变:二叉树-->红黑树-->B-tree树-->B+tree树,而之所以会逐渐演变,是因为有缺点存在,而为了提高效率,就不断演化。

1.二叉树的缺点

  • 顺序插入时,会形成一个链表,查询性能大大降低。
  • 大数据量情况下,层级较深,检索速度慢。

2.红黑树的缺点

  • 大数据量情况下,层级较深,检索速度慢。

3.B-tree树

        又名:B-树,是一种多叉路衡查找树,对比二叉树,B-树每个结点可以存放多个数值,也就是说一个结点有多个分支,即多叉。

MySQL之索引(入门级讲解),MySQL,mysql,数据库  如图:B-树更趋向于区间查找,根结点是30、40、50、60,所以对应的孩子结点范围为[最小值,30)、[30,40)、[40,50)、[50,60)、[60,最大值].

查询方法:例如查询23,在根结点中找到区间小于30,往下个结,[15,25]区间,找然后又落在了[20,25]区间,再往下找,最终找到叶子结点[21,23],存在。

优点:高度低于红黑树,查询效率更高

缺点:无法进行范围查询

4.B+tree树

        B+Tree是B-Tree的变种,所有的数据都会出现在叶子节点。 叶子节点形成一个单向链表。所有的数据都会出现在叶子节点。 叶子节点形成一个单向链表。

MySQL之索引(入门级讲解),MySQL,mysql,数据库

叶子结点,会按照链表的方式,首尾相连,注链表是双向链表,画是单向的,因此只要得到开头和结尾,然后将这段链表单独拉出来便是查询的结果

优点:擅长范围查询,查询速度不快不慢,但是很稳定。


 3.2Hash索引

         哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在 hash表中。如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。

缺点:

  • Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,< ,…)
  • 无法利用索引完成排序操作

优点:查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree索引


3.4Hash索引和B+tree索引的对比

因此InnoDB存储引擎选择使用B+tree索引结构的原因:

  • 层级更少,搜索效率高
  • 相对Hash索引,B+tree支持范围匹配及排序操作;
  • 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,但是存储索引结构的一个页的大小有限,这样导致一页中存储 的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;

                当你看到这里时,MySQL的索引知识就已经完成了,本文需要细心理解。

                                                                                                       ---------------懒惰的tq02文章来源地址https://www.toymoban.com/news/detail-597265.html

到了这里,关于MySQL之索引(入门级讲解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库索引的数据结构

    数据库索引的功能就是让查找更加的高效,所以索引的数据结构应该是能够加速查找的数据结构。 MySQL的innoDB存储引擎的索引的数据结构就是多叉搜索树中的b+树,这可以说是为索引量身定做的一个数据结构。 首先,索引可以通过主键,unique修饰创建,也可以直接使用sql语句

    2024年02月10日
    浏览(53)
  • 【MySql系列】深入解析数据库索引

    MySQL索引是数据库中一个关键的概念,它可以极大地提高查询性能,加快数据检索速度。但是,要充分发挥索引的作用,需要深入理解它们的工作原理和使用方式。 在本文中,我们将深入解析MySQL索引,探讨它们的重要性、类型、创建、维护以及最佳实践。 在数据库中,索引

    2024年02月08日
    浏览(71)
  • 【MySQL数据库 | 第十七篇】索引以及索引结构介绍

    目录 前言: 索引简介:  索引结构:           二叉树索引结构         Tree(普通二叉树)         B-Tree(多路平衡查找树)         B+Tree          哈希索引数据结构 总结: 在实际生活中,我们对SQL语句进行优化实际上有很大一部分都是对索引进行优化,因此对索引

    2024年02月09日
    浏览(69)
  • MySQL数据库索引的种类、创建、删除

    目录 一:MySQL 索引 1、MySQL 索引介绍 2、 索引的作用  3、索引的副作用 4、 创建索引的原则依据  二、索引的分类和创建 1、 普通索引 (1) 直接创建索引 (2) 修改表方式创建 (3) 创建表的时候指定索引 2、 唯一索引 (1) 直接创建唯一索引 (2) 修改表方式创建

    2024年02月09日
    浏览(175)
  • 【Mysql系列】——详细剖析数据库“索引”【上篇】

        😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介:一名热爱C/C++,算法,数据库等技术、喜爱运动、热爱K歌、敢于追梦的小博主! 😘博主小留言:哈喽! 😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮

    2024年02月02日
    浏览(54)
  • B+树:MySQL数据库索引的实现

    作为一个软件开发工程师,你对数据库肯定再熟悉不过了。作为主流的数据存储系统,它在我们的业务开发中,有着举足轻重的地位。在工作中,为了加速数据库中数据的查找速度,我们常用的处理思路是,对表中数据创建索引。那你是否思考过,数据库索引是如何实现的呢

    2024年02月09日
    浏览(58)
  • MySQL数据库的ID列添加索引

    要为MySQL数据库的ID列添加索引,可以使用以下语法: 其中, table_name 是要添加索引的表名, index_name 是索引的名称, id 是要添加索引的列名。 例如,如果要为名为 users 的表的 id 列添加索引,可以执行以下语句: 这将在 users 表的 id 列上创建名为 idx_id 的索引。 需要注意的

    2024年02月07日
    浏览(50)
  • 【MySQL索引与优化篇】数据库的设计规范

    在关系型数据库中,关于数据表设计的基本原则、规则就称为范式 。范式的英文名称是 Normal Form ,简称 NF 。它是英国人 E.F.Codd 在上个世纪70年代提出关系数据库模型后总结出来的。范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的 规则 和 指导方

    2024年02月05日
    浏览(71)
  • MySQL数据库中的索引(含SQL语句)

    假设有一张表,表中有100万条数据,这100万条数据在硬盘上是存储在数据页上的,一页数据大小为16k。存储100万条数据那么就需要数据页,假设其中有一条数据是“id为7900”的,那么如果要查询这条数据,其中SQL是SELECT * FROM 表名 WHERE id = 7900。在执行这条SQL语句的时候,MyS

    2024年02月02日
    浏览(75)
  • MySQL数据库索引优化指南:提升查询效率的利器

    本文将详细探讨MySQL数据库索引的概念、作用以及不同类型的索引,包括主键索引、唯一索引和普通索引。通过实际案例分析,我们将深入理解索引的工作原理,并提供实用的优化建议,帮助读者提升数据库性能。

    2024年02月09日
    浏览(86)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包