欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > MySQL(四)--索引

MySQL(四)--索引

2025/9/15 10:30:15 来源:https://blog.csdn.net/2302_80873119/article/details/144297862  浏览:    关键词:MySQL(四)--索引

MySQL的服务器,本质是在内存中的,那么所有对数据的CURD操作,全都是在对内存进行操作。

而,提高数据的CURD操作的效率,有两种方式:1、组织数据的格式(数据结构);2、算法。

而,数据结构,就是索引,即组织数据的格式。

1、没有索引的问题

索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的 create index,查询速度就可能提高成百上千倍。

即:索引的存在,提高了数据的查询效率,但是降低了数据的插入删除效率。

但是对于数据来说,大部分时间还是在于读操作。

1.1、常见索引

主键索引primary key
唯一索引unique
普通索引index
全文索引fulltext

因此,之前在表中创建“键”,其实就是在创建一个索引。

2、认识磁盘

MySQL 给用户提供存储服务,而存储的都是数据,数据在磁盘这个外设当中。

由冯诺依曼体系结构可知,磁盘的IO效率是很慢的。

因此,如何提高效率,是MySQL的一个重要话题。

再看看磁盘中的一个盘片:

如今,一个扇区的大小已经提升到4KB了,即4096字节。

并且如今,OS和磁盘的交互大小,就是以4KB为交互单位了。

我们在使用Linux,所看到的大部分目录或者文件,其实就是保存在硬盘当中的。

因此,最基本的,找到一个文件的全部,本质,就是在磁盘找到所有保存文件的扇区。

而对于定位扇区,是有CSH定址法的:

2.1、磁盘随机访问

本次IO所给出的扇区地址和上次IO给出扇区地址不连续,这样的话磁头在两次IO操作之间需要作比较大的移动动作才能重新开始读/写数据。

2.2、磁盘连续访问

如果当次IO给出的扇区地址与上次IO结束的扇区地址是连续的,那磁头就能很快的开始这次 IO操作,这样的多个IO操作称为连续访问。

因此尽管相邻的两次IO操作在同一时刻发出,但如果它们的请求的扇区地址相差很大的话也只能称为随 机访问,而非连续访问。 磁盘是通过机械运动进行寻址的,随机访问不需要过多的定位,故效率比较高。

3、MySQL与磁盘交互单位--Page

而MySQL作为一款应用软件,可以想象成一种特殊的文件系统。

它有着更高的IO场景,所以,为了提高基本的IO效率, MySQL 进行IO的基本单位是16KB。(InnoDB,之后均已InnoDB举例了。)

mysql> SHOW GLOBAL STATUS LIKE 'innodb_page_size';+------------------+-------+| Variable_name    | Value |+------------------+-------+| Innodb_page_size | 16384 |   ---- 16384 = 16 * 1024+------------------+-------+1 row in set (0.01 sec)

也就是说,磁盘的基本单位是4KB,而MySQL InnoDB引擎采用16KB进行IO交互。

这个16KB,在MySQL这里,成为Page。

4、建立共识

MySQL中的数据文件,是以Page为单位,保存在磁盘当中的。
MySQL的CURD操作,都需要计算得到对应的数据位置。
只要涉及计算操作,就要CPU参与,而为了便于CPU参与计算,一定要率先将数据移动到内存中。

所以,在特定的时间内,内存和磁盘中都是有数据的。

后续数据操作完毕后,以某种刷新策略,将数据从内存刷新到磁盘中去。

此时就涉及到内存和磁盘的IO了,此时的IO单位就是Page。        

MySQL为了更好的执行上述操作,MySQL服务器在内存中运行的时候,就在服务器内部,申请了一块被成为“Buffer Pool”的大块内存空间,来进行各种缓存。
由冯诺依曼体系可以知道,想要提高效率,必须要减少系统和磁盘的IO次数。

5、初步理解索引

5.1、建立测试表

必须要添加主键,才会默认生成主键索引。

create table if not exists user ( id int primary key,     --一定要添加主键哦,只有这样才会默认生成主键索引age int not null,name varchar(16) not null
);

 查看建表信息,默认采用的是InnoDB存储引擎。(也是我们配置过的)

mysql> show create table user \G*************************** 1. row ***************************Table: userCreate Table: CREATE TABLE `user` (`id` int(11) NOT NULL,`age` int(11) NOT NULL,`name` varchar(16) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词