索引:提高数据库的性能,索引不用加内存,不用改程序,不用调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次数,从而提高性能。
如果单个页中的数据量过大,则可以引入目次来资助索引数据。
一个字段只要被设置为主键,就会默认拥有主键索引,所以我们只须要将对应的字段设为主键,便可实现索引,设置主键有三种方式:
在创建表的时间,直接在字段名后指定 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; 四.索引创建原则