mysql优化(解释)与dbforge

kd3sttzy  于 2023-05-16  发布在  Mysql
关注(0)|答案(2)|浏览(98)

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

4uqofj5v

4uqofj5v1#

这听起来像是我在指出显而易见的问题,但你在问题文本中没有提到索引。
如果没有account_id索引,查询可能会扫描整个computers表。一些SQL进程可能仍然会扫描整个表,如果你只有几行,14是我所说的'不多行'。
我认为你能做的最好的事情就是检查索引并向表中添加大量记录(比如50-100条),然后测试它的效率。

wwwo4jvm

wwwo4jvm2#

此问题与dbForge Studio无关。MySQL服务器优化

相关问题