利用关键字,记录部分数据(某个字段、某些字段、某个字段的一部分),建立与记录位置的对应关系,就是索引。
优点:
缺点:
使用基本原则:
索引是存储在存储引擎中的,不同的存储引擎对索引的支持也不完全一样,这里可以参考:mysql存储引擎
我们这里将索引分为:单列索引(普通索引、唯一索引、主键索引)、组合索引、全文索引、空间索引。
一个索引只包含单个列,但一个表中可以包含多个单列索引。
普通索引(index): mysql的基本索引类型,允许在定义索引的列中插入重复值和空值。
create index [索引名] on [表名]([列名] [(length(可以不指定))])
# 或
alter table [表名] add index [索引名]([列名])
# 也可以在建表时指定索引
create table [表名](
id int not null,
name varchar(10) not null,
index [索引名] ([列名](length))
)
如果是char、varchar类型,length长度可以小于字段的实际长度,也可以不指定;如果是BLOB、TEXT类型,必须指定length
唯一索引(unique index): 索引列的值必须唯一的,但允许存在空值。
创建唯一索引与普通索引基本相同,普通索引是index, 唯一索引为unique index
create unique index [索引名] on [表名]([列名] [(length(可以不指定))])
# 或
alter table [表名] add unique index [索引名]([列名])
# 也可以在建表时指定索引
create table [表名](
id int not null,
name varchar(10) not null,
unique [索引名] ([列名](length))
)
主键索引(primary key): 特殊的唯一索引,不允许有空值。主键索引可以不指定索引名,因为一个表中只能有一个主键索引,但可以是多个列组成一个关联主键。
alter table [表名] add primary key ([列名])
在表中多个字段组合上创建索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。创建一个组合索引实际上是创建了多个普通索引。
create index [indexName] on [tableName]([column1, column2, column3])
# 或
alter table [tableName] add index [indexName]([column1, column2, column3])
# 也可以在建表时指定索引
create table [表名](
id int not null,
name varchar(10) not null,
index [索引名] ([column1, column2, column3])
)
如上面创建的组合索引,实际上是创建了三个索引:column1, column1、column2, column1、column2、column3 。组合索引遵从最左前缀,利用索引中最左边的列集来进行匹配,这样的列集称为最左前缀。如在上面建立的组合索引中,如果在查询中使用了column1、(column1,column2)、(column1,,column2,column3)中的一个 作为查询条件一般就会使用索引。
全文索引,是MyISAM引擎上才能使用,但是在mysql5.6及之后版本,InnoDB引擎也支持全文索引。全文索引只能在char、varchar、text字段上使用。
全文索引是指在一堆的文字中,通过使用某个关键字进行搜索字段所属的记录行,这里有点类似于es中的分词、模糊查询。但是mysql的全文索引对文本字段的搜索,只能搜索一些生僻的关键词进行搜索,一些常用的关键词可能不会搜索到结果。
使用全文索引需要借助MATCH函数:
select * from work_order where MATCH(info) AGAINS('workOrder') ;
空间索引是对空间数据类型的字段建立索引,mysql的空间类型字段有:GEOMETRY、POINT、LINESTRING、POLYGON。在创建空间索引时,使用SPATIAL关键字,且存储引擎为MyISAM,空间索引的列必须非空。
show index from table_name;
如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。如 name = 111 不使用索引,name = '111' 使用索引。
如何查看索引使用的情况:
show status like 'Handler_read%';
注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。
handler_read_rnd_next:这个值越高,说明查询低效。