发布于 2026-01-06 3 阅读
0

如何通过为大型表建立索引来提高数据库性能

如何通过为大型表建立索引来提高数据库性能

什么是数据库索引?

数据库索引是一种能够加快数据库数据搜索和检索速度的技术。它就像为一本大书创建了快速查找指南,有助于加快搜索速度,让查找内容更加便捷。

索引可以加快 SELECT 查询和 WHERE 子句的执行速度,但会降低 INSERT 和 UPDATE 查询的速度。

索引数据结构组件

图:数据库索引数据结构

为什么要建立索引?

假设你有一个书籍数据库,你想找到所有书名中包含“编程”一词的书籍。如果没有索引,数据库就必须扫描表中的每一行才能找到符合搜索条件的书籍。这可能会非常耗时,尤其是在表中书籍数量庞大的情况下。

但是,如果在标题列上创建索引,数据库就可以快速找到符合搜索条件的行。索引是一个独立的数据结构,它按排序顺序存储标题列的值。数据库可以使用索引快速找到标题中包含“programming”一词的行。

对包含 5000 万行的表进行索引

在这个例子中,我们将pg-million在 PostgreSQL 中创建一个数据库,其中包含一个表该表customers有以下列:first_name,,,last_namemobile_nocountry

插入 5000 万行随机数据

CREATE TABLE customers(first_name VARCHAR(50), last_name VARCHAR(50), mobile_no INTEGER, country VARCHAR(50))

INSERT INTO customers (first_name, last_name, mobile_no, country)
SELECT substr(md5(random()::text), 1, 10),
       substr(md5(random()::text), 1, 10),
       (random() * 70 + 10)::integer,
       (CASE WHEN random() < 0.5 THEN 'India' ELSE 'United Kingdom' END)
FROM generate_series(1, 50000000);
Enter fullscreen mode Exit fullscreen mode

country在列上创建索引

我们在列上创建索引,country以便得到一个组织良好的列表,使我们能够快速找到来自特定国家的所有客户,而无需搜索整个列表。

CREATE INDEX idx_partial_country ON customers (country) WHERE country IN ('India', 'United Kingdom')

Enter fullscreen mode Exit fullscreen mode

是时候创建索引了:2m 2s

在这个例子中,我们使用了部分索引。部分索引是基于筛选特定值的行而创建的。这使得数据库能够仅对相关的行进行索引和优化,从而减小索引大小并提高针对这些特定值的查询性能。

注意:不同数据库的索引创建语法和索引类型各不相同。您应该根据数据库和使用场景选择合适的语法和索引类型。

索引前后查询执行时间测量

考虑以下查询

SELECT * FROM customers WHERE country='United Kingdom';
Enter fullscreen mode Exit fullscreen mode

无索引查询执行时间:41836.270 ms

带索引的查询执行时间:24254.644 ms

Improvement in query execution time ~42.03%

(为了更好地理解,您可以在这里找到所有代码)

指数表现如何?

深入了解指数的有效性至关重要。以下是一些有用的指标:

  • 索引使用统计信息:监控索引使用情况,了解哪些索引对查询性能有显著贡献。(例如:跟踪索引大小,因为较大的索引可能会影响磁盘空间和 I/O 性能。)

  • 查询性能指标:监控涉及索引列的查询的执行时间和响应时间。(例如:查询执行时间突然增加可能表明索引相关问题。)

  • 索引维护指标:定期评估索引的健康状况及其对数据库操作的影响。(例如:跟踪索引膨胀情况,当索引由于过多的插入、更新或删除操作而变得效率低下时,就会发生索引膨胀。)

何时使用索引?

  • 频繁搜索查询:当您经常在大型数据集中搜索特定数据时,请使用索引。它可以帮助您快速找到所需信息。

  • 性能提升:索引可以提高数据检索操作的速度,特别是对于复杂查询,因为它可以避免扫描整个数据集。

  • 大数据量:当处理大量数据时,会使用索引,因为即使数据集不断增长,索引也有助于保持高效的查询性能。

何时不应使用索引?

  • 频繁写入操作:如果数据库频繁执行插入、更新或删除操作,请避免过度创建索引,因为索引会降低写入速度并占用额外的存储空间。不应在频繁操作的列上使用索引。

  • 小数据集:对于相对较小的数据集,索引可能无法显著提升性能,反而会引入不必要的开销。在这种情况下,收益可能不足以弥补成本。

结论

如果您正在寻找提升数据库性能的方法,那么数据库索引是一个不错的起点。通过在查询中频繁使用的列上创建索引,您可以显著提升数据库性能,加快查询速度。但是,在做出决定之前,权衡索引的利弊至关重要。


在GitHubTwitter上找到我

文章来源:https://dev.to/karishmashukla/how-to-improve-the-performance-of-your-database-by-indexing-large-tables-1j17