MySQL进阶语法

1. create index布局

格式:create「unique | fulltext | spatial」index「idx_name」on「tbl_name」(indexed_col_name, ...) [index_option]spa

功能:建立新的索引索引

选项和参数:字符串

indexed_col_name:col_name [(length)]io

index_option:innodb

        key_block_size [=] valuetable

        index_typetest

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

若是你指定的索引类型对存储引擎无效,而另外一索引类型对该存储引擎有效,且不影响查询结果,那么存储引擎将使用有效的索引类型