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表,有如下几列 idnameageaddress。这个表的主要用途就是根据用户的名称,年龄,地址返回用户的 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就正确地找出了搜索的目标记录。
复合索引还有另外一个优点,它通过称为最左前缀的概念体现出来。继续考虑前面的例子,现在我们有一个 nameageaddress列上的复合索引,我们称这个索引为 name_age_addr。当搜索条件是以下各种列的组合时,MySQL将使用 name_age_addr 索引:  

nameageaddress

nameage

name

从另一方面理解,它相当于我们创建了 (nameageaddress)(nameage)以及 (name) 这些列组合上的索引。

我们知道,当我们执行查询的时候,MySQL只能使用一个索引。如果你有三个单列的索引,MySQL 会试图选择一个查询优化器认为最有效的单列索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于 nameageaddress这三个列上的复合索引。

有时候一个表中可能有几个索引,我们在查询的时候就想指定用哪一个索引。这时可以使用 force关键字。

例如:select * from table force index (index_name)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值