以下查询存在严重问题,会严重影响脚本的性能,通常需要 10-30 秒才能完成。想知道是否有人有任何优化建议,具体的或一般的都可以——我不是查询史密斯。
修改类型和索引以及查询本身当然是可行的。
SELECT DISTINCT t1.column_1, t1.column_2
FROM TABLE_1 AS t1
LEFT JOIN TABLE_1 AS t2
ON t1.column_1 = t2.column_1
AND t1.column_3 = t2.column_3
AND t2.int_value = 1
AND t2.column_4 = 'test_string_1'
WHERE t1.column_5 = 'text_string_2';
TABLE_1 的大小 ~ 600 万行
TABLE_1 的结构:
+--------------+--------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+-------------------+-----------------------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| column_1 | bigint(12) | YES | MUL | NULL | |
| column_4 | varchar(100) | YES | MUL | NULL | |
| column_5 | varchar(140) | YES | | NULL | |
| column_2 | varchar(15) | YES | MUL | NULL | |
| int_value | int(1) | YES | MUL | NULL | |
| last_updated | timestamp | NO | MUL | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+--------------+--------------+------+-----+-------------------+-----------------------------+
最佳答案
对于此查询,您需要正确的索引:
SELECT DISTINCT t1.column_1, t1.column_2
FROM TABLE_1 AS t1 LEFT JOIN
TABLE_1 AS t2
ON t1.column_1 = t2.column_1 AND
t1.column_3 = t2.column_3 AND
t2.int_value = 1 AND
t2.column_4 = 'test_string_1'
WHERE t1.column_5 = 'text_string_2';
如所写,这将是:TABLE_1(column_5, column_1, column3, column_2)
和 TABLE_2(column_1, column_3, int_value, column_4)
。
但是,我认为查询可以大大简化。无论条件是否匹配,LEFT JOIN
都会保留第一个表中的所有行。 WHERE
条件仅适用于第一个表,并且列仅来自第一个表,因此查询应等效于:
SELECT DISTINCT t1.column_1, t1.column_2
FROM TABLE_1 AS t1
WHERE t1.column_5 = 'text_string_2';
DISTINCT
可能不是必需的。但此简化版本的最佳索引是 TABLE_1(column_5, column_1, column_2)
。
注意:如果您在问题中写下查询时出错,请提出另一个问题,而不是使此答案无效。
关于mysql - 尝试优化会降低性能的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34742373/