天天看点

Mysql中的索引(联合索引)

首先对于索引相关的东西,这篇博客还是挺全的:

https://www.cnblogs.com/sweet521/p/6203360.html

对于表的单列(如id)数据,是可以建立索引的,对于多列(id和name组合,或者,name和id组合),也可以建立索引。

联合索引,也称之为组合索引。

索引作用

在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。

建立联合索引的语法

在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。

create index indexName on  tableName(column1,column2,...,columnN),如create idx_un_userid_username on user(id,name)
           
CREATE TABLE E (e1 INT, e2 VARCHAR(9), e3 INT, PRIMARY KEY(e1, e3)); 
这样就建立了一个联合索引:e1,e3
           

联合索引可以建立多列(列数大于2)的索引,建议列数最多不要越过3列,超过3列,应重新设计表。

触发索引的条件:

1.使用联合索引的全部索引键,可触发索引的使用。

例如:SELECT E.* FROM E WHERE E.e1=1 AND E.e3=2

2、使用联合索引的前缀部分索引键,如“key_part_1 常量”,可触发索引的使用。

例如:SELECT E.* FROM E WHERE E.e1=1

3、使用部分索引键,但不是联合索引的前缀部分,如“key_part_2 常量”,不可触发索引的使用。

例如:SELECT E.* FROM E WHERE E.e3=1

4、使用联合索引的全部索引键,但索引键不是AND操作,不可触发索引的使用。

例如:SELECT E.* FROM E WHERE E.e3=2 OR E.e1=1

联合索引的好处

A:避免回表

在执行计划中,table access by index rowid代表是回表动作。

如在user的id列建有索引,select id from user这个不用回表,直接从索引中读取id的值,而select id,name from user中,不能返回除id列其他的值,所以必须要回表。

如果建有了id和name列的联合索引,则可以避免回表。

另外,建立了id和name的联合索引(id列在在前),则select id from user可以避免回表,而不用单独建立id列的单列索引。

B:两个单列查询返回行较多,同时查返回行较少,联合索引更高效。

还有一种情况是 当有一列有重复数据的时候,可以通过第二个索引进行查询判断,找到最终的目标行。

如果select * from user where id=2 和select * from user where name=‘tom’ 各自返回的行数比较多,而select * from user where id=2 and name='tom’返回的行数比较少,那么这个时候使用联合索引更加高效。

联合索引使用结论:

1):查询条件中出现联合索引第一列,或者全部,则能利用联合索引.

2):条件列中只要条件相连在一起,以本文例子来说就是:

last_name=’1′ and first_name=’1′

first_name=’1′ and last_name=’1′,无论前后,都会利用上联合索引.

3):查询条件中没有出现联合索引的第一列,而出现联合索引的第二列,或者第三列,都不会利用联合索引查询.

使用联合索引需要注意的地方

A:超过3个列的联合索引不合适,否则虽然减少了回表动作,但索引块过多,查询时就要遍历更多的索引块了;

B:建索引动作应谨慎,因为建索引的过程会产生锁,不是行级锁,而是锁住整个表,任何该表的DML操作都将被阻止,在生产环境中的繁忙时段建索引是一件非常危险的事情;

C:对于某段时间内,海量数据表有频繁的更新,这时可以先删除索引,插入数据,再重新建立索引来达到高效的目的。

单一列索引的应用结论:

1):只要条件列中出现索引列,无论在什么位置,都能利用索引查询.

两者的共同点:

1):要想利用索引,都要符合SARG标准.

  1. :都是为了提高查询速度.

3):都需要额外的系统开销,磁盘空间.

补充说明: stmtText信息来产生,在查询语句前面加上:SET STATISTICS PROFILE on.可以通过运行它,来观察你的查询是否合理,这样才能真正做到优化.

索引:创建索引可以根据查询业务的不同分为两种:单一列的索引,联合索引.

顾名思义,单一列索引就是指在表的某一列上创建索引,联合索引是在多个列上联合创建索引.

优缺点比较:

1):索引所占用空间:单一列索引相对要小.

2):索引创建时间:单一列索引相对短.

3):索引对insert,update,delete的影响程序:单一列索引要相对低.

4):在多条件查询时,联合索引效率要高.

索引的使用范围

单一列索引可以出现在where 条件中的任何位置,而联合索引需要按一定的顺序来写.

转自:https://blog.csdn.net/xsf1840/article/details/75201131