无法创建索引

之前有一个场景,看到Navicat里面创建索引的时候,可选的索引方法

innodb索引类型有哪些_1024程序员节


是有两种的,一种是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来说只支持树的索引方式。下面在发下不同数据库引擎的索引方式。

innodb索引类型有哪些_MySQL_02