数据库应用:MySQL索引

news2024/10/7 6:39:57

目录

一、理论

1.MySQL三层逻辑架构

2.索引结构

3.MyISAM与InnoDB对比

4.sql优化

5.MySQL 索引

6.MySQL索引原理

二、实验

1.创建索引

三、总结


一、理论

1.MySQL三层逻辑架构

 MySQL的存储引擎架构将查询处理与数据的存储/提取相分离。

MySQL的逻辑架构图如下:

(1)第一层负责连接管理、授权认证、安全等等

每个客户端的连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名和密码的方式进行认证,也可以通过SSL证书进行认证。登录认证通过后,服务器还会验证该客户端是否有执行某个查询的权限。

(2)第二层负责解析查询

编译SQL,并对其进行优化(如调整表的读取顺序,选择合适的索引等)。对于SELECT语句,在解析查询前,服务器会先检查查询缓存,如果能在其中找到对应的查询结果,则无需再进行查询解析、优化等过程,直接返回查询结果。存储过程、触发器、视图等都在这-层实现。

(3)第三层是存储引擎

存储引擎负责在MySQL中存储数据、提取数据、开启一个事务等等。 存储引擎通过API与上层进行通信,这些API屏蔽了不同存储弓|擎之间的差异,使得这些差异对,上层查询过程透明。存储引擎不会去解析SQL。

2.索引结构

(1)概述

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种:

表1 索引结构

索引结构描述
B+Tree索引最常见的索引类型,大部分引擎都支持 B+ 树索引
Hash索引底层数据结构是用哈希表实现的, 只有精确匹配索引列的查询才有效, 不支持范围查询
R-tree(空间索引)空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-text(全文索引)是一种通过建立倒排索引,快速匹配文档的方式。类似于Lucene,Solr,ES

(2)不同的存储引擎对于索引结构的支持情况

表2 存储引擎对于索引结构的支持情况

索引InnoDBMyISAMMemory
B+tree索引支持支持支持
Hash 索引不支持不支持支持
R-tree 索引不支持支持不支持
Full-text5.6版本之后支持支持不支持

3.MyISAM与InnoDB对比

image-20220210172041306

(1)存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。分别为:表定义文件、数据文件、索引文件。第一一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。 数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。

InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,- -般为2GB。

image-20220715231909478

 

 

(2)存储空间

MyISAM: MyISAM支持 E种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。当表在创建之后并导入数据之后,不会再进行修改操作,可以使用压缩表,极大的减少磁盘的空间占用。

(3)可移植性、备份及恢复

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。

InnoDB:免费的方案可以是拷贝数据文件、备份binlog,或者用mysqldump,在数据量达到几十G的时候就InnoDB:免费的方案可以是拷贝数据文件、备份binlog,或者用mysqldump,在数据量达到几十G的时候就

(4)事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。

InnoDB:提供事务支持事务,外部键等高级数据库功能。具有事务(commit)、 回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

(5)AUTO_INCREMENT

MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以怀是第一-列, 他可以根据前面几列进行排序后递增。

InnoDB: InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

(6)表锁差异

MyISAM:只支持表级锁,用户在操作myisam表时, select, update, delete, insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

InnoDB:支持事务和行级锁,是innodb的最 大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

(7)全文索引

MyISAM:支持FULLTEXT类型的全文索引InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

(8)表主键

MyISAM:允许没有任何索引|和主键的表存在,索弓都是保存行的地址。

InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

(9)表的具体行数

MyISAM:保存有表的总行数, 如果select count() from table;会直接取出出该值。

image-20220714104659573

 

InnoDB:没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后, myisam和innodb处理的方式都一样。

 

 

(10)CRUD操作

MyISAM:如果执行大量的SELECT, MyISAM是更好的选择。

InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。

(11)外键

MyISAM:不支持。

InnoDB:支持。

4.sql优化

(1)背景

性能低、执行时间太长、等待时间太长、连接查询、索引失效。

(2)sql语句执行过程

① 编写过程

select distinct …… from …… join …… on   ……  where …… group by …… having  …… order by ……

② 解析过程

from …… on …… join …… where …… group by …… having …… select distinct …… order by …… 

(3) 优化索引

3sq|优化就是优化索引:
索引相当于书的目录。
索弓|的数据结构是B+树。
 

5.MySQL 索引

(1)概念

