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

二、索引的类型
mysql支持四种索引:
1、主键索引
2、唯一索引
3、普通索引
4、全文索引

无论任何形式的索引,都是通过建立关键字与位置的对应关系来实现的。
差异:对索引关键字的要求不同。
关键字:记录部分数据(某个字段,某些字段,某个字段的一部份)

普通索引(index):对关键字没有要求
唯一索引(unique index):要求关键字不能重复,同时增加唯一约束。
主键索引(primary key):要求关键字不能重复,同时不能为NULL。
全文索引(fulltext key):关键字的来源不是所有字段的数据,而是从字段中提取的特别关键字。

*如果一个索引通过在多个字段上提取的关键字,称之为复合索引。

三、索引的语法
创建: 1、创建表时创建索引 create table student ( id int unsigned not null auto_increment, name varchar(32) not null default '', nickname varchar(32) not null default '', sn char(12) not null default '', desc text, primary key (`id`), --主键索引 unique index `ui_sn` (`sn`), --唯一索引 index `name_nickname` (`name`,`nickname`), --复合索引 fulltext index `fi_desc` (`desc`) --全文索引 )engine=myisam charset=utf8; 索引可以起名字,主键索引不能起名字,一个表只能有一个主键索引,其它索引可以有多个。名字可以省略,mysql自动生成。 2、更新表结构时创建索引 alter table student add primary key (`id`); alter table student add unique index `ui_sn` (`sn`); alter table student add index `name_nickname` (`name`,`nickname`); alter table student add fulltext index `fi_desc` ('desc'); *如果表中存在数据,数据符合唯一或主键的约束才能创建成功。 *auto_increment属性,依赖于key。 删除: alter table student drop primary key; alter table student drop index `ui_sn`; alter table student drop index `name_nickname`; alter table student drop index `fi_desc`; 四、索引的使用 可以通过在select语句前使用explain,来获取该查询语句的执行计划。
mysql优化概述2 - 怀素真 - 因上努力 果上随缘
1、索引的使用场景
索引检索:条件过滤
索引排序:如果order by排序需要的字段上存在索引,可能使用到索引。
索引覆盖:索引拥有的关键字内容,覆盖了查询所需要的全部数据,此时就不需要数据区获取数据,仅仅在索引区中。

student表结构如下:
mysql优化概述2 - 怀素真 - 因上努力 果上随缘
如果我们要查询name,nickname,和sn这三个字段:

> select name,nickname,sn from student where name like 'a%';
通过分析我们可以在ename上建立索引来提高查询效率。

> alter table student add index `i_name` (`name`);

> explain select name,nickname,sn from student where name like 'a%'\G;
mysql优化概述2 - 怀素真 - 因上努力 果上随缘
如上所示,查询确实用到了索引。
如果我们在name,nickname和sn上建立一个复合索引,结果会是怎么样?

> alter table student add index `i_nns` (`name`,`nickname`,`sn`);
mysql优化概述2 - 怀素真 - 因上努力 果上随缘
如上所示,只需要检索出索引中的所有数据即可。
 
五、索引使用的原则
索引存在,没有满足使用原则,导致索引无效。
1、列独立,如需要某个字段上使用索引,则字段在参与的表达式中,保证字段独立在一侧。
mysql优化概述2 - 怀素真 - 因上努力 果上随缘
如上所示,id+1=5 就不是独立列,所以没有使用索引。

2、左原则
LIKE:所匹配的关键字必须在左边,如果通配符出现在左边将不能使用索引。
mysql优化概述2 - 怀素真 - 因上努力 果上随缘
复合索引:仅仅针对左边字段有效果
mysql优化概述2 - 怀素真 - 因上努力 果上随缘
3、OR的原则
必须要保证两端的条件都存在可以使用的索引,才能使用到索引。
mysql优化概述2 - 怀素真 - 因上努力 果上随缘
4、mysql智能选择
即使满足了如上的原则,mysql也不一定会使用索引。
弃用索引的主要原因:查询即使使用索引,会导致出现大量的随机IO,相对于数据记录从第一条遍历到最后一条的顺序IO开销,还要大。

 

 

posted on 2017-01-17 20:04  怀素真  阅读(135)  评论(0编辑  收藏  举报