mysql_index.txt
    索引是加快访问表内容的基本手段,尤其是在涉及多个表的关联查询里。
    MySQL提供了多种灵活的索引创建办法:

    1. 可以对单个列或多个列建立索引。多列索引也被称作复合索引。

    2. 索引可以只包含唯一值,也可以包含重复值。

    3. 可以为同一个表创建多个索引,帮助优化对标的不同类型的查询。

    4. 对于除ENUM和SET以外的字符串类型,可以利用列的前缀创建索引。也就是说,支队列名的最左边n个字符(对于非二进制串类型)或n个字节(对于二进制串类型)创建索引。

    1. 存储引擎的索引特性
    索引特性 InnoDB MyISAM MEMORY
    是否允许使用null值
    每个索引的列数 16 16 16
    每个表的索引数 64 64 64
    索引行的最大长度(字节) 3072 1000 3072
    是否支持列前缀索引
    列前缀的最大长度(字节) 767 1000 3072
    是否支持BLOB/TEXT索引
    是否支持FULLETXT索引 5.6.4版本以上
    是否支持SPATIAL索引
    是否支持HASH索引

    索引的分类
    唯一索引。对于单列值、或多列(复合)索引都不允许重复值
    常规索引(非唯一)。会出现重复值的情况
    FULLTEXT索引。用于全文检索,引擎支持详见上图表格
    ……
    创建索引

    ALTER TABLE tb1_name ADD INDEX index_name(index_columns);
    ALTER TABLE tb1_name ADD UNIQUE index_name(index_columns);
    ALTER TABLE tb1_name ADD PRIMARY KEY (index_columns);
    ALTER TABLE tb1_name ADD FULLTEXT index_name(index_columns);
    ALTER TABLE tb1_name ADD SPATIAL index_name(index_columns);
    

    其中,tb1_name是要添加索引的那张表的名字,index_columns是要进行索引的列(如果要索引多个列,则需要使用逗号隔开)。索引名index_name是可选的。如果没指定它,那么MySQL会根据第一个索引列的名字选取一个名字。

    如果想要限制某个索引,让它只包含唯一值,那么可以把这个索引创建为PRIMARY KEY或UNIQUE索引。这两种索引很相似,主要区别为:
    1,每个表只能包含一个primary key。因为primary key的名字总是为primary,而同一个表不允许有两个同名的索引。可以在一个表里放置多个unique索引。
    2,primary key不可以包含null值,而unique索引可以。如果某个unique索引包含了null值,那么它就可以包含多个null值。这是因为null值不会与任何值相等,甚至与另一个null值也一样不相等。

    除了primary key以外,大部分索引类型都可以用create index语句添加:

    CREATE INDEX index_name ON ta1_name (index_columns);
    CREATE UNIQUE INDEX index_name ON tb1_name (index_columns);
    CREATE FULLTEXT INDEX index_name ON tb1_name (index_columns);
    CREATE SPATIAL INDEX index_name ON tb1_name (index_columns);
    

    如果想在创建表的时候创建索引,语法格式为:

    CREATE TABLE tb1_name{
        ...列定义...
        INDEX index_name (index_columns),
        UNIQUE index_name(index_columns),
        PRIMARY KEY (index_columns),
        FULLTEXT index_name(index_columns),
        SPATIAL index_name (index_columns),
        ...
    };
    

    作为一个特殊情况,通过在某列的定义末尾加上primary key或unique子句,可以创建一个单列的primary key或unique索引。例如下面两条create table是等价的:

    CREATE TABLE mytb1{
        i INT NOT NULL PRIMARY KEY,
        j CHAR(10) NOT NULL UNIQUE
    };
    
    CREATE TABLE mytb1{
        i INT NOT NULL,
        j CHAR(10) NOT NULL,
        PRIMARY KEY(i),
        UNIQUE(J)
    };
    


    删除索引
    删除索引的语法是,使用DROP INDEX或ALTER TABLE语句。如果要使用DROP INDEX语句,则必须给出那个要被删除的索引的名字:

    DROP INDEX index_name ON tb1_name;
    

    如果要用DROP INDEX语句来删除PRIMARY KEY,则必须以带引号标识符的形式给指定名字PRIMARY:

    DROP INDEX 'PRIMARY' ON tb1_name;
    

    与CREATE INDEX语句相类似,DROP INDEX语句会被内部处理成ALTER TABLE语句。

    ALTER TABLE tb1_name DROP INDEX index_name;
    ALTER TABLE tb1_name DROP PRIMARY KEY;