索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。

使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。

索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。

索引是表中一列或者若干列值排序的方法。

建立索引的目的是加快对表中记录的查找或排序。

image-20220714094315112

 

(2)作用

① 设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因。

② 当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。

③ 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。

④ 通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。

⑤ 可以加快表与表之间的连接。

⑥ 在使用分组和排序时,可大大减少分组和排序的时间。

 

 

(3)创建索引的原则依据

索引随可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。

表1 创建索引依据

序号依据

1

表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是子表的主键,查询时可以快速定位。
2记录数超过300行的表应该有索引。如果没有索引,需要把表遍历一遍,会严重影响数据库的性能。
3经常与其他表进行连接的表,在连接字段上应该建立索引。
4唯一性太差的字段不适合建立索引。
5更新太频繁地字段不适合创建索引。
6经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引。
7在经常进行 GROUP BY、OPDER BY 的字段上建立索引
8索引应该建在选择性高的字段上。
9索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。

(4)优势与弊端

表2 索引优势与弊端

序号索引优势索引弊端
1提高查询效率(降低IO使用率)索引本身很大,可以存放在内存或硬盘上,通常存储在硬盘上。
2降低CPU使用率索引不是所有情况都使用,比如①少量数据②频繁变化的字段③很少使用的字段
3/索引会降低增删改的效率

(5)分类

表3 索引分类

序号索引分类含义特点关键字
1普通索引(单值索引)快速定位特定数据可以有多个
2唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE
3组合索引单列索引与多列索引
4主键索引针对于表中主键创建的索引默认自动创建, 只能有一个PRIMARY
5全文索引全文索引查找的是文本中的关键词,而不是比较索引中的值可以有多个FULLTEXT
备注备注:唯一索引和主键索引唯一的区别:主键索引不能为null 

普通索引

普通索引概念:最基本的索引类型,没有唯一性之类的限制。

直接创建索引:

CREATE INDEX 索引名 ON 表名 (列名[(length)]);
#(列名(length)):length是可选项,下同。如果忽略 length 的值,则使用整个列的值作为索引。如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。
#索引名建议以“_index”结尾。

修改表方式创建:

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

创建表的时候指定:

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

② 唯一索引

唯一索引概念:与普通索引类似,但区别是唯一索引列的每个值都唯一。唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。

直接创建唯一索引:

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

修改表方式创建:

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

创建表的时候指定唯一索引:

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

 主键索引

image-20220715231824610

 

主键索引的概念:是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。

直接创建主键索引:

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],primary key (字段1));

修改表方式创建:

ALTER TABLE 表名 ADD PRIMARY KEY (列名); 

④组合索引


组合索引(单列索引与多列索引):可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为 select 语句的 where 条件是依次从左往右执行的,所以在使用 select 语句查询时 where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。

 

CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));
 
select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';

⑤全文索引
全文索引(FULLTEXT):适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。在 MySQL5.6 版本以前。

FULLTEXT 索引仅可用于 MyISAM 引擎,在 5.6 版本之后 innodb 引擎也支持 FULLTEXT 索引。全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。每个表只允许有一个全文索引。
直接创建全文索引:

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

修改表方式创建:

ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

创建表的时候指定索引:

CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));
#数据类型可以为 CHAR、VARCHAR 或者 TEXT

使用全文索引查询

SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

(6)聚集索引&二级索引

而在在 InnoDB 存储引擎中,根据索引的存储形式,又可以分为以下两种:

分类含义特点
聚集索引(Clustered Index)将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据必须有,而且只有一个
二级索引(Secondary Index)将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键

可以存在多个

聚集索引选取规则 :

① 如果存在主键,主键索引就是聚集索引。

② 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。

③ 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索 引

④ 聚集索引的叶子节点下挂的是这一行的数据 。

⑤ 二级索引的叶子节点下挂的是该字段值对应的主键值。

聚集索引和二级索引的具体结构如下:

 执行如下的 SQL 语句时,具体的查找过程:

 具体过程如下 :
① . 由于是根据 name 字段进行查询,所以先根据 name='Arm' 到 name 字段的二级索引中进行匹配查
找。但是在二级索引中只能查找到 Arm 对应的主键值 10 。
② . 由于查询返回的数据是 * ,所以此时,还需要根据主键值 10 ,到聚集索引中查找 10 对应的记录,最终找到10 对应的行 row 。
③ . 最终拿到这一行的数据,直接返回即可。
 

