您的位置:首页 > 数据库 > MySQL

mysql中的索引

2016-02-25 15:56 513 查看
一般来说索引可以分为普通索引,主键索引,全文索引,唯一索引和空间索引。

1 添加索引

a 创建表时添加

CREATE  TABLE
table_name [col_name data_type]
[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name [length]...) [ASC | DESC]

注意:

1. 创建表时指定primary key会自动生成主键索引

唯一、全文、空间索引分别添加关键词unique\fulltext\spatial index

普通索引直接用index可以进行指定

2. 创建索引时mysql会自动进行排序,通过asc和desc可以指定升序还是降序排列

3. 创建全文索引时必须指定myisam存储引擎

b 对已有表添加索引

alter table来添加索引
ALTER TABLE tbl_name
ADD {INDEX|KEY} [index_name] (index_col_name,...)
| ADD [CONSTRAINT [symbol]] PRIMARY KEY(index_col_name,...)
| ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name](index_col_name,...)
| ADD FULLTEXT [INDEX|KEY] [index_name](index_col_name,...)
| ADD SPATIAL [INDEX|KEY] [index_name](index_col_name,...)

使用create index来创建
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
ON tbl_name (index_col_name,...)

2 查询索引

主要有三种方法
desc table_name;
show index from table_name;
show indexes from table_name;
show keys from table_name;

3 删除索引

有两种方法
ALTER TABLE tbl_name
DROP PRIMARY KEY
| DROP {INDEX|KEY} index_name

DROP INDEX index_name ON tbl_name

4 修改索引

先删除,再重新创建

5 索引的代价

1. 磁盘占用
2. 对dml(delete, update, insert)语句会有影响

6 索引使用的限制

1. 对于使用like和regexp的查询,首字符不能为通配符
2. where条件里使用了!= 则不会使用索引
3. where条件里使用了函数,索引也会失效
4. 如果条件中有or语句,则必须要所有的部分都是索引;因此尽量少使用or语句
5. 如果列类型是字符串,则一定要讲数据用引号引起来,否则不适用索引
6. 如果mysql估计全表扫描比使用索引快则不会使用索引。

7 查看索引使用的情况

show status like 'Handler_read%';
Handler_read_key值越高说明索引使用率越高
Handler_read_rnd_next值说明不适用索引的查询量

8 大批量插入数据时索引的影响

对于MyISAM引擎:
alter table table_name disable keys;
loading data//insert...;
alter table table_name enable keys;
对于Innodb:
1. 将要导入的数据按照主键排序
2. set unique_checks=0关闭唯一性校验
3. set autocommit=0 关闭自动提交
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: