目录
一、索引的概念
当并发量大且频繁时,可以做一个索引来减轻服务器负担(避免全局扫描)
索引相当于书籍的目录,能够帮助系统快速查找到想要的数据
数据库索引
是一个排序的列表,存储着索引值和这个值所对应的物理地址
无须对整个表进行扫描,通过物理地址就可以找到先要
是表中一列或者若干列值的排序方法
需要额外的磁盘空间来存储索引
索引的作用
当表的数据很多,或涉及到多个表时使用
利用各种快速定位技术,能大大加快数据库的查询速度
当表很大或查询涉及到多个表时,可以成千上万倍提高查询速度
可以减低数据库的IO成本,和数据库的排序成本
通过创建 唯一性 索引保证数据表中数据的唯一性
在使用分组和排序时,可以大大减少分组和排序的时间
索引的副作用
索引需要占用额外的磁盘空间
在插入和修改数据时需要花费更多时间;因为数据更改时,索引也要随之变动
索引创建的原则(应用场景)
表的主键、外键必须有索引
记录的数据超过2万行的表应该有索引;没有索引的话,查询时就会把表遍历一遍,会严重影响数据库性能
经常与其他表进行连接的表,在连接字段上应该建立索引
经常出现在where子句中的字段,特别是大表字段,应该建立索引
select 字段1,字段2 from 表名 where 字段x='';
索引应该建在选择性高的字段上
唯一性太差的字段不适合建立索引
更新太频繁的字段也不适合建立索引
索引应该建在小字段上,对于大的文本字段甚至超长字段不要建立索引
适合建立索引
1.小字段
2.唯一性强的字段
3.更新不频繁,单查询率高的字段
4.表记录超过2万
5.主键、外键、唯一键
二、索引的分类和创建
1.普通索引
最基本的索引;没有约束,能加快访问速度
创建普通索引
1.1直接创建
create index 索引名 on 表名(列名);
create index 索引名 on 表名(列名(length));
#(列名(length)):length是可选项。如果忽略 length 的值,则使用整个列的值作为索引。如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。
#索引名建议以"_index"结尾
create index phone_index on test(phone);
1.2修改表结构的方式创建普通索引
alter table 表名 add index 索引名 (列名);
alter table test add index id_index (id);
1.3创建表时创建普通索引
create table 表名 (字段1,字段2,...,index 索引名(列名));
create table class (id int(3),name char(20),score decimal(5,2),index name_index(name));
2.唯一索引
与普通索引类似,但唯一索引列的值是唯一的;添加唯一键将自动创建唯一索引
2.1直接创建唯一索引
create unique index 索引名 on 表名(列名);
create unique index phone_index on test(phone);
2.2修改表结构的方式创建唯一索引
alter table 表名 add unique 索引名 (列名);
alter table test add unique id_index (id);
2.3创建表时创建唯一索引
create table 表名 (字段1,字段2,...,unique 索引名 (列名));
create table class (id int,name char(10),score decimal(5,2),unique name_index(name));
3.主键索引
主键索引是一种特殊的唯一索引,必须指定为 "primary key "
一个表只能有一个主键,且不允许为空值;添加主键将自动创建主键索引
3.1修改表结构的方式创建主键索引
alter table 表名 add primary key(列名);
alter table test add primary key(id);
3.2创建表时创建主键索引
create table 表名 (字段1,字段2,...,primary key(列名));
create table class (id int,name char(10),score decimal(5,2),primary key(name));
4.组合索引
可以是单列上创建的索引,也可以是多列上创建的索引;需要满足最左原则,因为select语句的 where条件是依次从左往右执行的,所以在使用select 语句查询时where条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。
4.1创建表时创建组合索引
create table 表名 (列名1,列名2,...,index 索引名(列名1,列名2,列名3));
create table class (id int,name char(10),scorc decimal(5,2),phone int(11),index sum_index(id,name,phone));
5.全文索引
适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息
全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。每个表只允许有一个全文索引。
直接创建全文索引
create fulltext index 索引名 on 表名(列名);
create fulltext index full_index on test(address);
修改表结构的方式创建全文索引
alter table 表名 add fulltext 索引名 (列名);
alter table test add fulltext name_index(name);
创建表时创建全文索引
create table 表名 (列名1,列名2,...,fulltext 索引名(列名));
create table class (id int,name char(10),scorc decimal(5,2),phone int(11),fulltext name_index(name));
使用全文索引查询
select * from 表名 where match(列名) against('查询内容');
select * from test where match(name) against('lisi');
三、查看索引
show index from 表名;
show index from 表名\G; #竖向显示表索引信息
show keys from 表名;
show keys from 表名\G; #竖向显示表索引信息
各字段的含义
Table 表的名称
Non_unique 如果索引内容唯一,则为 0;如果可以不唯一,则为 1。
Key_name 索引的名称。
Seq_in_index 索引中的列序号,从 1 开始。 limit 2,3
Column_name 列名称。
Collation 列以什么方式存储在索引中。在 MySQL 中,有值'A'(升序)或 NULL(无分类)。
Cardinality 索引中唯一值数目的估计值。
Sub_part 如果列只是被部分地编入索引,则为被编入索引的字符的数目(zhangsan)。
如果整列被编入索引,则为 NULL
Packed 指示关键字如何被压缩。如果没有被压缩,则为 NULL。
Null 如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。
Index_type 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment 备注。
四、删除索引
直接删除索引
drop index 索引名 on 表名;
drop index sum_index on test;
修改表的方式删除索引
alter table 表名 drop index 索引名;
删除主键索引
alter table 表名 drop primary key;
小结
创建索引
创建普通索引
create index 索引名 on 表名(列名);
create index 索引名 on 表名(列名(length));
alter table 表名 add index 索引名 (列名);
create table 表名 (字段1,字段2,...,index 索引名(列名));
创建唯一索引
create unique index 索引名 on 表名(列名);
alter table 表名 add unique 索引名 (列名);
create table 表名 (字段1,字段2,...,unique 索引名 (列名));
创建主键索引
alter table 表名 add primary key(列名);
create table 表名 (字段1,字段2,...,primary key(列名));
创建组合索引
create table 表名 (列名1,列名2,...,index 索引名(列名1,列名2,列名3));
创建全文索引
create fulltext index 索引名 on 表名(列名);
alter table 表名 add fulltext 索引名 (列名);
create table 表名 (列名1,列名2,...,fulltext 索引名(列名));
使用全文索引查询
select * from 表名 where match(列名) against('查询内容');
查看索引
show index from 表名;
show index from 表名\G; #竖向显示表索引信息
show keys from 表名;
show keys from 表名\G; #竖向显示表索引信息
各字段的含义
Table 表的名称
Non_unique 如果索引内容唯一,则为 0;如果可以不唯一,则为 1。
Key_name 索引的名称。
Seq_in_index 索引中的列序号,从 1 开始。 limit 2,3
Column_name 列名称。
Collation 列以什么方式存储在索引中。在 MySQL 中,有值'A'(升序)或 NULL(无分类)。
Cardinality 索引中唯一值数目的估计值。
Sub_part 如果列只是被部分地编入索引,则为被编入索引的字符的数目(zhangsan)。
如果整列被编入索引,则为 NULL
Packed 指示关键字如何被压缩。如果没有被压缩,则为 NULL。
Null 如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。
Index_type 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment 备注。
删除索引
drop index 索引名 on 表名;
alter table 表名 drop index 索引名;
alter table 表名 drop primary key;