(7)查看索引

show index from 表名;
show keys from 表名;

各字段含义如下:

表4 各字段含义

Table表的名称
Non_unique如果索引不能包括重复词,则为 0;如果可以,则为 1。
Key_name索引的名称。
Seq_in_index索引中的列序号,从 1 开始。
Column_name列名称。
Collation列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)。
Cardinality索引中唯一值数目的估计值。
Sub_part如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为 NULL。
Packed指示关键字如何被压缩。如果没有被压缩,则为 NULL。
Null如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。
Index_type用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment备注。

(8)删除索引

直接删除索引

DROP INDEX 索引名 ON 表名;

修改表方式删除索引

ALTER TABLE 表名 DROP INDEX 索引名;

删除主键索引

ALTER TABLE 表名 DROP PRIMARY KEY;

6.MySQL索引原理

(1)原理

MySQL索引的底层数据结构是B+树。

B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储弓|擎就是用B+Tree实现其索引结构。

B-Tree结构图中每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的, 如果data数据较大时将会导致每个节点(即一 一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中, 所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+ Tree的高度。

B+Tree相对于B-Tree有几点不同:

非叶子节点只存储键值信息。

所有叶子节点之间都有一个链指针。

数据记录都存放在叶子节点中。

将上一节中的B-Tree优化,由于B+Tree的非叶子节 点只存储键值信息,假设每个磁盘块能存储4个键值及指针信息,则变成B+ Tree后其结构如下图所示:

二、实验

1.创建索引

创建数据库及数据表

 插入数据

(1)普通索引

直接创建索引

 ② 修改表方式创建

③ 创建表的时候指定索引

 (2)唯一索引

① 直接创建唯一索引

 

②修改表方式创建

③创建表的时候指定

 (3)主键索引

①创建表的时候指定

 

②修改表方式创建

ALTER TABLE 表名 ADD PRIMARY KEY (列名); 

(4)组合索引(单列索引与多列索引)

 

 (5)全文索引

① 直接创建索引

② 修改表方式创建

ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

③ 创建表的时候指定索引

CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名)); 

使用全文索引查询

 或者:

三、总结

索引分为:
① 普通索引 :针对所有字段,没有特殊的需求/规则
② 唯一索引 : 针对唯一性的字段,仅允许出现一次空值
③ 组合索引 (多列/多字段组合形式的索引)  从左往右
④ 全文索引(varchar char text)
⑤ 主键索引 :针对唯一性字段、且不可为空,同时一张表只允许包含一个主键索引
 

创建索引:
① 在创建表的时候,直接指定index
② alter修改表结构的时候,进行add 添加index
③ 直接创建索引index
PS:主键索引——》直接创建主键即可

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

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

相关文章

Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录

前言 之前自己写的flask使用gunicorn上线生产环境没有什么问题,但是最近搭建了一个现成的flask项目,当使用python直接运行时不会有问题,而使用gunicorn时则会出现一些问题。 部署过程 运行测试 这里使用pyenv创建了一个虚拟环境&#xff0…

Android PackageManagerService源码分析和APK安装原理详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 一、PackageManagerService简称PMS:PackageManagerService是Android系统中核…

城市餐饮油烟的监测与治理

摘要:为控制餐饮油烟污染,改善城市大气污染和生态环境,针对城市餐饮油烟污染现状,提出相应的治理政策。加快餐饮油烟污染立法进度,推进相关法律法规修订,加大油烟污染执法力度;维护清洗油烟净化…

windows安装使用 tesseract-ocr

OCR(Optical character recognition,光学字符识别)是一种将图像中的手写字或者印刷文本转换为机器编码文本的技术。 tesseract-ocr 是由Google开发,支持100多种语言 文档 tessdoc: https://tesseract-ocr.github.io…

3Ds max创建闪烁的星星效果

