Home
img of docs

详细解析不同类型的数据库索引(如单列索引、复合索引和唯一索引),以及如何在实际开发中选择和优化索引。

chou403

/ Database

/ c:

/ u:

/ 5 min read


表索引的使用

在关系型数据库中,索引是提升查询性能的重要工具。索引类似于书的目录,可以加速数据检索,减少查询的响应时间。下面详细介绍表索引的类型,创建,使用和优化。

索引的类型

  1. 单列索引:

    • 在单个列上创建的索引。
    • 用于加速该列上的查询。
       CREATE INDEX idx_column_name ON table_name(column_name);
  2. 复合索引(多列索引):

    • 在多个列上创建的索引。
    • 用于加速涉及这些列组合的查询。
       CREATE INDEX idx_columns ON table_name(column1, column2);
  3. 唯一索引:

    • 确保索引列的值唯一。
       CREATE UNIQUE INDEX idx_unique_column ON table_name(column_name);
  4. 全文索引(仅适用于某些数据库,如 MySQL):

    • 用于全文搜索,加速文本数据的搜索。
       CREATE FULLTEXT INDEX idx_fulltext_column ON table_name(column_name);
  5. 聚簇索引(Clustered Index):

    • 改变表的物理存储顺序,只能有一个聚簇索引。
    • 主键通常会自动成为聚簇索引。
       CREATE CLUSTERED INDEX idx_clustered_column ON table_name(column_name);
  6. 非聚簇索引(Non-Clustered Index):

    • 不改变表的物理存储顺序,可以有多个非聚簇索引。
       CREATE INDEX idx_nonclustered_column ON table_name(column_name);

索引的创建

MySQL
   -- 创建单列索引
CREATE INDEX idx_age ON employees(age);

-- 创建复合索引
CREATE INDEX idx_name_age ON employees(name, age);

-- 创建唯一索引
CREATE UNIQUE INDEX idx_unique_name ON employees(name);

-- 创建全文索引
CREATE FULLTEXT INDEX idx_fulltext_content ON articles(content);
PostgreSQL
   -- 创建单列索引
CREATE INDEX idx_age ON employees(age);

-- 创建复合索引
CREATE INDEX idx_name_age ON employees(name, age);

-- 创建唯一索引
CREATE UNIQUE INDEX idx_unique_name ON employees(name);

-- 创建全文索引
CREATE INDEX idx_fulltext_content ON articles USING gin(to_tsvector('english', content));

索引的使用和优化

  1. 选择合适的列:

    • 经常出现在 WHERE 子句,JOIN 条件,ORDER BY 和 GROUP BY 子句中的列适合创建索引。
    • 高选择性的列(即具有大量不同值的列)通常是良好的索引候选。
  2. 避免在低选择性列上创建索引:

    • 如性别,布尔值等列,因为这些列的索引利用率不高。
  3. 复合索引顺序:

    • 将选择性高的列放在索引的最前面。
    • 复合索引的使用遵循”最左前缀”规则,即索引可以加速以第一个列开头的查询。
  4. 避免过多索引:

    • 虽然索引可以加速查询,但过多的索引会导致插入,更新和删除操作变慢,因为每次数据修改都需要更新索引。
  5. 定期重建索引:

    • 对于大型表,索引的碎片化会影响性能,定期重建索引可以提高查询效率。

示例

使用索引的查询

假设有一个 employees 表,包含 id, name, age, department_id 列,并创建了以下索引:

   CREATE INDEX idx_age ON employees(age);
CREATE INDEX idx_name_age ON employees(name, age);

查询示例:

   -- 使用单列索引
SELECT * FROM employees WHERE age > 30;

-- 使用复合索引
SELECT * FROM employees WHERE name = 'John' AND age > 30;
索引优化

假设有一个查询:

   SELECT * FROM employees WHERE department_id = 3 AND age > 30;

可以创建复合索引以优化查询:

   CREATE INDEX idx_department_age ON employees(department_id, age);

使用 EXPLAIN 查看优化效果:

   EXPLAIN SELECT * FROM employees WHERE department_id = 3 AND age > 30;
重建索引

在 MySQL 中,可以使用 OPTIMIZE TABLE 命令重建索引:

   OPTIMIZE TABLE employees;

在 PostgreSQL 中,可以使用 REINDEX 命令:

   REINDEX TABLE employees;

总结

使用索引是优化 SQL 查询性能的重要手段。关键在于选择合适的列创建索引,避免过多和低选择性的索引,定期维护索引以保持查询性能。通过查看执行计划(如使用 EXPLAIN),可以了解索引的使用情况,并进行相应的优化。