http://www.runoob.com/mysql/mysql-index.html
http://blog.csdn.net/xluren/article/details/32746183
一、索引的介绍
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),他们包含着对数据表里所有记录的引用指针。
●索引分为单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
创建索引时,需要确保索引时应用在SQL查询语句的条件(一般作为WHERE子句的条件)。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
●上面都在说使用索引的好处,但过多的使用索引将会造成滥用,因此索引也会有缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、DELETE和UPDATE操作时,因为需要更新表,MYSQL不仅要保存数据,还要保存一下索引文件。
并且建立索引也占用磁盘空间的索引文件。
●索引也分为 聚合索引和非聚合索引。图书馆例子(书架号、作者名)和字典例子(拼音、偏旁)
二、索引的使用
普通索引
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定length
修改表结构(添加索引)
ALTER TABLE tablename ADD INDEX indexname(columnName)
删除索引
DROP INDEX [indexName] ON mytable;
四种方式添加索引
使用ALTER 命令添加和删除索引
有四种方式来添加数据表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list):
该语句添加一个主键(索引),这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list):
这条语句创建索引的值必须是唯一(索引)的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list):
添加普通索引,索引值可出现多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column1, column2):
ELECT * FROM tablename WHERE MATCH(column1, column2) AGAINST(‘xxx′, ‘sss′, ‘ddd′)
该语句指定了索引为 FULLTEXT ,用于全文索引,FULLTEXT索引仅可用于 MyISAM 表,对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
文本字段上(text)如果建立的是普通索引,那么只有对文本的字段内容前面的字符进行索引,其字符大小根据索引建立索引时申明的大小来规定。
如果文本中出现多个一样的字符,而且需要查找的话,那么其条件只能是where column like '%xxx%'这样会使索引失效
此时便可以使用全文索引,上述命令将把column1和column2字段里有xxx、sss和ddd的数据记录全部查询出来。
与上述单一索引相对的组合索引
最左前缀
如果你建立了 组合索引(nickname_account_createdTime_Index) 那么他实际包含的是3个索引 (nickname) (nickname,account)(nickname,account,created_time)
在使用查询的时候遵循mysql组合索引的"最左前缀",下面我们来分析一下 什么是最左前缀:及索引where时的条件要按照建立索引的时候字段的排序方式
1、不按索引最左列开始查询(多列索引) 例如index(‘c1’, ‘c2’, ‘c3’) where ‘c2’ = ‘aaa’ 不使用索引,where c2
= aaa
and c3
=sss
不能使用索引
2、查询中某个列有范围查询,则其右边的所有列都无法使用查询(多列查询)
Where c1= ‘xxx’ and c2 like = ‘aa%’ and c3=’sss’ 改查询只会使用索引中的前两列,因为like是范围查询
3、不能跳过某个字段来进行查询,这样利用不到索引,比如我的sql 是
explain select * from award
where nickname > 'rSUQFzpkDz3R' and account = 'DYxJoqZq2rd7' and created_time = 1449567822; 那么这时候他使用不到其组合索引.
因为我的索引是 (nickname, account, created_time),如果第一个字段出现 范围符号的查找,那么将不会用到索引,如果我是第二个或者第三个字段使用范围符号的查找,那么他会利用索引,利用的索引是(nickname),
因为上面说了建立组合索引(nickname, account, created_time), 会出现三个索引