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)不要定义冗余或重复的索引;
今天的文章
创建索引和删除索引_索引的创建和使用分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/81312.html