mysql - 优化缓慢的 MySQL 查询

标签 mysql

下面的 MySQL 查询为什么这么慢?

我已尝试向 DocumentRevision.document 和 Document.status 添加索引,但执行查询通常需要很长时间(似乎如果按顺序进行此查询,查询速度会加快)。是否有另一种更有效的方法来实现相同的结果?该查询获取数据库中所有可用文档的所有最新修订版。有两张 table 。文档和文档修订。文档表仅包含 id 和状态字段,而 DocumentRevision 包含所有数据以及“文档”id 字段,以便它知道它是哪个文档的修订版。

SELECT rev.document as documentId, rev.id as revId, rev.name as name, 
       rev.dateCreated as dateCreated, rev.documentOrder as documentOrder
FROM (
    SELECT Document.id as docId, MAX(DocumentRevision.id) as maxRevId 
    FROM Document, DocumentRevision
    WHERE Document.id = DocumentRevision.document AND Document.status = 0 
    GROUP BY Document.id
) AS x 
INNER JOIN DocumentRevision as rev on rev.document = x.docId 
       AND rev.id = x.maxRevId 
ORDER BY dateCreated DESC;

最佳答案

你有两个选择:

SELECT  dr.*
FROM    (
        SELECT  document, MAX(id) AS maxid
        FROM    documentRevision
        GROUP BY
                document
        ) drd
JOIN    documentRevision dr
ON      dr.id = drd.maxid
JOIN    document d
ON      (d.id, d.status) = (drd.document, 0)

SELECT  dr.*
FROM    document d
JOIN    documentRevision dr
ON      dr.id =
        (
        SELECT  id
        FROM    documentRevision dri
        WHERE   dri.document = d.id
        ORDER BY
                document DESC, id DESC
        LIMIT 1
        )

第一个很可能是最有效的,除非您对每个文档有很多修订。

documentRevision (document, id) 上创建复合索引(按此顺序)以便查询快速运行。

关于mysql - 优化缓慢的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14354060/

相关文章:

mysql - 使用 Ruby on Rails(一些架构问题)

mysql - SQL 嵌套内连接

mysql - 计算列数,其中

php - 在 MySQL 中打破一个特殊字符

PHP 表单大小截断

mysql - 使用带有附加列的表中的 SELECT * 插入 INTO

mysql - 如果表单中只有一个值,如何插入多个值

php - 使用php、mysql排序

mysql - 如何解决 "#2006 - MySQL server has gone away"和 "ERROR 2013 (HY000): Lost connection to MySQL server during query"

python - 如何在 Django 查询中使用正则表达式