索引分类|索引创建、删除|索引设计原则

1. 索引分类

1.1 不同角度进行索引分类

  • 功能逻辑:普通索引、唯一索引、主键索引、全文索引;
  • 物理实现:聚簇索引、非聚簇索引;
  • 作用列的数量:单列索引、联合索引;

1.2 不同索引概述

1)普通索引

  • 用于提高检索效率,可创建在任何数据类型上;

2)唯一索引

  • 使用UNIQUE参数设置索引为唯一性索引;
  • 要求作用列可以为空,但必须是唯一存在不能重复;
  • 数据表可以存在多个唯一索引;
  • 唯一索引可以快速定位记录;

3)主键索引

  • 特殊的唯一性索引,要求主键索引不能为空,可看做使用UNIQUE参数+NOT NULL参数设置索引为主键索引;
  • 数据表只能存在一个主键索引,主键索引即聚簇索引;

4)单列索引

  • 作用在单个字段上的索引;
  • 数据表可存在多个单列索引;

5)联合索引

  • 作用在多个字段上的索引;
  • 联合索引使用时遵循最左前缀原则;

6)全文索引

  • 可使用FULL TEXT设置全文索引,也称为全文检索,是搜索引擎使用的一种关键技术;
  • 使用分词技术统计关键词频率和重要性,筛选期望的搜索结果;
  • 适用于大文本数据集;
  • 查询数据量较大的字符串类型的字段时,使用全文索引可提高查询速度;

2. 创建|删除索引

2.1 创建表时隐式创建索引

  • 在创建表时通过添加约束,如主键约束、唯一性约束、外键约束时,默认会创建对应索引;

2.2 创建表时显式创建索引

  • 在创建表时通过INDEX等参数显式创建索引;
  • 基本语法:
CREATE TABLE table_name 
[col_name data_type]
[UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [index_name] (col_name [length]) [ASC |
DESC]
  • UNIQUE 、 FULLTEXT 和 SPATIAL 为可选参数,分别表示唯一索引、全文索引和空间索引;
  • INDEX 与 KEY为同义词,两者的作用相同,用来指定创建索引;
  • index_name指定索引的名称,为可选参数,如果不指定,那么MySQL默认col_name为索引名;
  • col_name为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;
  • length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;
  • ASC 或 DESC 指定升序或者降序的索引值存储。
  • 查看索引方式:1)方式一:show create table 表名;2)方式二:show index from 表名;3) 方式三:explain SQL语句,如查询语句;
  • 注意事项:
    1)创建唯一性索引时,自动为对应字段添加唯一性约束,反之亦然;
    2)创建主键索引需要通过主键约束的形式添加;
    3)创建全文索引需要注意只能作用于CHAR、VARCHAR、TEXT类型的字段;
    4)对于联合索引需要注意,字段排列顺序影响最后B+树的构成,B+树数据页中的关键字排序同时按照这些字段排列顺序依次比较,使用联合索引时需要遵循最左前缀匹配原则,否则索引不会命中;

2.3 创建表后显式创建索引

2.3.1 方式一:ALTER TABLE ADD

ALTER TABLE table_name 
ADD [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY][index_name] (col_name[length],...) [ASC | DESC]

2.3.2 方式二:CREATE INDEX ON

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
ON table_name (col_name[length],...) [ASC | DESC]

2.4 删除索引

2.4.1 方式一:ALTER TABLE DROP

ALTER TABLE table_name DROP INDEX index_name;

2.4.2 方式二:DROP INDEX ON

DROP INDEX index_name ON table_name;

2.4.3 删除索引注意事项

  • 主键索引的索引名恒为PRIMARY KEY;
  • 有AUTO _INCREMENT约束的唯一索引无法被删除,因为AUTO _INCREMENT作用于主键约束或唯一性约束列;
  • 删除构建索引的列时,该列也会从索引中删除,当构成索引的所有列都被删除,则索引也会被删除;

3. MySQL8.0新特性

  • 支持降序索引、隐藏索引;

3.1 降序索引

  • 可在创建索引时通过DESC参数设置索引的关键字降序排列;
  • 对于有降序排列需求的字段性能有所提升;

3.2 隐藏索引

  • 可在创建索引时通过指定INVISIBLE参数设置索引是否隐藏;
  • 优化器无法使用隐藏索引;
  • 先将索引设置为隐藏索引,然后进行索引删除的操作称为软删除;
  • 主键索引不能被设置为隐藏索引;
  • 注意:隐藏索引虽然不能被优化器使用,但与正常索引一样实时更新,依然会影响数据更新操作的性能;

3.2.1 创建隐藏索引

3.3.1.1 创建表时设置索引可见性

CREATE TABLE tablename(
propname1 type1[CONSTRAINT1],
propname2 type2[CONSTRAINT2],
……
propnamen typen,
INDEX [indexname](propname1 [(length)]) INVISIBLE
);

3.3.1.2 创建表后设置索引可见性

方式一:ALTER TABLE ADD

ALTER TABLE tablename
ADD INDEX indexname (propname [(length)]) INVISIBLE

方式二:CREATE INDEX ON

CREATE INDEX indexname
ON tablename(propname[(length)]) INVISIBLE;

3.2.2 修改索引可见性

ALTER TABLE tablename ALTER INDEX index_name INVISIBLE; #切换成隐藏索引
ALTER TABLE tablename ALTER INDEX index_name VISIBLE; #切换成非隐藏索引

4. 索引设计原则

4.1 适合创建索引的情况

  • 1)有唯一性限制的字段;
  • 2)经常用作WHERE筛选条件的字段;
  • 3)经常 GROUP BY 和 ORDER BY的字段;
  • 4)UPDATE、DELETE 的 WHERE条件字段;
  • 5)DISTINCT 字段需要创建索引;
  • 6)多表 JOIN 连接操作时,创建索引注意事项:①对WHERE过滤条件字段创建索引;②对连接字段创建索引;
  • 7)使用列的数据类型内存占用小的创建索引;
  • 8)使用字符串前缀创建索引,可以使用 count(distinct left(列名, 索引长度))/count(*)的区分度来确定前缀长度;
  • 9)区分度高(散列性高)的列适合作为索引;
  • 10)使用最频繁的列放到联合索引的左侧;
  • 11)在多个字段都要创建索引的情况下,联合索引优于单值索引;

4.2 不适合创建索引的情况

  • 1)在where中使用不到的字段,不要设置索引;
  • 2)数据量小的表最好不要使用索引;
  • 3)有大量重复数据的列上不要建立索引;
  • 4)避免对经常更新的表创建过多的索引;
  • 5)不建议用无序的值作为索引;
  • 6)删除不再使用或者很少使用的索引;
  • 7)不要定义冗余或重复的索引;

猜你喜欢

转载自blog.csdn.net/qq_43665602/article/details/131612499