自学内容网 自学内容网

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: user
 Create 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=

原文地址:https://blog.csdn.net/2302_80873119/article/details/144297862

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!