我正在使用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
发布于 2014-06-05 18:26:31
这听起来像我指出的显而易见的,但你没有在你的问题文本中提到索引。
如果account_id上没有索引,查询可能会扫描整个计算机表。一些SQL进程可能仍然会扫描整个表,如果其中只有几行,而14行就是我所称的“不多行”。
我认为你能做的最好的事情就是检查索引,在表中添加很多记录(比如50-100),然后测试它的效率。
https://stackoverflow.com/questions/24067356
复制相似问题