MySQL——索引

1.倘若没有索引

索引可以提高一个海量数据的检索数据

常见索引有四种,主键索引,唯一索引,普通索引,全文索引

海量数据查询其中某一数据很耗时,需要创建索引。

alter table 表名 add index(字段);

2.认识磁盘

MySQL和磁盘

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

MySQL——索引_第1张图片

MySQL——索引_第2张图片

 扇区

数据本质存放在磁盘的扇区中,数据库文件很大,一定需要占据多个扇区。

定位扇区

MySQL——索引_第3张图片

 了解了磁盘,我们就可以在硬件层面定位任何一个基本数据块(扇区)了,那么按照扇区(512字节,部分4096字节)进行交互可以吗?答案是不可以。

系统读取磁盘是以块为单位,基本单位是4kb。

磁盘随机访问与连读访问

随机访问:本次交互给出的扇区地址和上次给出的扇区地址不连续,这样磁头在两次操作之间需要做比较大的移动动作。

连续访问:本次交互给出的扇区地址与上次给出的扇区地址是连续的,磁头很快可以开始本次操作。

3.MySQL与磁盘交互基本单位

MySQL是一款应用软件,可以想象成一种特殊的文件系统,为了提高交互效率,MySQL使用的几本单位是16kb。(16*1024=16384) 

MySQL——索引_第4张图片

4.建成共识

  • MySQL里的数据文件,都是以page为单位存在磁盘中的。
  • MySQL的表操作,都需要计算进而找到对应的位置。
  • 因为涉及计算,就需要cpu的参与,所以要先将数据移到内存中。
  • 因此在特定时间里,数据一定是磁盘中有,内存中也有,操作完内存数据后,会刷新到磁盘中,这是交互的基本单位就是page。
  • 为了更高的效率,我们一定要减少系统和磁盘交互的次数。

5.索引的理解

创建一个测试表

MySQL——索引_第5张图片

 插入数据

MySQL——索引_第6张图片

理解单个page

MySQL中管理多个数据表文件,而管理好这些文件,就要先描述,再组织。

我们可以理解一个个独立文件是由一个或多个page组成的。结构本质是双向链表。

MySQL——索引_第7张图片

 理解多个page

 通过page,查询某条数据时可以将一整页的数据加载到内存中,减少交互次数,提高性能。

当有很多数据,需要多个page保存数据,多个page之间使用双向链表连接起来,而且每个page内的数据也是基于链表的,因此查找时为线性查找,效率很低。

目录

当我们看书中的某章节时,有两种方法找到章节。

1.从头开始找到目标内容。

2.查看目录,通过目录更快速找到对应章节。(目录本质是一种‘空间换时间的做法’)

单页情况

那对于单页page,我们怎么引入目录呢?如下图

MySQL——索引_第8张图片

 多页情况

MySQL——索引_第9张图片

 但是这种情况可能需要遍历多个page才能定位数据,存在效率问题,那如何解决呢?

  • 使用一个目录项来指向某一页,而这个目录项存放的就是将要指向的页中存放的最小数据的键值。
  • 和页内目录不同的地方在于,这种目录管理的级别是页,而页内目录管理的级别是行。
  • 其中,每个目录项的构成是:键值+指针。图中没有画全
  •  普通页存放的是用户数据,目录页中存放普通页的地址。

MySQL——索引_第10张图片

6.索引操作

创建主键索引

三种创建主键索引的方法及主键索引的特点

  • 一个表中,最多有一个主键索引,当然可以使符合主键
  • 主键索引的效率高(主键不可重复)
  • 创建主键索引的列,它的值不能为null,且不能重复
  • 主键索引的列基本上是int

MySQL——索引_第11张图片

 唯一索引的创建

三种创建唯一索引的方法及唯一索引的特点

  • 一个表中,可以有多个唯一索引
  • 查询效率高
  • 如果在某一列建立唯一索引,必须保证这列不能有重复数据
  • 如果一个唯一索引上指定not null,等价于主键索引

MySQL——索引_第12张图片

 MySQL——索引_第13张图片

 普通索引的创建

三种创建普通索引的方法及普通索引的特点

  • 一个表中可以有多个普通索引,普通索引在实际开发中用的比较多
  • 如果某列需要创建索引,但是该列有重复的值,那么我们就应该使用普通索引

MySQL——索引_第14张图片

 

 查询索引

  • 第一种方法: show keys from 表名
  • 第二种方法: show index from 表名;
  • 第三种方法(信息比较简略): desc 表名

删除索引

  • 第一种方法-删除主键索引: alter table 表名 drop primary key;
  • 第二种方法-其他索引的删除: alter table 表名 drop index 索引名; 索引名就是show keys from 表名中的Key_name 字段                                   mysql> alter table user10 drop index idx_name;
  • 第三种方法方法: drop index 索引名 on 表名                                    mysql> drop index name on user8;

你可能感兴趣的:(MySQL,mysql,数据库,database)