描述:
我面临一个 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;
背景:
解释输出:
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
观察结果:
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;
附加信息:
问题:
注意:当我直接通过phpmyadmin或任何mysql客户端运行查询时,运行速度很快。
我正在寻找有关如何进一步诊断和解决此问题的见解或建议。任何帮助或指示将不胜感激!
添加了上面的所有详细信息
这些可能有助于提高性能:
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
可能会有帮助,但这不太可能。