Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dbforge进行mysql优化(explain)_Mysql_Dbforge - Fatal编程技术网

使用dbforge进行mysql优化(explain)

使用dbforge进行mysql优化(explain),mysql,dbforge,Mysql,Dbforge,我正在使用dbForge检查我的查询,以确保它们是最优的或尽可能最优的。我有下面的内容,我几乎用在所有的东西上,只要我读对了,结果就会让我有点害怕 数据库设置的基本要点是帐户、计算机、用户(链接到用户的表)。任意数量的计算机链接到一个帐户,任意数量的用户链接到每台计算机,所有其他表链接到一个用户 我使用以下命令仅返回“活动”计算机的结果。通过提供:account\u id和:account\u许可证,我可以做到这一点。例如,1和3只返回来自帐户1的前3台计算机(按其id排序)的结果。希望这是有道

我正在使用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”列来更改数据库。