mysql数据库之索引

 1.索引的相关知识

 1.1 索引的简介

索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于c语言的链表通过指针指向数据记录的内存地址)。
使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。
索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。
索引是表中一列或者若干列值排序的方法。
建立索引的目的是加快对表中记录的查找或排序。(加快查询速度、对字段值进行排序)

1.2 索引的优缺点 

索引的优点 

设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因。
当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。
可以降低数据库的I/O成本,并且索引还可以降低数据库的排序成本
通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。
可以加快表与表之间的连接。
使用分组和排序时,可大大减少分组和排序的时间。
建立索引在搜索和恢复数据库中的数据时能显著提高性能。


索引的缺点

索引需要占用额外的磁盘空间

对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。而 InnoDB 引擎的表数据文件本身就是索引文件。(索引文件和数据文件是同一个)在插入和修改数据时要花费更多的时间、消耗更多性能,因为索引也要随之变动。

1.3 索引创建的原则条件 

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

表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是主表的主键,查询时可以快速定位。
记录数超过300行(或500行)的表应该有索引。如果没有索引,每次查询都需要把表遍历一遍,会严重影响数据库的性能。(会影响IO和CPU的性能)
经常与其他表进行连接的表,在连接字段上应该建立索引。
唯一性太差的字段不适合建立索引。(因为字段值会有重复)
更新太频繁地字段不适合创建索引。
经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引
在经常进行GROUP BY、ORDER BY的字段上建立索引。
索引应该建在选择性高的字段上。(即重复性低的字段)
索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。(大字段建索引会增加磁盘空间,而且搜索起来会影响性能)


此外:当一个表写入多、读取很少的时候,不需要建立索引。唯一性太差的字段、更新太频繁地字段、大字段,不适合做索引。

2. 数据结构上索引的分类

对于MySQL索引的分类,我们可以站在多种不同的方式立场上来区分。可以从数据结构,存储方式和逻辑方式来区分索引的种类。本次我们主要针对逻辑方式的索引进行一系列的运用演示

根据存储方式的不同,MySQL 中常用的索引在物理上分为  B-树索引和 HASH 索引两类,两种不同类型的索引各有其不同的适用范围。

(1)B-树索引


B-树索引又称为 BTREE 索引,目前大部分的索引都是采用 B-树索引来存储的。

B-树索引是一个典型的数据结构,其包含的组件主要有以下几个:

叶子节点:包含的条目直接指向表里的数据行。叶子节点之间彼此相连,一个叶子节点有一个指向下一个叶子节点的指针。
分支节点:包含的条目指向索引里其他的分支节点或者叶子节点。
根节点:一个 B-树索引只有一个根节点,实际上就是位于树的最顶端的分支节点。

基于这种树形数据结构,表中的每一行都会在索引上有一个对应值。因此,在表中进行数据查询时,可以根据索引值一步一步定位到数据所在的行。

B-树索引可以进行全键值、键值范围和键值前缀查询,也可以对查询结果进行 ORDER BY 排序。但 B-树索引必须遵循左边前缀原则,要考虑以下几点约束:

查询必须从索引的最左边的列开始。
查询不能跳过某一索引列,必须按照从左到右的顺序进行匹配。
存储引擎不能使用索引中范围条件右边的列。


(2) 哈希索引


