自学内容网 自学内容网

MySQL——索引

一.索引的意义

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

但是查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。

常见索引分为:

  • 主键索引(primary key)
  • 唯一索引(unique)
  • 普通索引(index)
  • 全文索引(fulltext)--解决中子文索引问题。

二.MySQL与磁盘 

MySQL 中的数据文件,是以page为单位保存在磁盘当中的。

MySQL CURD 操作,都需要通过计算,找到对应的插入位置,或者找到对应要修改或者查询的数据。而只要涉及计算,就需要CPU参与,而为了便于CPU参与,一定要能够先将数据移动到内存当中。

所以在特定时间内,数据一定是磁盘中有,内存中也有。后续操作完内存数据之后,以特定的刷新 策略,刷新到磁盘。而这时,就涉及到磁盘和内存的数据交互,也就是IO了。而此时IO的基本单位 就是Page

为了更好的进行上面的操作, MySQL 服务器在内存中运行的时候,在服务器内部,就申请了被称 为 Buffer Pool 的的大内存空间,来进行各种缓存。其实就是很大的内存空间,来和磁盘数据进行IO交互。

为了更高的效率,一定要尽可能的减少系统和磁盘IO的次数

MySQL 中要管理很多数据表文件,而要管理好这些文件,就需要先描述,在组织可以简单理解成一个个独立文件是有一个或者多个Page构成的

不同的 Page ,在 MySQL 中,都是 16KB ,使用 prev next 构成双向链表。

因为有主键的问题, MySQL 会默认按照主键给我们的数据进行排序目的就是优化查询的效率。

在查询某条数据的时候直接将一整页的数据加载到内存中,以减少硬盘IO次数,从而提高性能。

 如果单个页中的数据量过大,则可以引入目录来帮助索引数据。

如果页的数量过多,想要在这么多Page之间快速找到某一个Page并进而得到其数据,则需要再引入目录项,来帮助索引到每个页。

目录页的本质也是页,普通页中存的数据是用户数据,而目录页中存的数据是普通页的地址。

可是就算是引入了目录项,也还是会有多个,需要去索引,此时,继续再添加目录页

这种结构,称为B+树,正是提高MySQL索引效率的内部数据结构。

Page分为目录页和数据页。目录页只放各个下级Page的最小键值。

查找的时候,自定向下找,只需要加载部分目录页到内存,即可完成算法的整个查找过程,大大减 少了IO次数。


三.索引操作

1.创建主键索引

一个字段只要被设置为主键,就会默认拥有主键索引,所以我们只需要将对应的字段设为主键,便可实现索引,设置主键有三种方式:

在创建表的时候,直接在字段名后指定 primary key

create table user1(id int primary key, name varchar(30));

在创建表的最后,指定某列或某几列为主键索引

create table user2(id int, name varchar(30), primary key(id));

创建表以后再添加主键

create table user3(id int, name varchar(30));

alter table user3 add primary key(id);

主键索引的特点:

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

2.创建唯一键索引

唯一键索引与主键一样,只要被创建就能够索引,唯一键的创建方式也与主键一样有三种:

在表定义时,在某列后直接指定unique唯一属性。

create table user4(id int primary key, name varchar(30) unique);

创建表时,在表的后面指定某列或某几列为unique

create table user5(id int primary key, name varchar(30), unique(name));

创建表以后再添加唯一键

create table user6(id int primary key, name varchar(30);

alter table user6 add unique(name);

唯一索引的特点:

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

3.创建普通索引 

普通索引的创建需要通过 "index",同样有三种方式:

create table user8(

id int primary key, name varchar(20), email varchar(30),

index(name) );--在表的定义最后,指定某列为索引

create table user9(

id int primary key, name varchar(20), email varchar(30));

alter table user9 add index(name); --创建完表以后指定某列为普通索引

create table user10(

id int primary key, name varchar(20), email varchar(30));

create index idx_name on user10(name);-- 创建一个索引名为 idx_name 的索引

普通索引的特点:

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

 4.查询索引

查询索引有三种方法:

show keys from 表名;

show index from 表名;

desc 表名;//消息比较简略

其中第一种方法的结果如下:

 


5.删除索引

第一种方法-删除主键索引:

alter table 表名 drop primary key;

第二种方法-其他索引(包括唯一键)的删除:

alter table 表名 drop index 索引名;

索引名就是show keys from 表名中的 Key_name 字段

第三种方法方法: drop index 索引名 on 表名

drop index name on user8;


 四.索引创建原则

比较频繁作为查询条件的字段应该创建索引。

唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件。

更新非常频繁的字段不适合作创建索引。

不会出现在where子句中的字段不该创建索引。


原文地址:https://blog.csdn.net/2303_78442132/article/details/144377304

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