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)!