使用dbforge进行mysql优化(explain)
我正在使用dbForge检查我的查询,以确保它们是最优的或尽可能最优的。我有下面的内容,我几乎用在所有的东西上,只要我读对了,结果就会让我有点害怕 数据库设置的基本要点是帐户、计算机、用户(链接到用户的表)。任意数量的计算机链接到一个帐户,任意数量的用户链接到每台计算机,所有其他表链接到一个用户 我使用以下命令仅返回“活动”计算机的结果。通过提供:account\u id和:account\u许可证,我可以做到这一点。例如,1和3只返回来自帐户1的前3台计算机(按其id排序)的结果。希望这是有道理的使用dbforge进行mysql优化(explain),mysql,dbforge,Mysql,Dbforge,我正在使用dbForge检查我的查询,以确保它们是最优的或尽可能最优的。我有下面的内容,我几乎用在所有的东西上,只要我读对了,结果就会让我有点害怕 数据库设置的基本要点是帐户、计算机、用户(链接到用户的表)。任意数量的计算机链接到一个帐户,任意数量的用户链接到每台计算机,所有其他表链接到一个用户 我使用以下命令仅返回“活动”计算机的结果。通过提供:account\u id和:account\u许可证,我可以做到这一点。例如,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
table id选择类型类型可能的键键len ref行额外
1个小学全部5个
计算机2使用文件排序导出所有唯一过滤器唯一过滤器4 14
用户1主参考唯一过滤器唯一过滤器4 c.计算机id 1
让我害怕的是,computers表似乎正在扫描表中的每一行(14)。14是当时这个特定表中的总行数(我只是测试了这么多数据),但当它增长时,我当然不希望每次都扫描整个表
这是实际发生的还是我读错了
编辑:
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
对不起,我应该记下索引。。。。accounts.account\u id,computers.account\u id,computers.computer\u id,users.computer\u id,users.user\u id这听起来像是我在指出显而易见的问题,但你在问题文本中没有提到索引 如果帐户id上没有索引,则查询可能会扫描整个computers表。如果表中只有几行,并且14是我所说的“不多行”,则某些SQL进程仍可能扫描整个表
我认为最好的办法是检查索引并向表中添加大量记录(比如50-100条),然后测试其效率。此查询看起来非常不理想。很可能扫描了所有行。索引呢?添加在上面。。。这是我能想出的最好办法,以确保只返回“活动”计算机。。。active是按其id(计算机id)订购时的第一个x金额(由:account_licenses定义)。抱歉,上面添加了这些。我已经正确地设置了索引,所以这就是我想知道的,但是,我不知道优化器会扫描所有的行,如果没有很多行的话。我以为它扫描它们是因为order by。我不确定它是否适用于MySQL,但它肯定会发生在Sql Server中。我在computers表中添加了另外100个条目,出现了相同的查询计划。开始认为我需要通过向computers表中添加0/1的“status”列来更改数据库。