哈希(Hash)一般翻译为“散列”,也有直接音译成“哈希”的,就是把任意长度的输入(又叫作预映射,pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。

哈希索引也称为散列索引或 HASH 索引。MySQL 目前仅有 MEMORY 存储引擎和 HEAP 存储引擎支持这类索引。其中,MEMORY 存储引擎可以支持 B-树索引和 HASH 索引,且将 HASH 当成默认索引。

HASH 索引不是基于树形的数据结构查找数据,而是根据索引列对应的哈希值的方法获取表的记录行。哈希索引的最大特点是访问速度快,但也存在下面的一些缺点:

MySQL 需要读取表中索引列的值来参与散列计算,散列计算是一个比较耗时的操作。也就是说,相对于 B-树索引来说,建立哈希索引会耗费更多的时间。
不能使用 HASH 索引排序。
HASH 索引只支持等值比较,如“=”“IN()”或“<=>”。
HASH 索引不支持键的部分匹配,因为在计算 HASH 值的时候是通过整个索引值来计算的。
 

3.  逻辑划分中索引种类与管理

从逻辑划分来看,索引的运用主要有五种,分别为:普通索引,唯一索引,主键索引,组合索引和全文索引(模糊索引) 

管理数据表中的索引之前,为此专门创建了一个测试用表,来针对本次操作的运用演示 :

 

3.1 普通索引的创建

建立在普通字段上的索引,没有任何限制

 方式一:直接创建普通索引

 CREATE INDEX 索引名 ON 表名 (列名(长度));
 #长度可以加也可以不加,添加长度时,则该索引会取每行字段的前几位(即字段的长度)作为索引

 

 

方式二:修改表结构的方式创建索引 

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

 方法三:创建表时指定索引 

mysql> create table if not exists info(
    -> id int(5),
    -> name char(4),
    -> sex char(2),
    -> age char(3),
    -> adress varchar(20),
    -> remark varchar(50) 
    -> index 索引名(字段名) );
 

该方式一般不建议采用:在创建表的时候添加索引,会让插入数据变慢。

 3.2 唯一索引的创建

唯一索引:与普通索引类似,但区别是唯一索引列的每个值都唯一。 唯一索引 允许有空值,但是不允许有两个及其以上的空值(注意和主键不同)。

创建唯一键或者创建唯一索引都可实现。

方式一:直接创建唯一索引 

 CREATE UNIQUE INDEX 索引名 ON 表名(字段名);

 方式二:修改表结构的方式增加唯一键 

 ALTER TABLE 表名 ADD UNIQUE 索引名(字段名);

 

方式三:创建表时指定索引 

mysql> create table if not exists info(
    -> id int(5),
    -> name char(4),
    -> sex char(2),
    -> age char(3),
    -> adress varchar(20),
    -> remark varchar(50) 
    -> unique 索引名(字段名) );

方法四:添加唯一键,即为唯一索引 

alter table 表名 add unique key(字段);

 

3.3 主键索引的创建

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

方式一:创建表时添加主键 

mysql> create table if not exists info(
    -> id int(5),
    -> name char(4),
    -> sex char(2),
    -> age char(3),
    -> adress varchar(20),
    -> remark varchar(50) 
    -> primary key (字段) );

方式二: 在现有表中添加主键

ALTER TABLE 表名 add primary key(字段名);

 

3.4  组合索引的创建  

组合索引(单列索引与多列索引):可以是单列上创建的索引,也可以是在多列上创建的索引。

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

方法一:直接创建索引 

 CREATE INDEX 索引名 on 表名(字段1,字段2,字段3);

 

 方法二:修改表的方式创建索引 

 alter table 表名 add index 索引名(字段1,字段2, ..., 字段n);

方法三:创建表的时候指定索引 

mysql> create table if not exists info(
    -> id int(5),
    -> name char(4),
    -> sex char(2),
    -> age char(3),
    -> adress varchar(20),
    -> remark varchar(50) 
    -> idnex 字段1_字段2_index(字段1,字段2) );

组合索引的使用方法

select */需求字段 from 表名 where 索引字段1=?  and 索引字段2=? and 索引字段3=? 

 

3.5 全文索引的创建 

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

在MySQL5.6版本以前FULLTEXT索引仅可用于MyISAM引擎,在5.6版本之后innodb 引擎也支持FULLTEXT 索引。

全文索引可以在CHAR、 VARCHAR 或者TEXT 类型的列上创建

每个表一般只创建一个全文索引

查询时只能匹配完整的单词/字符串。
 

方法一:直接创建索引 

create fulltext index 索引名 on 表名 (字段);

 

 

方式二: 修改表的方式创建索引

 alter table 表名 add fulltext 索引名 (字段);

 方法三:创建表时指定索引

mysql> create table if not exists info(
    -> id int(5),
    -> name char(4),
    -> sex char(2),
    -> age char(3),
    -> adress varchar(20),
    -> remark varchar(50) 
    ->  fulltext idnex 字段_index(字段) );

 全文索引在查询中使用方法 

 select * from 表名 where match(字段名) against(单词/字符串);   

 

 

3.6 索引删除的通用方式

 其他索引的删除方法

 drop index 索引名 on 表名;      #直接删除索引
 
 ​
 alter table 表名 DROP index 索引名;   #以修改表的方式删除索引

 

 主键索引的删除方法

alter table 表名 drop primary key;
 

 3.7 查看表中存在全部索引的方法

show index from 表名;      #能查看索引的字段和细节,建议以纵向形式查看
 show index from 表名\G     #建议使用\G以纵向形式查看
 ​
 show keys from 表名;
 show keys from 表名\G
 ​
 show create table 表名;    #只能查看索引的字段和名称

 

4. explain 语句用法以及mysql查询速度的优化 

4.1 explain语句的作用 

当我们写好了查询语句不确定自己是否引用的字段是不是索引字段时,可以在查询语句前添加explain来确定自己是否引用了索引字段 

explain select * from 表名 where 条件语句;

 

4.2  mysql查询速度的优化

我们知道mysql的核心功能就是数据的查询,数据查找的速度尤为重要。对于内容条数过多的数据表会产生响应慢的可能。所以查询速度优化是数据库管理员必不可少的工作

硬件上的优化 


CPU对于MySQL应用,推荐使用S.M.P.架构的多路对称CPU,例如:可以使用两颗Intel Xeon 3.6GHz的CPU,现在我较推荐用4U的服务器来专门做数据库服务器,不仅仅是针对于mysql。


物理内存对于一台使用MySQL的Database Server来说,服务器内存建议不要小于2GB,推荐使用4GB以上的物理内存,不过内存对于现在的服务器而言可以说是一个可以忽略的问题,工作中遇到了高端服务器基本上内存都超过了16G。


磁盘寻道能力(磁盘I/O),以目前高转速SCSI硬盘(7200转/秒)为例,这种硬盘理论上每秒寻道7200次,这是物理特性决定的,没有办法改变。MySQL每秒钟都在进行大量、复杂的查询操作,对磁盘的读写量可想而知。所以,通常认为磁盘I/O是制约MySQL性能的最大因素之一,对于日均访问量在100万PV以上的系统,由于磁盘I/O的制约,MySQL的性能会非常低下!解决这一制约因素可以考虑以下几种解决方案: 使用RAID-0+1磁盘阵列,注意不要尝试使用RAID-5,MySQL在RAID-5磁盘阵列上的效率不会像你期待的那样快
 

查询语句进行索引优化

1. 在使用数据查询语句时,发现查询的时间明显缓慢(一般1s钟以上就存在慢的问题),使用explain语句进行分析 (查看是否存在索引,以及该语句是否真正用到了索引)。

2.若该语句中的条件并为涉及索引,可以添加索引来进行优化

3. 索引类型单一,条件语句中条件用到的较多,可以尝试组合索引,以此加快查询速度
 

总结

(1)创建索引


1)普通索引:
create index 索引名 on 表名 (字段);

