使用dbforge进行mysql优化(解释)

时间:2014-06-05 18:18:33

标签: mysql dbforge

我正在使用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

1 个答案:

答案 0 :(得分:1)

这可能听起来像我指出了明显但你没有提到问题文本中的索引。

如果您没有account_id索引,查询可能会扫描您的整个计算机表。如果你只有几行,有些SQL进程仍然可以扫描整个表,14就是我称之为'不多行'。

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