MySQL_8 相当牛逼的索引机制

目录

一、索引机制的引入

        1.索引机制🐂B在哪里?

        2.索引机制提高查询速度的原理 : 

二、索引的创建

        1.索引分类 : 

        2.使用格式 : 

        3.代码演示 : 

三、索引的删除

        1.格式 : 

        2.演示 : 

四、索引的查询

        1.格式 : 

        2.演示 : 

五、索引的使用规则


一、索引机制的引入

        1.索引机制🐂B在哪里?

                我们先来创建一张学生表,向表中随意添加一些数据后,利用蠕虫复制(自我复制)将表中的数据量扩展到百万级别,代码如下 : 

CREATE TABLE IF NOT EXISTS `students`(`s_id` MEDIUMINT UNSIGNED NOT NULL,`s_name` VARCHAR(64) NOT NULL DEFAULT '',`s_age` SMALLINT UNSIGNED NOT NULL DEFAULT 0
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;INSERT INTO studentsVALUES(1, 'sdads', 22),(1, 'Cyan', 22),(3, 'Raln', 22),(1, 'sdads', 22),(122, 'sdads', 22),(9, 'sdads', 22),(1, 'NXOl', 22),(34, 'DANz', 22),(76, 'AMqwc', 22);INSERT INTO studentsSELECT * FROM students;

                经过几轮蠕虫复制后,我们可以利用COUNT函数来查询表中现在一共有多少条记录,如下 : 

SELECT COUNT(*) FROM students;

                可以看到,表中现在已经有900多万条数据了,这么大的数据量,在查询数据时需要消耗多长的时间捏🤔 。我们来测试一下 : 
                先向表中另外添加一条要查询的数据(避开蠕虫复制的id),然后进行查询,如下 : 

INSERT INTO studentsVALUES(233, 'Ice', 21);SELECT * FROM studentsWHERE s_id = 233;

                在无索引机制的情况下,通过id查询数据用了足足4s多,你可以想象下面的场景——月黑风高夜,夜深人静时,你正想趁着此般时机在某网站上大饱眼福,就比如说在CSDN上吧,你想要让无穷无尽的知识映入你的眼帘,但是你发现,你每用鼠标点击一次都得等待4s多才能给你反馈,反复多次以后,你想骂娘了,***流量都准备好了给我整这玩意儿?
                没错,如果没有索引机制的加持,当数据量足够大时,比如达到百万级别以上,浏览网站将会是非常痛苦的一件事。那这时候可能就要有p小将(Personable小将,指风度翩翩的人)出来bb问了——你™BB一大堆说了个啥?索引机制呢?这踏🐎不是跑题水博文?
                p哥教训的是😭。这就来演示一下——如果我们用了索引机制,在相同的查询条件下,会用多长的时间。但是,演示之前我们先来看一下,目前900多万条的数据占了多大的空间,如下 : (ibd后缀,表示文件为INNODB存储引擎下保存的表数据和索引的文件)。

                为s_id字段创建索引(创建索引也需要时间),并进行相同的查询,如下 : 

CREATE INDEX id_index ON students(s_id);
SELECT * FROM studentsWHERE s_id = 233;

                发现没有,相同的查询语句,添加索引前后的时间之比 = 4.269 / 0.019 ≈ 225,上百倍的性能差距。那么,我们再来看一下建立索引机制后,该表的数据发生了什么变化? 如下 : 

                可以发现,索引机制的本质,其实就是——以空间换时间,即索引本身的建立也是需要占用空间的。 

        2.索引机制提高查询速度的原理 : 

                以往常规的查询中,不管你查询什么数据,它都是从表头第一条记录开始查找,一直找到表的末尾,即扫描了全表。比方说你要查询一条id = 100的记录,就算在表中找到了一条id = 100的记录,但是仍然不能保证该记录下方的记录中没有id = 100的,因此,就算表中真的只有一条id = 100的记录,最终还是扫描了全表。
                那么在表数据量庞大的情况下,全表扫描带来的弊端是相当明显的,我们方才也看到了,查询一次都得4s以上,甲方不得喷死你?

                那么索引机制又是如何解决这个问题的呢?
                索引机制会根据定义索引的字段建立一个索引的数据结构,这个数据结构可能是二叉树,B+树等等。比方说,我们上文中对s_id字段建立了索引,那么以最简单的二叉树为例,如下图所示 : 

                采用“折半”的思想,取中位数为根结点,左子树的结点一定都比根结点小,右子树的结点一定都比根结点大。 那么,当我们要查询id = 233的学生时,只需要先和122判断,233比122大,直接就去122的右子树查询了,122的左子树一个都不需要比较,就大大减少了查询的次数,进而缩短了查询时间,提高了查询性能。
                但是,俗话说的好——甘瓜苦蒂,天下物无全美!
                索引机制也存在自己的缺点——
                首先最直观的一点,由于索引采用了“以空间换时间”的思想,所以建立索引一定会增大对空间的开销
                其次,对于所引建立的数据结构,若表中数据出现了诸如"增加,删除,更改"这些DML(Data Manipulation Language) 时,就需要对这个数据结构进行维护,影响了DML的执行效率

                实际上,两害取其轻,由于在日常的项目开发和维护中,DQL(Data Query Language) 的使用频率远远高过DML,两者的使用频率之比接近9 : 1;因此,我们往往还是乐于去建立索引,以极大提高查询语句的性能,毕竟21世纪,时间才是最珍贵嘛😋。


二、索引的创建

        1.索引分类 : 

        主键索引:当表中定义了主键(PRIMARY KEY)时,主键自动为主索引,可以说,主键是一个特殊的索引,有主键限制的查询语句,查询速度会很快。

        唯一索引:当表中定义了UNIQUE约束时,自动建立唯一索引(也可以手动创建),有UNIQUE限制的查询语句,查询速度也很快。

        普通索引:就是INDEX;虽然普通,但使用频率却是最高的,因为更加灵活;普通索引允许数据重复,比如说name字段。

        全文索引:FULLTEXT;适用于MyISAM存储引擎。PS :由于MySQL自带的全文索引比较LOW,没法用,因此实际开发中使用最多的是Solr和ElasticSearch(ES)

        2.使用格式 : 

        1° 创建唯一索引 : 

        CREATE UNIQUE INDEX index_name ON table_name(field_name);

        创建普通索引 : 

        CREATE INDEX index_name ON table_name(field_name);

        ALTER TABLE table_name ADD INDEX index_name(field_name);

        创建主键索引 : 

        ALTER TABLE table_name ADD PRIMARY KEY (field_name);

        3.代码演示 : 

                建立一张动物表animals,令动物编号a_no为主键,动物名字a_name为UNIQUE,使用"SHOW INDEXES FROM table_name"指令来查看动物表的索引情况,代码如下 : 

CREATE TABLE IF NOT EXISTS `animals`(`a_no` MEDIUMINT UNSIGNED PRIMARY KEY,`a_name` VARCHAR(64) UNIQUE NOT NULL,`a_habitat` VARCHAR(64) NOT NULL DEFAULT ''
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;SHOW INDEXES FROM animals;

                可以看到,Non_unique均是0,表示主键索引和唯一索引均不允许数据重复;Column_name则表示当前索引添加在了哪个字段上。
                尝试通过手动添加的方式建立唯一索引,如下 : 

CREATE UNIQUE INDEX a_nameIndex ON animals(a_name);
CREATE UNIQUE INDEX a_nameIndex2 ON animals(a_name);SHOW INDEXES FROM animals;

                可见,MySQL允许在同一字段上创建名称不同的多个索引;当然,主键索引除外,每张表最多只允许存在一个主键。
                下面我们另建一张表,演示一下手动创建主键,以及普通索引的创建,代码如下 : 

CREATE TABLE IF NOT EXISTS `animals_EX`(`no` MEDIUMINT UNSIGNED,`name` VARCHAR(64) UNIQUE NOT NULL,`habitat` VARCHAR(64) NOT NULL DEFAULT ''
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;
# 手动添加主键
ALTER TABLE `animals_EX` ADD PRIMARY KEY(`no`);# 手动添加普通索引
ALTER TABLE `animals_EX` ADD INDEX index_nameTest(`name`);
CREATE INDEX `index_nameTest2` ON animals_EX(`name`);
CREATE INDEX `index_habitatTest` ON animals_EX(habitat);# 查看表的索引信息
SHOW INDEXES FROM animals_EX;

                可以看到,普通索引的Non_unique栏下是1,也就是允许有重复数据。


三、索引的删除

        1.格式 : 

        删除非主键索引 : 

        DROP INDEX index_name ON table_name;

        删除主键索引 : 

        ALTER TABLE table_name DROP PRIMARY KEY;

        PS : 

        若想修改索引——删除当前索引;添加新的索引

        2.演示 : 

                对于上文创建的animals_EX表的索引,如下图所示 : 

                要求删除该表的所有索引,如下 : 

# 删除主键索引
ALTER TABLE `animals_EX` DROP PRIMARY KEY;# 删除非主键索引
DROP INDEX `name` ON `animals_EX`;
DROP INDEX index_nameTest ON animals_EX;
DROP INDEX index_nameTest2 ON animals_EX;
DROP INDEX index_habitatTest ON animals_EX;SHOW INDEXES FROM animals_EX;


四、索引的查询

        1.格式 : 

        SHOW INDEX FROM table_name;

        SHOW INDEXES FROM table_name;

        SHOW KEYS FROM table_name;

        DESC table_name; (不如前三种方式的信息详细)

        2.演示 : 

                以动物表animals为例,查询其索引的定义情况。
                注意,前三种方式得到的结果是一模一样的

SHOW INDEX FROM animals;
SHOW INDEXES FROM animals;
SHOW KEYS FROM animals;

                第四种方式DESC table_name,本质上就是查看表的结构,不过也可以看出一些关于索引的信息。如下 : 

DESC animals;


五、索引的使用规则

         较频繁的作为查询条件的字段应该建立索引

        eg : SELECT * FROM emp WHERE eno = 100; (雇员编号)

        对于唯一性太差的字段,即使频繁作为查询条件也不适合单独建立索引

        eg : SELECT * FROM emp WHERE esex = 'male'; (性别往往非男即女,存在大量重复数据)

        更新较为频繁的字段不适合建立索引

        eg : SELECT * FROM emp WHERE attendance_times; (若字段频繁更新,就需要对该字段索引的数据结构进行频繁的维护,会消耗较多性能,维护代价高)。

        不会出现在WHERE子句中的字段不适合创建索引。(用不上)

        System.out.println("END------------------------------------------------------------------------------"); 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

家里有一对音箱一个功放,想连接手机,有什么好的方案?

我的情况和你一样,我有一个自己认为最佳的解决方案。 就是重新买一个带蓝牙功能的功放。现在手机都是有蓝牙功能的,蓝牙传输数字音信号是非常稳定,惹不是对音质有极高的要求,蓝牙音频完全可以胜任。 既然是利用家里的旧音箱&…

情人节送什么礼物比较有意义?千元内好看耐用的蓝牙耳机

在这个科技发展的时代,我们不能否认电子产品给我们带来了极大的便利,每个人都在享受电子产品带给我们的乐趣。而现阶段,我们使用最多的电子产品无非就是蓝牙耳机了,蓝牙耳机在我们的学习和娱乐中都是不可或缺的,但是很…

为什么要花钱买虚拟主机建站?旧手机建站才多少电费

计划探索一下旧手机建站有什么缺陷弊端。 实验使用魅族MX2 216存储。现在二手市场价格150元左右。阿里云最低配一个月也要70元。一年够买一个不错的千元手机了。 手机上网配置成功的关键在于软件,KSWEB可以说目前功能比较完善的,尤其这个版本被破解了&…

千元Android 3G手机普及是场梦

前不久是中国移动希望推出千元以下TD智能手机,下周中国联通也要推出千元以下智能手机,虽然业界不断有企业宣布即将推出千元以下Android智能手机,至今老杳依然难以见到一款运行通畅、性能价格比非常不错的样品,仔细想来&#xff0c…

eis电子防抖好还是光学防抖好_EIS和OIS有啥差别?一文搞懂手机防抖的那些事儿...

翻阅智能手机的相册,我们总能看到一些拍糊的照片或视频。问题来了,如今哪怕是千元价位的手机都能用上4800万像素的索尼IMX586高端传感器,为何依旧无法保证每一张照片、每一段视频都是无比清晰的呢? 拍片变糊的原因 首先我们需要明确一个观念,哪怕是专业的射击运动员,在心…

红米手机用什么蓝牙耳机比较好,适合红米手机的蓝牙耳机推荐

随着手机逐渐取消了耳机孔,越来越多的人们开始使用上了蓝牙耳机。在当今这个飞速发展的时代,蓝牙耳机蓝无疑成为了新时代的宠儿。无论是上班族还是当代大学生等年轻化群体,蓝牙耳机无疑成为了一个不错的喜好选择。但是面对市面上如此多的蓝牙…

500左右什么牌子蓝牙耳机好?

学生党买东西都要货比三家,才能买到性价比高的商品,蓝牙耳机这种数码产品也一样。为了给各位学生朋友省出更多学习的时间,今天给大家整理了一篇推文,推荐了几款适合学生党的无线蓝牙耳机,不管是考研做听力,…

两千到三千的手机买那些?看看这些媲美旗舰的手机,华为只有一款

手机作为现在的生活必需品,买什么价格、什么配置、什么品牌的手机每个人都有自己的价格观。千元机配置不够,旗舰机太贵,而在千元机和旗舰机之间的两千到三千价格左右的手机成为了不少人的选择。 那么小编今天就来带大家盘点一下,我…

pytest:灵活替换用例中的变量

背景: 这几天在调试之前搭建的pytest框架时,发现原框架对case中的变量进行动态替换的代码不够完美,原代码逻辑会造成代码中会出现大量的if语句,让代码量增加不少,并且后期维护也不方便:case只要新增了一个…

phpredis中文手册——《redis中文手册》 php版

redis中文手册:http://readthedocs.org/docs/redis/en/latest/ 本文是参考《redis中文手册》,将示例代码用php来实现,注意php-redis与redis_cli的区别(主要是返回值类型和参数用法)。 目录(使用CTRLF快速查找命令)&am…

PHP - Manual手册 - 下载

PHP - Manual手册 - 下载 [PHP: Download documentation:] http://www.php.net/download-docs.php [PHP - 官方网站] http://www.php.net/ [PHP - 关键词] php [PHP - 相关论坛] http://php.board.newsmth.net/ http://bbs.pku.edu.cn/, homepage看版 http://forum.cs…

PHP手册的使用

一、登录PHP在线手册。 打开PHP的官网“http://php.net”,然后点击导航栏中的“Documentation”切换到PHP手册文档页面,在“View Online”在线手册查看页面选择“Chinese(Simplified)”中文版后,即可以看到手册的首页界面。 二、手册的使用。…

PHP入门介绍及语言基础

🌱博客主页:大寄一场. 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 前言 一、变量和数据类型 二、运算符和表达式 三、条件语句 四、循环语句 前言 PHP是一种非常流行的开源服务器端脚本语言,广泛用于Web开发…

Linux 权限

目录 一、 从问题开始 问题一: 什么叫shell? 问题二: 为什么不能直接使用kernel呢? 问题三: shell 与bash 有什么不同吗? 二、 Linux权限 0x01 Linux用户 0x02 切换用户命令 0x03 sudo命令 0x04 权限的相关概念 0x05 chmod 0x06 chown 0x07 chgrp 0x08 文件权…

图灵聊天机器人小程序

历时半年整理出了十多万字的学习笔记,目前依旧在更新 欢迎点赞和支持~🥳🥳🥳 博客 项目描述: 根据图灵API向聊天机器人发送聊天信息,并渲染返回的数据。具有清空聊天记录的按钮。本来是想上线…

机器学习模型的生命周期

动动发财的小手,点个赞吧! 您的模型如何变化?Source[1] 诞生 当我们构建、训练、拟合或估计我们的模型时,这些数字工具就诞生了。这个阶段几乎从拥有分析目标、数据、计算机、算法以及数据科学家现在已经非常了解的其他一切开始。…

PHP 微信小程序 WebSocket MySQL Redis实现聊天功能

1.Mysql 实现离线消息池。如果一个用户不在线,则其他用户发送给他的消息暂时存储在mysql。待该用户上线时,再从离线消息池取出发送。 2.Redis 实现每个连接websocket的服务都唯一绑定一个用户。通过用户账号 fd 存到redis中。 微信小程序:…

python实现简单的聊天小程序

概要 这是一个使用python实现一个简单的聊天室的功能,里面包含群聊,私聊两种聊天方式.实现的方式是使用套接字编程的一个使用TCP协议 c/s结构的聊天室 实现思路 x01 服务端的建立 首先,在服务端,使用socket进行消息的接受,每接受一个socket的请求,就开启一个新的线程来管理…

小程序即时聊天服务器wss,Socket/WS/WSS和小程序

Socket 通信 Socket 不属于网络协议范畴,而是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口供应用层调用。通过调用 Socket 使得程序员可以更方便地使用 TCP/IP 协议栈。 Socket 连接是长连接,理论上客户端和服务器端一旦建立连接将不会主…

用Python写一个模拟qq聊天小程序的代码实例

前言 今天小编就为大家分享一篇关于用Python写一个模拟qq聊天小程序的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 Python 超简单的聊天程序 客户端: 服务器: 模拟qq聊…