alter table 表名 add index 索引名 (字段(4));

create table 表名 (字段.... , index 索引名(字段));

2)唯一索引:
create unique index 索引名 on 表名 (字段);

alter table 表名 add unique 索引名(字段);

create table 表名 (字段.... , unique 索引名(字段));

3)主键索引:
alter table 表名 add primary key (字段);

create table 表名 (字段.... , primary key (字段));

create table 表名 (字段 primary key, ... );

4)组合索引(单列、多列索引):
create index XXX_index on 表名 (字段1,字段2, ... , 字段n);

alter table 表名 add index XXX_index (字段1,字段2, ... , 字段n);

create table 表名(列名1 数据类型,列名2 数据类型,列名3 数据类型, INDEX 索引名(字段1,字段2,字段3));

使用时要注意 where 的最左原则:

select * from 表名 where 字段1=XXX and 字段2=XXX and ....

5)全文索引:
create fulltext index 索引名 on 表名 (字段);

alter table 表名 add fulltext 索引名 (字段);

create table 表名 (字段.... , fulltext 索引名(字段));

查询时只能匹配完整的字符串:

select * from 表名 where match(字段) against('查询字符串');

(2)查看表中存在的索引 
show index from 表名; //能查看索引的字段和细节,建议使用\G纵向查看

