标签:
Mysql索引包含:普通索引、主键索引、唯一索引、全文索引,为了适应不同的查询、数据结构,提高查询速度,选择合适的索引方式。
1.普通索引
这是最基本的索引,它没有任何限制。
普通索引的创建方式:
一般来说,普通索引的创建,是先创建表,然后在创建普通索引,代码如下
create table ccc( id int unsigned, name varchar(32) ) create index ccc_index on ccc (id,name);
修改表结构创建索引:
ALTER mytable ADD INDEX [indexName] ON (username(length))
创建表是指定索引:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );
删除索引:
DROP INDEX [indexName] ON ccc;
注:上述实例代码中的 length,如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
主键没有着明确的概念定义,其是索引的一种,并且是唯一性索引的一种,且必须定义为“PRIMARY KEY”,主键不能重复,一个表只能有一个主键。
主键字段,不能为NULL,也不能重复;一般是在建表的时候同时创建主键索引;
当一张表,把某个列设为主键的时候,则该列就是主键索引。
创建表时指定主键索引,实例
create table aaa (id int unsigned primary key auto_increment , name varchar(32) not null defaul ‘’);
建表完成后创建索引:
alter table 表名 add primary key (列名);
全文索引,主要是针对对文件,文本的检索, 比如文章, 全文索引针对MyISAM有用.
创建全文索引,实例:
CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body) )engine=myisam charset utf8;
全文索引的使用方式,实例:match() against()
select * from articles where match(title,body) against(‘database’);
注:
以下全文停止词部分展示,其他可以查阅MySQL手册
当表的某列被指定为unique约束时,这列就是一个唯一索引;
unique字段可以为NULL,并可以有多个NULL, 但是如果是具体内容,则不能重复.
创建表时声明唯一索引,实例:
create table ddd( id int primary key auto_increment , name varchar(32) unique);
在创建表后,再去创建唯一索引,实例:
create table eee( id int primary key auto_increment, name varchar(32)); create unique index eee_index on eee(name);
1.查询索引
show index[es] from tableName; #或者 show keys from tableName;
2.删除索引
alter table tableName drop index indexName;
3.修改索引
先删除,再重新创建.
例如MyISAM在磁盘上存储成3个文件,其中文件名和表名都相同,但是扩展名分别为:
查询速度变快,但是为什么变快?
简单理解:没有索引的情况,要进行全表查询,加上索引后利用BTree方式进行数据检索,要检索的数据量大大减少,索引检索速度要快的多。
可以参考MySQL索引的实现方式,进行理解,参考文章
http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html
适合索引的情况:
使用索引的注意事项:
#实例说明:在dept表中创建符合索引 # dname 左边的列,loc就是右边的列 alter table dept add index my_ind (dname,loc);
说明,如果我们的表中有复合索引(索引作用在多列上), 此时我们注意:
explain select * from dept where loc=‘aaa‘\G #就不会使用到索引
#explain 可以帮助我们在不真正执行某个sql语句时,就执行mysql怎样执行,这样利用我们去分析sql指令.
explain select * from dept where dname=‘aaa‘\G #就会使用到索引
select * from dept where dname=’xxx’ or loc=’xx’ or deptno=45 #上述条件出现的条件字段必须建立索引
explain select * from dept where dname like ‘%aaa‘\G #不能使用索引,即,在like查询时,关键的 ‘关键字’ , 最前面,不能使用 % 或者 _这样的字符., 如果一定要前面有变化的值,则考虑使用 全文索引->sphinx.
explain 可以帮助我们在不真正执行某个sql语句时,就执行mysql怎样执行,这样利用我们去分析sql指令.
•extra :查询细节信息
Query语句中使用FROM DUAL 或不含任何FROM子句
Using filesort
当Query中包含 ORDER BY 操作,而且无法利用索引完成排序,
show status like ‘Handler_read%’;
大家可以注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。
handler_read_rnd_next:这个值越高,说明查询低效。
标签:
原文地址:http://www.cnblogs.com/ChaosJu/p/4545078.html