0

我正在使用 dbForge 审查我的查询,以确保它们是最佳的或最佳的。我有以下内容,几乎可以用于所有内容,只要我正确阅读它们,结果就会让我有点害怕。

数据库设置的基本要点是帐户、计算机、用户(链接到用户的表)。任意数量的计算机链接到一个帐户,任意数量的用户链接到每台计算机,所有其他表格链接到一个用户。

我使用以下内容仅从“活动”计算机返回结果。通过提供 :account_id 和 :account_licenses 我可以做到这一点。例如,1 和 3 只会返回账户 1 的前 3 台计算机(按其 ID 排序)的结果。希望这是有道理的。

SELECT *
FROM
( SELECT account_id, computer_id
    FROM computers
    WHERE account_id = :account_id
    ORDER BY computer_id ASC LIMIT 0, :account_licenses
) as c
INNER JOIN users
    on users.computer_id = c.computer_id

...further joins which act on user_id

dbforge 的结果让我感到害怕:

table        id     select type    type    possible keys    key    key len    ref    rows    extra
<derived2>  1   PRIMARY ALL                 5   
computers   2   DERIVED ALL unique_filter   unique_filter   4       14  Using filesort
users   1   PRIMARY ref unique_filter   unique_filter   4   c.computer_id   1

让我害怕的是计算机表似乎正在扫描其表中的每一行 (14)。14 是当时这个特定表中的总行数(我只是在测试这么少的数据),但是当它增长时,我当然不想每次都扫描整个表。

这是实际发生的事情还是我读错了?

编辑:

对不起,应该注意到索引....accounts.account_id,computers.account_id,computers.computer_id,users.computer_id,users.user_id

4

1 回答 1

1

这听起来像是我在指出显而易见的问题,但您没有在问题文本中提到索引。

如果您在 account_id 上没有索引,该查询可能会扫描您的整个计算机表。如果您只有几行,某些 SQL 进程可能仍会扫描整个表,而 14 就是我所说的“行数不多”。

我认为你能做的最好的事情是检查索引并将大量记录(比如 50-100)添加到表中,然后测试它的效率。

于 2014-06-05T18:26:31.143 回答