持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
前言
上篇我们学习了MySQL中的索引创建。有兴趣的小伙伴可以阅读(MySQL学习-索引设计(一))。
下面我们继续学习MySQL中的索引设计。
索引设计
哪些情况适合创建索引
- 多表JOIN连接操作时,创建索引注意事项
- 首先,连接表的数量尽量不要超过3张,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长会非常快,严重影响查询的效率。
- 其次,对WHERE条件创建索引,因为WHERE才是对数据条件的过滤。如果在数据量非常大的情况下,没有WHERE条件过滤是非常可怕的。
- 最后,对用于连接的字段创建索引,并且该字段在多张表中的类型必须一致。
- 使用列的类型小的创建索引
- 使用字符串前缀创建索引
- 区分度高的列适合作为索引
- 使用最频繁的列放到联合索引的左侧
哪些情况不适合创建索引
- 在WHERE中使用不到的字段,不要设置索引
- 数据量小的表最好不要使用索引,比如不到1000行,是不需要创建索引的。
- 有大量重复数据的列上不要创建索引。
- 避免对经常更新的表创建过多的索引。
- 不建议用无序的值作为索引。
- 删除不再使用或很少使用的索引。
- 不要定义冗余或重复的索引。
冗余索引
CREATE TABLE test(
id INT AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
birthday DATA NOT NULL,
KEY idx_name_birthday(name(10), birthday),
KEY idx_name (name(10))
);
这里通过idx_name_birthday索引就可以对name列进行快速检索,再创建一个专门对name的列的索引就算是一个冗余索引,维护这个索引只会增加维护的成本,并不会对搜索有什么好处。
重复索引
CREATE TABLE test(
id1 INT PRIMARY KEY,
id2 INT,
UNIQUE uk_idx_id1 (id1),
INDEX idx_id2 (id1)
);
id1既是主键,又给它定义为一个唯一索引,还给它定义了一个普通索引,可是主键本身就会生成聚簇索引,索引定义的唯一索引和普通索引是重复的,这种情况要避免。
今天先学习到这里,明天继续。