无法创建索引
之前有一个场景,看到Navicat里面创建索引的时候,可选的索引方法
是有两种的,一种是BTREE就是AKA的B+树,还有一种是HASH,实际平时我们都不会用到这个HASH,导致我一直以为InnoDB索引方式可以支持这两种。直到一天我自己试了一次之后发现是你当你选HASH的时候是不生效的,Navicat自动帮你转BTREE了。坑爹了,针对这个细节问题,翻译了MySQL的官方文档,参照MySQL5.6版本。
下面是一个完整的创建索引语句实例,具体我们看看可选的参数有什么:
CREATE [ONLINE | OFFLINE] [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
[index_type]
ON tbl_name (key_part,...)
[index_option]
[algorithm_option | lock_option] ...
# ASC|DESC目前是没用的
key_part:
col_name [(length)] [ASC | DESC]
index_option: {
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
}
index_type:
USING {BTREE | HASH}
algorithm_option:
ALGORITHM [=] {DEFAULT | INPLACE | COPY}
lock_option:
LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
- [ONLINE | OFFLINE]:这个参数主要是用于 NDB存储引擎的,是在分布式数据库集群中在线或者离线创建索引的,这个本人没用过,理解一下作用即可。
- [UNIQUE | FULLTEXT | SPATIAL] :这是索引的类型
- UNIQUE:唯一索引
- FULLTEXT:全文索引,注意InnoDB是用不了全文索引的,在MyISAM才适用,这也是它们兄弟两的区别之一。记忆方法就是只有B+树做不了全文索引,但是从MySQL5.6.4又支持了…。
- SPATIAL:这是对数据字段类型为空间类型的一个索引,也没有用过。
- [index_type]:这就是刚刚说的索引类型
- HASH:AKA哈希算法,只在内存引擎中存在,即MEMORY
- BTREE:AKA B+树/B树算法,在InnoDB中为B+,在MyISAM中为B
- [index_option]
- KEY_BLOCK_SIZE:对于MyISAM表, KEY_BLOCK_SIZE可以选择指定用于索引键块的字节大小。该值被视为提示;如有必要,可以使用其他大小。KEY_BLOCK_SIZE为单个索引定义指定的值将覆盖表级KEY_BLOCK_SIZE值。跟InnoDB也没有什么关系。
- index_type:可能会被抛弃,直接用前面的index_type把。
- WITH PARSER parser_name:指的是用的全文索引的解析器名称。
- [algorithm_option | lock_option]:这个配置主要跟修改ALTER TABLE语义一样,没用过,一般都是用ALTER TABLE的语义去增加索引的。
所以对于InnoDB,MyISAM来说只支持树的索引方式。下面在发下不同数据库引擎的索引方式。