MariaDB 上的 MySQL 查询非常慢

Posted

技术标签:

【中文标题】MariaDB 上的 MySQL 查询非常慢【英文标题】:MySQL very slow query on mariaDB 【发布时间】:2019-09-29 07:47:52 【问题描述】:

以下是我将网站移动到的新服务器上的查询。下面的现有查询在运行 InnoDB 的原始服务器上非常快。 MariaDB 5.6 的新服务器非常慢。

新服务器上唯一需要删除的行是“AND np.user_id!=su.id”,它又变快了。

子查询对速度没有任何影响。

我对不同的数据库版本了解不多,无法知道为什么会出现这种情况。

任何人都可以阐明这个问题吗?提前致谢。

SELECT
    np.id, np.user_id, np.post_id, np.response_id, np.viewed, np.clicked, np.emailed, np.timestamp,
    su.id AS suUserId, 
    su.fullname AS suFullName, su.username AS suUserName, su.mem_id AS suMemId 
FROM notify_post np 
    LEFT JOIN userfeed pf ON np.response_id IS NULL AND pf.id=np.post_id
    LEFT JOIN userresponses pr ON np.response_id IS NOT NULL AND pr.userfeed_id=np.post_id

    JOIN users su ON 
        (np.response_id IS NULL AND su.id=pf.user_id) 
        OR 
        (np.response_id IS NOT NULL AND su.id=pr.user_id AND pr.id=np.response_id)

WHERE np.user_id=1 
    AND pf.user_id NOT IN (SELECT bk.block_id FROM block bk WHERE bk.user_id=1 AND bk.block_id=pf.user_id)
    AND np.user_id!=su.id
ORDER BY np.timestamp DESC
LIMIT 0,10

【问题讨论】:

与所有相关表的 SHOW CREATE TABLE 语句一样,关于查询性能的问题总是需要对给定查询的 EXPLAIN 【参考方案1】:

重新考虑架构设计。这种模式对性能非常不利:

WHERE (x IS NULL     AND ...)
   OR (x IS NOT NULL AND ...)

在一种情况下 (ON) 以这种形式清楚地显示出来,另外还有两个不太明显的地方。

【讨论】:

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

MariaDB 10.4.13 性能比 MySQL 5.7.30 慢

MariaDB - 地理编码查询非常慢

非常慢的 MySQL COUNT DISTINCT 查询,即使有索引——如何优化?

Plesk 与本地 PC 上的 MariaDB 慢查询

与 XAMPP 相比,MariaDB Docker 容器中的 INSERT SQL 查询非常慢

从 MySQL 5.6.35 迁移到 MariaDB 10.6.3 - 查询不起作用