MySQL进阶语法

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

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

原文地址:https://www.cnblogs.com/chaikefusibushiji/p/7475562.html