我正在使用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
答案 0 :(得分:1)
这可能听起来像我指出了明显但你没有提到问题文本中的索引。
如果您没有account_id索引,查询可能会扫描您的整个计算机表。如果你只有几行,有些SQL进程仍然可以扫描整个表,14就是我称之为'不多行'。
我认为你能做的最好的事情就是检查索引并在表格中添加大量记录(例如50-100),然后测试它的效率。