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