show keys from 表名;

show create table 表名; //只能查看索引的字段和名称

(3)删除索引 
删除主键索引的方法:
alter table 表名 drop primary key;

删除其他索引:
drop index 索引名 on 表名;

alter table 表名 drop index 索引名;

(4)explain语句
explain添加在查询语句前面,可以分析出该语句是否使用了索引,以及具体使用索引的字段
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PCL学习六:Filtering-滤波

参考引用 Point Cloud Library黑马机器人 | PCL-3D点云 1. 点云滤波概述 1.1 背景 在获取点云数据时&#xff0c;由于设备精度、操作者经验、环境因素等带来的影响&#xff0c;以及电磁波衍射特性、被测物体表面性质变化和数据拼接配准操作过程的影响&#xff0c;点云数据中将…

大型数据库期末总复习【SQL server 2008 基础教程】

一、概述 1.Microsoft SQL Server系统的体系结构 Microsoft SQL Server 2008系统由4个主要部分组成。这4个部分被称为4个服务&#xff0c;这些服务分别是数据库引擎、分析服务、报表服务和集成服务。这些服务之间相互存在和相互应用&#xff0c;它们的关系示意图如图所示&…

“世界中医药之都” 亳州市医保局领导一行莅临万民健康交流指导

为进一步推进智慧医疗、智慧服务、智慧管理“三位一体”为主旨的“智慧中医、健康社区”项目建设。2023 年 5 月 3 日&#xff0c;“世界中医药之都” 亳州市医保局 局长 吴旭春 、 医保中心主任秦克靖 、 办公室主任徐伟 等一行 5 人莅临 万民健康交流 指导工作 &#xff0c…

JQuery实现自定义滚动条

在页面中虽然可以通过CSS修改滚动条的样式,但是部分属性是无法自己修改和设置的&#xff0c;而且不同浏览器存在兼容问题&#xff0c;因此通过JS来实现滚动条在自定义滚动条的环境下也是有必要的。 接下来&#xff0c;我们来实现上图两种情况下滚动条的实现。 一、页面搭建 1.…

白宫召见科技巨头 讨论AI潜在风险 以确保人们从创新中受益

ChatGPT的问世&#xff0c;被认为是通用人工智能发展的“奇点”和强人工智能即将到来的“拐点”&#xff0c;甚至有业内人士推测所有数字化系统和各个行业都可能被其重新“洗牌”。 乐观主义者表示&#xff0c;人工智能的核心是对人类大脑的模拟&#xff0c;其目的是延伸和增强…

mysql数据库之事务

1.事务的概念 事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个 整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么都执行&#xff0c;要么都不执行。 事务是一个不可分割的工作逻辑单元&#xf…

ES6-Class类

ES6 提供了更接近传统语言的写法&#xff0c;引入了 Class &#xff08;类&#xff09;这个概念&#xff0c;作为对 象的模板。通过 class 关键字&#xff0c;可以定义类。基本上&#xff0c; ES6 的 class 可以看作只是 一个语法糖&#xff0c;它的绝大部分功能&…

代码随想录算法训练营第三十二天 | 利润题、覆盖范围题

122.买卖股票的最佳时机II 文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;贪心算法也能解决股票问题&#xff01;LeetCode&#xff1a;122.买卖股票最佳时机II_哔哩哔哩_bilibili 状态&#xff1a;根本做不出来&#xff0c;思路太巧了。 思路 想获…

DT7遥控DBUS协议解析

