mysql优化(3):索引的使用

什么是索引:

利用关键字,记录部分数据(某个字段、某些字段、某个字段的一部分),建立与记录位置的对应关系,就是索引。

索引的优缺点和使用基本原则:

优点:

  1. 所有的mysql字段类型都可以索引,也就是可以给任意字段设置索引
  2. 加快查询速度

缺点:

  1. 创建索引和维护索引要耗费时间,且数据量越大,消耗的时间就越多
  2. 索引也要占用空间,如果我们又大量索引,索引文件会比数据文件更快到达数据容量的上限值
  3. 对表中的数据进行增删改操作时,索引也要进行动态维护,降低了数据的处理速度

使用基本原则:

  1. 对经常更新的表避免使用过多的索引,只对经常进行查询的字段进行索引
  2. 数据量小的表不要使用索引,数据量小,可能查询全部数据花费的时间会比遍历索引的时间还要短,索引起不到优化效果
  3. 在一个相同值比较多的列上不要建立索引,如性别字段只要两个值;在值的差异化比较大的字段上建立索引,如ID

索引的分类:

索引是存储在存储引擎中的,不同的存储引擎对索引的支持也不完全一样,这里可以参考: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 ([列名])

组合索引(index):

在表中多个字段组合上创建索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。创建一个组合索引实际上是创建了多个普通索引。

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)中的一个 作为查询条件一般就会使用索引。

全文索引(fulltext index):

全文索引,是MyISAM引擎上才能使用,但是在mysql5.6及之后版本,InnoDB引擎也支持全文索引。全文索引只能在char、varchar、text字段上使用。

全文索引是指在一堆的文字中,通过使用某个关键字进行搜索字段所属的记录行,这里有点类似于es中的分词、模糊查询。但是mysql的全文索引对文本字段的搜索,只能搜索一些生僻的关键词进行搜索,一些常用的关键词可能不会搜索到结果。

使用全文索引需要借助MATCH函数:

select * from work_order where MATCH(info) AGAINS('workOrder') ;

空间索引(spatial index):

空间索引是对空间数据类型的字段建立索引,mysql的空间类型字段有:GEOMETRY、POINT、LINESTRING、POLYGON。在创建空间索引时,使用SPATIAL关键字,且存储引擎为MyISAM,空间索引的列必须非空。

 

查看一张表的索引:

show index from table_name;

哪些查询不会使用索引:

  1. 当查询语句的条件中有or关键字时,除非or两端的条件都存在可以使用的索引,否则该查询不会使用索引
  2. 使用like模糊查询索引列时,'info%' 会使用索引,但是'%info' 和 '%info%' 不会使用索引,‘_’也一样
  3. 对于符合索引,只有遵循做原则才会使用索引,否则不适用索引
  4. 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。如 name = 111 不使用索引,name = '111' 使用索引。

  5. 如果mysql估计使用全表扫描要比使用索引快,则不使用索引。(这种情况极少发生)

如何查看索引使用的情况:

show status like 'Handler_read%';

mysql优化(3):索引的使用_第1张图片

注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。

handler_read_rnd_next:这个值越高,说明查询低效。

你可能感兴趣的:(mysql)