Mysql 5.7 创建索引官方解读

一、环境

Mysql 5.7

二、Mysql索引创建解读

1.概述

通常我们在使用CREATE TABLE时会创建所有的索引。索引的创建对于 InnoDB 表尤其重要,其中主键决定了数据文件中行的物理布局。

CREATE INDEX是另一种添加索引的方式,针对已经创建的表添加索引。注意,CREATE INDEX这种方式是被映射到 ALTER TABLE来创建索引。而且对于PRIMARY KEY不能使用CREATE INDEX,需要使用 ALTER TABLE

InnoDB支持虚拟列的二级索引。

当启用 innodb_stats_persistent设置后,每次在 InnoDB 表上创建索引后会运行 ANALYZE TABLE 语句。

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
    [index_type]
    ON tbl_name (key_part,...)
    [index_option]
    [algorithm_option | lock_option] ...

2.key part

key_part:
    col_name [(length)] [ASC | DESC]

(key_part1, key_part2, ...) 形式的索引规范创建具有多个key part的索引。索引键值是通过连接给定key part的值形成的。key part可以[ASC | DESC]结尾,可能在未来扩展用于指定索引值存储的升序或降序。但目前,在代码层面[ASC | DESC]参与解析,而索引值始终按升序ASC存储。

对于String列,可以创建仅使用列的值(关键的一部分值)的索引,使用 col_name(length) 语法来指定索引前缀长度。

key part需要注意一下几点:

1)可以对 CHAR、VARCHAR、BINARY 和 VARBINARY 的key part指定前缀。

2)必须对 BLOB 和 TEXT 的key part指定前缀。此外,BLOB 和 TEXT 列只能对 InnoDB、MyISAM 和 BLACKHOLE 表建立索引。

3)前缀的长度限制以byte来衡量。但是,CREATE TABLEALTER TABLECREATE INDEX句中索引规范的前缀长度被解释为:

非二进制字符串类型(CHARVARCHARTEXT)的char的个数;

和二进制字符串类型(BINARYVARBINARYBLOB)的byte的个数。

因此,在对一个multibyte的char set(MBCS)的非二进制字符串的列指定前缀长度时,要考虑到用byte衡量。

前缀支持和前缀长度(如果支持)取决于存储引擎。例如,对于InnoDB表,前缀最长可达 767 字节,如果启用了innodb_large_prefix选项,则最长可达 3072 字节。对于MyISAM表,前缀长度限制为 1000 字节。NDB存储引擎不支持前缀。

3.Mysql创建索引的SQL

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
    [index_type]
    ON tbl_name (key_part,...)
    [index_option]
    [algorithm_option | lock_option] ...

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}

4.InnoDB存储引擎支持的索引类型

InnoDB存储引擎支持的索引类型仅为BTREE。
在这里插入图片描述

5.InnoDB存储引擎的索引的特性

InnoDB存储引擎支持主键索引、唯一索引、普通索引使用BTREE的类型。但注意,对于主键索引而言,如果索引命中NULL值时,InnoDB存储引擎是不对NULL进行存储的,更不允许多个NULL值的。InnoDB存储引擎是不具备NULL和NOT NULL的索引检索。

而对于唯一索引、普通索引,如果索引命中NULL值是可行的,而且允许出现多个NULL值的情况。InnoDB存储引擎对这两种索引,是支持用索引进行NULL和NOT NULL的检索。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-otby8PzK-1656259347321)(/Users/zhanglf/Library/Application Support/typora-user-images/image-20220626234350011.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值