一般来说索引可以分为普通索引,主键索引,全文索引,唯一索引和空间索引。

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 关闭自动提交
posted on 2016-02-25 15:56  迷阳  阅读(229)  评论(0编辑  收藏  举报