MySQL学习-索引设计(二)

61 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情

前言

上篇我们学习了MySQL中的索引创建。有兴趣的小伙伴可以阅读(MySQL学习-索引设计(一))。
下面我们继续学习MySQL中的索引设计。

索引设计

哪些情况适合创建索引

  1. 多表JOIN连接操作时,创建索引注意事项
  • 首先,连接表的数量尽量不要超过3张,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长会非常快,严重影响查询的效率。
  • 其次,对WHERE条件创建索引,因为WHERE才是对数据条件的过滤。如果在数据量非常大的情况下,没有WHERE条件过滤是非常可怕的。
  • 最后,对用于连接的字段创建索引,并且该字段在多张表中的类型必须一致。
  1. 使用列的类型小的创建索引
  2. 使用字符串前缀创建索引
  3. 区分度高的列适合作为索引
  4. 使用最频繁的列放到联合索引的左侧

哪些情况不适合创建索引

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

冗余索引

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既是主键,又给它定义为一个唯一索引,还给它定义了一个普通索引,可是主键本身就会生成聚簇索引,索引定义的唯一索引和普通索引是重复的,这种情况要避免。

今天先学习到这里,明天继续。