我正在用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
2条答案
按热度按时间4uqofj5v1#
这听起来像是我在指出显而易见的问题,但你在问题文本中没有提到索引。
如果没有account_id索引,查询可能会扫描整个computers表。一些SQL进程可能仍然会扫描整个表,如果你只有几行,14是我所说的'不多行'。
我认为你能做的最好的事情就是检查索引并向表中添加大量记录(比如50-100条),然后测试它的效率。
wwwo4jvm2#
此问题与dbForge Studio无关。MySQL服务器优化