优化 MySQL 查询

Posted

技术标签:

【中文标题】优化 MySQL 查询【英文标题】:Optimize MySQL query 【发布时间】:2011-08-02 18:57:58 【问题描述】:

我有两张表几乎相同的列,除了Table2 在末尾有三个额外的列Old_Column2, Old_Column3 and Column4。如果表 1 和表 2 中存在记录,则表 2 覆盖表 1 中的记录,否则显示表 1 中的记录。 UNION 之前的查询负责这一点。

现在我还想要 Table2 中存在但 Table1 中不存在的记录。这就是UNION 子句。但是使用UNIONVIEW 会变慢。

我现在不能使用LEFT JOIN。我正在考虑改用FULL JOIN,但这也可能很慢。这样做的最佳方法是什么?

改写Select all records from Table1, if the same record exists in Table2 overlay the record in the view. Add the new records where Old_Column2 and 3 equals to new

这是我正在使用的VIEW 语句。

CREATE VIEW AVIEW AS
SELECT
    IF(U.Column1 IS NULL, L.Column1, U.Column1) Column1,
    IF(U.Column1 IS NULL, L.Column2, U.Column2) Column2,
    IF(U.Column1 IS NULL, L.Column3, U.Column3) Column3,
    IF(U.Column1 IS NULL, NULL, U.Old_Column2) Old_Column2,
    IF(U.Column1 IS NULL, NULL, U.Old_Column3) Old_Column3,
    IF(U.Column1 IS NULL, NULL, U.Column4) Column4
FROM
    Table1 L
LEFT JOIN Table2 U
    ON L.Column1 = U.Column1 AND L.Column2 = U.Old_Column2 AND L.Column3 = U.Old_Column3
WHERE 
    U.Column1 IS NULL OR U.Column1 IS NOT NULL AND U.Column4 = 0
UNION
    SELECT * FROM Table2 WHERE Old_Column2 = 'new' AND Old_Column3 = 'new' and Column4 = 0

【问题讨论】:

我认为是表设计而不是查询需要优化。 无法真正优化表。 Table1 由每周运行的解析器生成,擦除所有内容并再次输入数据。我只能控制Table2 【参考方案1】:

很遗憾,您不能在 mysql 中创建 FULL OUTER JOIN。您必须通过使用 2 个单独的 LEFT OUTER JOIN 查询和 union 一起来模拟它。

您可以尝试提高性能的一件事是在您的 Old_* 列上为 Table2 建立索引,并查看该谓词是否运行得更快。

【讨论】:

这就是我现在正在做的事情。该视图有效,但我试图避免 UNION,因为它很慢。表已编入索引。 是的,这就是你所能做的。

以上是关于优化 MySQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

MySql性能优化查询优化

mysql多条件查询的优化

mysql查询优化器应该怎么使用

MySQL查询优化器工作原理解析

mysql优化之查询优化

mysql查询优化策略