在这个简单的教程中,您将学习如何通过几个步骤创建闪烁的星星效果。 推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 步骤-1 在顶视图中创建球体 步骤-2 应用星形材料。 步骤-3 复制球体并稍微调整其大小(两个球体必须完全相同&…

Ubuntu 的安装及其设置

文章目录 安装 Ubuntu屏幕分辨率设置修改软件源服务器锁屏时间设置设置 dash跨系统拖拽复制文件的设置 安装 Ubuntu 首先安装 VMware 虚拟机,虚拟机的安装比较简单,一步步点击Next即可完成安装。 安装完成后启动虚拟机,点击创建新的虚拟机。…

modelscope本地模型使用教程

阿里魔塔社区modelscope(https://modelscope.cn/home) 如果使用过模型,那么模型文件默认缓存地址:C:\Users\Administrator.cache\modelscope\hub 魔塔社区本地使用: 1、安装python环境:使用miniconda&…

Apache Knox Gateway

简介: Knox是一个提供认证和访问集群中hadoop服务的单个端点服务。目标是为用户和操作者简化hadoop安全。knox运行为一个服务或者集群服务,并提供集中访问一个或者多个hadoop集群。通常网关的目标如下: 1、为hadoop rest api 提供外层的安全…

实战攻防之积极防御体系建设 | 中睿天下受邀参与诸子云沙龙

7月8日,中睿天下受邀参与由诸子云举办的“网络与数据安全”主题沙龙,中睿天下技术经理徐丹丹就《实战攻防之积极防御体系建设》这一主题进行了分享交流。 本次沙龙由南京分会会长宋士明主持,活动邀请到BASF、江苏省联社、华泰证券、宁证期货、…

微软浏览器连不上网络

针对微软浏览器连不上网络,但其他浏览器仍能连上网络 控制面板 -> 网络和Internet -> Internet 选项 -> 连接 -> 局域网设置 -> 取消代理服务器

理清ROS通信的一些细节

目标:掌握ros的python编程 基本教程:https://www.bilibili.com/video/BV1sU4y1z7mw/?spm_id_from333.788&vd_source32148098d54c83926572ec0bab6a3b1d terminator 快捷键需要自己去重新启用 ctrlshifte 横向分屏 ctrlshifto 纵向分屏 ctrlshiftw …

前端AES加密,后端解密,有效防止数据外泄

在工作中经常遇到密码明文传输这个问题,为了让密码安全些会让加密,现在有个比较方便的AES加密(前端密钥可能存在泄露风险,应该放到配置项中): 一、前端加密 1、首先引入前端需要用到的js:crypt…

CocoaPods私有库的创建

第一步:为了方便寻找,我先cd 桌面路径 /Users/xxx/Desktop 第二步 :创建私有库的名字 pod lib creat KMWaterMark 创建之后会有个文件夹,打开文件夹将自己的工具类放到classes文件夹里面,然后在在Example中打开自己的…

【通过迭代相位检索重建衍射图案和全息图中缺失信息】不完整衍射图案的迭代重建和缺失像素的恢复(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【编译之美】【1. JS闭包问题】

什么是闭包 在 JavaScript 和 Python 等语言里,函数可以像数值一样使用,比如给变量赋值、作为参数传递给其他函数,作为函数返回值等等。比如下面这一段代码: var a 0;var fun1 function(){var b 0; // 函数内…

UE4/5c++基于BlueprintAsyncActionBase和FTickableGameObject的异步节点【多流程的创建、异步执行】

目录 简单的多流程制作 取消除流程外,原本的蓝图执行线【如果要进行异步执行可以不取消看效果】 结果 代码: 继承FTickableGameObject,时刻判断是否结束,来执行不同引脚 结果: 代码: 在之前笔者讲解…

数据结构(王道)——顺序表的基本操作(插入、删除)

顺序表之实现插入: 插入的基础实现: 更加有健壮性的插入 插入实现的时间复杂度分析: 顺序表之实现删除: 删除的实现 删除实现的时间复杂度分析: 总结:

Ubuntu18.04 系统安装 Docker

1、首先更新软件源: sudo apt-get updatesudo apt-get upgrade 2、安装Docker: sudo apt install docker -y 3、查看安装的Docker apt list docker 4、查看docker 进程 ps -ef|grep docker 5、查看docker 版本有问题 6、开启Docker服务 systemctl…

​LeetCode解法汇总931. 下降路径最小和

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matr…

企业视角下的个人信息保护影响评估具体实施

个人信息保护影响评估(PIA)是指企业对个人信息的收集、存储、使用、加工、传输、提供、公开、删除等贯穿数据全生命周期活动的检验,判断活动合规程度、保护措施的有效程度以及对个人信息主体合法权益造成损害的风险。个人信息保护影响评估旨在…