Index
Create Index
Grammar
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[index_type]
ON tbl_name (index_col_name,...)
[index_option]
[algorithm_option | lock_option] ...
index_col_name:
col_name [(length)] [ASC | DESC]
index_type:
USING {BTREE | HASH}
index_option:
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
algorithm_option:
ALGORITHM [=] {DEFAULT|INPLACE|COPY}
lock_option:
LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}
CREATE INDEX 不能用来创建PRIAMARY_KEY,如果需要创建PRIMARY_KEY需要使用ALTER TABLE;
通常在建表的时候(CREATE_TABLE)中创建索引,在InnoDB引擎中,PRIMARY_KEY决定了行在数据文件里的物理格局(似乎更主张在建表的时候指定索引和主键之类的属性)。
可以基于多列创建索引。
-
对String类型的列创建索引时需要注意的:
- 可以为String类型的列(CHAR,VARCHAR, BINARY, VARBINARY)指定前缀索引。
- Prefixes must be specified for BLOB and TEXT column indexes.
- 由于String型的列有不同的数据类型,而且又有不同的长度,所以为String列建索引的时候需要考虑到前缀长度。
- 空间类型的列不能建索引。(TODO)
- 如果一个某一个string列中,它们大部分行都能以前10个字符来区分开彼此,那么这个索引的速度不会比整个列长度的索引慢很多(实际应该也存在这种情况,比如身份证号若存于19长度的字符,或许在一定数量级下,以前9位建索引跟以19为建索引的效率相差不明显),更短的索引长度会节省更多的磁盘空间,同时会提高INSERT操作的执行速度。
MySQL Cluster formerly supported online CREATE INDEX operations using an alternative syntax that is no longer supported.
-
UNIQUE 唯一索引:
- 唯一索引限定了一个约束条件:被索引的列必须是唯一的(不重复的),如果插入一行与已经存在的某一行数据的索引是相同的,这时候会报错。
- 所有的Mysql引擎里,唯一索引允许它索引的行为NULL值(前提是该行允许存储NULL值);
- 如果为一列指定前缀唯一索引,那么必须保证这一列的值在前缀长度内为唯一。
A UNIQUE index creates a constraint such that all values in the index must be distinct. An error occurs if you try to add a new row with a key value that matches an existing row. For all engines, a UNIQUE index permits multiple NULL values for columns that can contain NULL. If you specify a prefix value for a column in a UNIQUE index, the column values must be unique within the prefix.
-
FULLTEXT 全文索引:
- FULLTEXT indexes are supported only for InnoDB and MyISAM tables and can include only CHAR, VARCHAR, and TEXT columns.
- Indexing always happens over the entire column;
- column prefix indexing is not supported and any prefix length is ignored if specified.