文章目录 运行环境&#xff1a;1.1 DBUS协议解析1)DT7遥控2)配置串口引脚3)配置串口接收DMA 2.1例程代码移植1)例程移动到 Inc 和 Src2)makefile添加.c文件 3.1核心代码解释4.1代码修改1)bsp_rc.c 和 remote_control.c2)调用代码 5.1调试1)硬件接线2)串口工具监视拨杆数据 运行…

【C++】哈希

一、unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 l o g 2 N log_2 N log2​N&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。 …

Linux学习之Shell(一)

Shell概述 1&#xff09;Linux提供的Shell解析器有 [xiaominghadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh2&#xff09;bash和sh的关系 [xiaominghadoop101 bin]$ ll | grep bash -rwxr…

HTML <area> 标签

实例 带有可点击区域的图像映射: <img src="planets.jpg" border="0" usemap="#planetmap" alt="Planets" /><map name="planetmap" id="planetmap"><area shape="circle" coords=&q…

不用花一分钱!!!获得一个自己的网页版chatGPT

不用花一分钱&#xff01;&#xff01;&#xff01;获得一个自己的网页版chatGPT 当然还是需要一个chatGPT账号的&#xff0c;不会注册的同学可以看一下这篇文章 chatGPT到底要怎么注册 那就先让我们看一下效果吧 chatgpt-web介绍 github项目地址 https://github.com/Chanzha…

Formik使用详解

Formik使用详解 1 引言 在现代Web应用程序中&#xff0c;表单是一种不可避免的输入机制&#xff0c;但是处理表单的过程可能会变得非常复杂。Formik是一个React表单库&#xff0c;它的目标是简化表单处理的过程。本文将介绍Formik的主要功能和用途&#xff0c;以及如何使用它来…

OSI七层网络模型+TCP/IP四层模型

OSI七层模型&#xff1a; 物理层&#xff1a;主要定义物理设备标准&#xff0c;如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流&#xff08;就是由1、0转化为电流强弱来进行传输&#xff0c;到达目的地后再转化为1、0&#xff0c;也就…

2023年淮阴工学院五年一贯制专转本财务管理基础考试大纲

2023年淮阴工学院五年一贯制专转本财务管理基础考试大纲 一、考核对象 本课程的考核对象为五年一贯制高职专转本财务管理专业入学考试普通在校生考生。 二、考核方式 本课程考核采用闭卷笔试的方式。 三、命题依据及原则 1、命题依据 本课程考核命题教材为靳磊编著&…

1_5 pytorch操作

一、torch 算子 1、torch.nn.functional.affine_grid(theta, size) 给定一组仿射矩阵(theta)&#xff0c;生成一个2d的采样位置(流场)&#xff0c;通常与 grid_sample() 结合使用,用于空间仿射变换网络&#xff0c;用于对2D或3D数据进行仿射变换。 输入&#xff1a;theta(Te…

AIGPT中文版(无需魔法,直接使用)不愧是生活工作的好帮手。

AIGPT AIGPT是一款非常强大的人工智能技术的语言处理工具软件&#xff0c;它具有 AI绘画 功能、AI写作、写论文、写代码、哲学探讨、创作等功能&#xff0c;可以说是生活和工作中的好帮手。 我们都知道使用ChatGPT是需要账号以及使用魔法的&#xff0c;其中的每一项对我们初学…

使用JPA自动生成代码(轻松上手看了就会版)

目录 背景&#xff1a;方案概念&#xff1a;JPA 的主要作用 jpa简单使用&#xff08;Springboot项目&#xff09;jpa进阶使用总结 背景&#xff1a; 项目需要自动生成sql代码&#xff0c;不需要写sql语句&#xff0c;能够自动进行查询&#xff0c;我想到了JPA。 方案 概念&a…

Linux驱动编程(分层分离编程思想)

1、面向对象 ⚫ 字符设备驱动程序抽象出一个 file_operations 结构体&#xff1b; ⚫ 我们写的程序针对硬件部分抽象出 led_operations 结构体。 2、分层 上层实现硬件无关的操作&#xff0c;比如注册字符设备驱动&#xff1a;leddrv.c 下层实现硬件相关的操作&#xff0c;比如…