MySQL 查询在临时实例上速度慢,但在本地上速度快 - 性能问题

问题描述 投票:0回答:1

描述:

我面临一个 MySQL 查询的性能问题,该查询在本地计算机上高效运行(0.02 秒),但在临时环境中执行需要更长的时间。暂存的执行时间随机变化;有时需要 4 秒左右,有时会超过 10 秒。

示例查询:

SELECT 
    table1.qid,
    table1.original_text,
    table1.resolved_text,
    table1.resolved_values
FROM table_1
INNER JOIN table_2
    ON table_1.id = table_2.variation_id
WHERE table_2.users_id = 6
    AND table_1.qid = 201;
CREATE TABLE table_1 (
    id int NOT NULL AUTO_INCREMENT, 
    qid int NOT NULL, 
    original_text text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 
    resolved_text text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 
    resolved_values json DEFAULT NULL, 
    PRIMARY KEY (id), 
    KEY qid_index (qid), 
    KEY original_text_index (original_text(256)),
    KEY resolved_text_index (resolved_text(256))
) ENGINE=InnoDB AUTO_INCREMENT=4644665
  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE table_2 (
    id int NOT NULL AUTO_INCREMENT, 
    users_id int NOT NULL, 
    variation_id int NOT NULL, 
    PRIMARY KEY (id), 
    KEY uid_index (users_id), 
    KEY var_index (variation_id)
) ENGINE=InnoDB AUTO_INCREMENT=437879832
  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

背景:

  • 我需要使用 Python 和 SQLAlchemy 在循环中针对不同的 users_id 值运行此查询。
  • 执行时间不一致;在临时运行查询多次时,它会随机变化。
  • 我使用了 EXPLAIN 语句来分析查询,它似乎使用了适当的索引:

解释输出:

1   SIMPLE  table_1     NULL  ref  PRIMARY,qid_index  qid_index  4  const           1    100.00  NULL
1   SIMPLE  table_2     NULL  ref  uid_index,var_index  var_index  4  table_1.id  133  0.04  Using where

观察结果:

  • 查询在本地环境上执行良好,但在登台服务器上变得很慢。
  • 分析表明执行阶段消耗了大部分时间。
  • 此查询的一个细微变化(不带 qid 过滤器)可以在临时环境中快速运行:
SELECT 
    table1.qid,
    table1.original_text,
    table1.resolved_text,
    table1.resolved_values
FROM table_1
INNER JOIN table_2
    ON table_1.id = table_2.variation_id
WHERE table_2.users_id = 6;

附加信息:

  • table_1 和 table_2 在 JOIN 和 WHERE 子句中使用的列上都有索引。
  • 预期扫描的行数,如 EXPLAIN 所示,似乎是合理的。
  • 我已验证登台实例有足够的资源,并且没有明显的资源争用。

问题:

  • 什么可能导致查询在临时环境中执行不一致?
  • 为什么同一个查询的执行时间会相差如此之大?
  • 为什么添加额外的 qid 过滤器会导致性能如此巨大的差异?
  • 是否有任何特定的服务器配置、MySQL 设置或环境因素可能会影响此行为?

注意:当我直接通过phpmyadmin或任何mysql客户端运行查询时,运行速度很快。

我正在寻找有关如何进一步诊断和解决此问题的见解或建议。任何帮助或指示将不胜感激!

添加了上面的所有详细信息

python mysql performance sqlalchemy
1个回答
0
投票

这些可能有助于提高性能:

table_1:  INDEX(qid, id)
table_2:  INDEX(users_id, variation_id)

如果

table_2
是多对多,去掉 `id 并得到:

PRIMARY KEY(users_id, variation_id)
INDEX(variation_id, users_id)

索引前缀 (

(users_id, variation_id)
) 很少有用。

如果两台机器的行数不同,这可能会导致解释为什么存在差异。

ANALYZE TABLE
可能会有帮助,但这不太可能。

© www.soinside.com 2019 - 2024. All rights reserved.