mysql index
Posted wang_dong_yang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql index相关的知识,希望对你有一定的参考价值。
mysql 由于开源,免费,跨平台等优点,所以在当今的企业中应用的还是挺多的。那么如何高效的使用 MySQL也是需要开发人员学习的。现在我把之前看过的关于 MySQL 索引方面的资料整理一下,也算做个总结。
我们知道 MySQL使用的好坏,很大一部分取决对于索引使用的好坏。可见对于索引的合理使用是开发人员需要掌握的知识。
索引是对数据库表中一列或多列的值进行排序的一种结构,可以用来快速地寻找那些具有特定值的记录。如果没有索引,执行查询时 MySQL 必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果在作为搜索条件的列上创建索引,那么 MySQL 就可以迅速得到目标记录所在的位置。可以极大的提高查询效率。
普通索引
这是最基本的索引类型,而且它没有唯一性之类的限制。
创建: create index索引名 on 表名(列名);
alter table表名 add index 索引名 (列名);
删除: drop index索引名 on 表名;
alter table表名 drop index 索引名;
唯一索引
强调唯一,就是索引值必须唯一。主键就是唯一索引的一种。
创建: create unique index索引名 on 表名(列名);
alter table表名 add unique index 索引名 (列名);
删除: drop index索引名 on 表名;
alter table表名 drop index 索引名;
复合索引
创建: create index 索引名 on 表名(列名,列名);
alter table 表名 add index 索引名 (列名,列名);
删除: drop index 索引名 on 表名;
alter table 表名 drop index 索引名;
假设现在有一个 user表,有如下几列 id,name,age,address。这个表的主要用途就是根据用户的名称,年龄,地址返回用户的 id。
如:select id from user where name = 'aaa' and age = bb and address = 'ccc';
这时,如果我们只在单个列上建立了索引,假如我们在 name列上建立了索引,那么 MySQL将通过这个索引迅速把搜索范围限制到那些 name='aaa' 的记录,然后再在这个“中间结果集”上进行其他条件的搜索:它首先排除那些 age不等于 bb 的记录,然后排除那些 address 不等于 ccc的记录。当记录满足所有搜索条件之后,MySQL 就返回最终的搜索结果。与执行表的完全扫描相比,这种建立索引的方式虽然能使查询效率提高很多,但是MySQL扫描的记录数量仍旧远远超过了实际所需要的。
这时,我们可以考虑建立一个复合索引:
ALTER TABLE user ADD INDEX name_age_addr (name, age, address);
建立复合索引之后 MySQL能够立即转到合适的 name,然后再转到合适的 age,最后转到合适的 address。在没有扫描数据文件任何一个记录的情况下,MySQL就正确地找出了搜索的目标记录。
复合索引还有另外一个优点,它通过称为最左前缀的概念体现出来。继续考虑前面的例子,现在我们有一个 name,age,address列上的复合索引,我们称这个索引为 name_age_addr。当搜索条件是以下各种列的组合时,MySQL将使用 name_age_addr 索引:
name,age,address
name,age
name
从另一方面理解,它相当于我们创建了 (name,age,address)、(name,age)以及 (name) 这些列组合上的索引。
我们知道,当我们执行查询的时候,MySQL只能使用一个索引。如果你有三个单列的索引,MySQL 会试图选择一个查询优化器认为最有效的单列索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于 name,age,address这三个列上的复合索引。
有时候一个表中可能有几个索引,我们在查询的时候就想指定用哪一个索引。这时可以使用 force关键字。
例如:select * from table force index (index_name)。
以上是关于mysql index的主要内容,如果未能解决你的问题,请参考以下文章