索引类型
- 普通索引
- 创建索引 [idx_列名]
- 例如 CREATE INDEX 索引的名字 ON tablename (列名);
- 修改表
- 例如 ALTER TABLE tablename ADD INDEX 索引的名字 (列名);
- 创建表
- 例如 CREATE TABLE tablename ( […], INDEX 索引的名字 (列名) );
- 创建索引 [idx_列名]
- 唯一索引 [uk_列名]
- 创建索引
- 例如 CREATE UNIQUE INDEX 索引的名字 ON tablename (列的列表);
- 修改表
- 例如 ALTER TABLE tablename ADD UNIQUE 索引的名字 (列的列表);
- 创建表
- 例如 CREATE TABLE tablename ( […], UNIQUE 索引的名字 (列的列表) );
- 创建索引
- 主键索引 [pk_列名]
- 主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。如果你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定,例如“CREATE TABLE tablename ( […], PRIMARY KEY (列的列表) ); ”。但是,我们也可以通过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。 (主键相当于聚合索引,是查找最快的索引)
- 组合索引 [idx_列名_列名…n]
- 创建索引
- 例如 CREATE INDEX 索引的名字 ON tablename (列名1,列名2,…);
- 修改表
- 例如 ALTER TABLE tablename ADD INDEX 索引的名字 (列名1,列名2,…);
- 创建表
- 例如 CREATE TABLE tablename ( […], INDEX 索引的名字 (列名1,列名2,…) );
- 创建索引
索引使用规范
- 单表索引数量不得超过5个。
- 单个索引中的字段不得超过5个。
- 索引名称必须全部使用小写。
- 非唯一索引命名规范,“idx_字段名称”。例如:idx_name
- 唯一索引命名规范,“uniq_字段名称”。例如:uniq_name
- 组合索引命名规范,“dx_字段名称[多个字段则在后续 _字段名称]”,建议包含所有字段名称,过程的字段名称可采用缩写。例如:idx_name_age_sex_brithday -> idx_n_a_s_b
- 表必须存在主键,推荐使用 [UNSIGNED属性就是将数字类型无符号化]自增列作为使用主键。
- 唯一键由3个以下字段组成,并且字段都是(整)(形)(时),可使用唯一键作为主键。其他情况下,建议使用自增列或发号器作主键。
- 禁止冗余索引。(影响insert、update、delete操作效率)
- 禁止重复索引 。(影响insert、update、delete操作效率)
- 禁止使用外键。
- 联表查询是,join列的数据类型必须为相同类型,并且建立索引。
- 不允许在低基数列上建立索引,例如:性别
- 选择区分度大的列建立索引。组合索引中,区分度大的字段放在最前面。
- 对字符串使用前缀索引,前缀索引长度不得超过8个字符。
- 不允许对过长的 VARCHAR 字段建立索引。建议优先考虑前缀索引或添加CRC32或MD5伪列建立索引。
- 合理创建组合索引,例如(a,b,c)相当于 (a)、(a,b)、(a,b,c)。
- 合理使用覆盖索引减少IO,避免排序。