mysql - 尝试优化会降低性能的查询

标签 mysql sql query-optimization

以下查询存在严重问题,会严重影响脚本的性能,通常需要 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/

相关文章:

python - 在共享服务器 : No module named MySQLdb? 上安装 Django

mysql - 在 SQL 中按年份排序

mysql - MySQL中大表按范围分组

mysql - MySQL 与内部选择连接速度较慢

SQL Server View 优化帮助(重复子查询、case when 等等...)

mysql - 当更新表有一个字段然后第一个时更新两个表

PHP 计算 MySQL 查询中 2 列的总和 WHERE id 匹配

c# - Entity Framework 代码优先 : How to specify the index name

sql - 仅当小数点前的数字为 0 时才对小数点四舍五入

mysql - SQL 查询优化——真的没有什么可以改进的了吗?