1. create index
格式:create「unique | fulltext | spatial」index「idx_name」on「tbl_name」(indexed_col_name, ...) [index_option]
功能:创建新的索引
选项和参数:
indexed_col_name:col_name [(length)]
index_option:
key_block_size [=] value
index_type
index_type:
using {BTREE | HASH}
示例:
create index idx_test1 on employee (sex, name);
create unique index idx_test2 on employee (id, name) using BTREE;
说明:
① create index被映射为alter table语句,用以创建索引。请注意,create index不能创建主键,创建主键需使用alter table;
② 通常应该在创建表的同时,即create table语句中,创建所需的全部索引。对于InnoDB表尤为如此,因为InnoDB表的主键决定了数据文件中行的物理布局。create index语句的作用是帮助你向已经存在的表中添加索引;
③ (col1, col2, ...)形式的列列表用于创建一个多列索引(组合索引),此时索引键的键值由所有列值组合而成;
④ 所有存储引擎都允许唯一索引在可为NULL的列上同时包含多个NULL值;
⑤ 支持空间数据类型(POINT和GEOMETRY)的存储引擎有:InnoDB, MyISAM, NDB和ARCHIVE;
1.1 创建前缀索引
对于字符串类型的列,可以使用值的前缀来创建索引
语法:create index「idx_name」on「tbl_name」(col_name(length));
参数:col_name(length)用于指定索引前缀长度
优势:使用前缀索引可以使索引文件更小,这样可以节省大量磁盘空间,甚至还可以加速insert操作
说明:
① 可以为char, varchar, binary和varbinary类型的列创建前缀索引;
② blob和text类型的列必须使用前缀索引;
③ 前缀限制以字节为单位。在create table, alter table, create index语句中,为非二进制字符串类型(char, varchar, text)指定的前缀长度被解释为字符长度;为二进制字符串类型(binary, varbinary, blob)指定的前缀长度则被解释为字节长度。在为多字节字符集的非二进制字符串类型的列指定前缀长度时,应考虑到这一点;
④ 是否支持前缀索引以及前缀索引的长度限制,与存储引擎有关。例如,正常情况下InnoDB表的前缀限制为767字节,如果开启innodb_large_prefix选项则可以长达3072字节;对于MyISAM表,前缀限制为1000字节;
示例:
create index idx_name on customer (name(10));
该语句使用name列的前10个字符创建索引(假定name是非二进制字符串类型)
1.2 索引的特性
◇ 全文索引:
① 只有MyISAM存储引擎支持全文索引;
② 索引列必须为char, varchar或者text类型;
③ 必须索引整个列,不能使用列前缀(前缀长度自动被忽略);
◇ 空间索引:
① 只有MyISAM存储引擎支持空间索引。为其它存储引擎指定空间索引将导致错误;
② 索引列不能为NULL;
③ 必须索引整个列,不能使用列前缀;
◇ 普通索引(非空间索引):
① 除ARCHIVE外,所有支持空间数据类型的存储引擎,都支持非空间索引;
② 除主键外,索引中的列可以为NULL;
③ 除POINT外,非空间索引中的空间列必须使用列前缀,必须指定列前缀长度,单位字节;
④ 非空间索引的索引类型取决于存储引擎,目前使用B-Tree;
⑤ 只有InnoDB, MyISAM和MEMORY存储引擎支持在可为NULL的列上添加索引;
⑥ 只有InnoDB和MyISAM存储引擎支持在blob和text类型的列上添加索引;
1.3 索引选项
在索引列列表之后,可以给出索引选项。index_option值可以为:
◇ key_block_size [=] value
对于MyISAM表,key_block_size用于指定索引键的块大小,以字节为单位。该值仅为提示,如有必要,一个不同的大小将被使用。为单个索引定义指定的key_block_size值将覆盖表级别的key_block_size值
InnoDB存储引擎不支持索引级别的key_block_size
◇ index_type
某些存储引擎允许你在创建索引时指定索引类型,例如:
create index id_test on lookup (id) using BTREE;
下图显示了不同存储引擎允许支持的索引类型。在有多个索引类型的情况下,当没有显式给出索引类型说明符时,默认使用第一个。表中未列出的存储引擎不支持在索引定义中使用index_type子句
index_type子句不能用于全文索引和空间索引。全文索引的实现依赖于具体的存储引擎。空间索引固定被实现为R-Tree
如果你指定的索引类型对存储引擎无效,而另一索引类型对该存储引擎有效,且不影响查询结果,那么存储引擎将使用有效的索引类型