Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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
如何优化mysql?_Mysql_Sql - Fatal编程技术网

如何优化mysql?

如何优化mysql?,mysql,sql,Mysql,Sql,Tbl_响应 身份证 回应 msgid 用户名 有5000条记录。“zac1987”发布了800条回复。“zac1987”发布的800条回复中有30条差异msgid 目前,Explain SQL显示影响了800行。如何优化查询以便只影响30行?我认为必须有一个解决方案来避免循环/过滤800条记录。。。就像在我的博客上用JOIN子句替换WHERE子句一样。。。我正在寻找一些专家出来的解决方案,以避免循环的800记录 我的另一个问题——为什么这个页面会说“当您已经或可以使用分组方式时,不要使用D

Tbl_响应

  • 身份证
  • 回应
  • msgid
  • 用户名
有5000条记录。“zac1987”发布了800条回复。“zac1987”发布的800条回复中有30条差异
msgid

目前,Explain SQL显示影响了800行。如何优化查询以便只影响30行?我认为必须有一个解决方案来避免循环/过滤800条记录。。。就像在我的博客上用JOIN子句替换WHERE子句一样。。。我正在寻找一些专家出来的解决方案,以避免循环的800记录


我的另一个问题——为什么这个页面会说“当您已经或可以使用分组方式时,不要使用DISTINCT”,因为这会减慢查询速度?但是我已经测试过了,结果没有变慢,为什么?

正如您所说,尝试重写查询以使用
GROUP BY
子句:

SELECT msgid 
  FROM Tbl_responses 
 WHERE username = 'zac1987' GROUP BY msgid;

并查看性能上的差异

放置一些条件,如username='zac1987'和id='XYZ'
因为不可能仅根据您的要求使用distinct和group by筛选行。

检查覆盖索引在您的情况下是否表现更好。
这两个查询是等效的:

SELECT DISTINCT msgid 
FROM Tbl_responses 
WHERE username = 'zac1987' ;

我建议您在
(用户名,msgid)
上创建一个复合索引。这将有助于查询的任何版本

但最好是制作一个包含10K(甚至100k,或1M)行的测试表,并尝试速度和执行计划,首先在
(username)
上使用简单索引,然后在
(username,msgid)
上使用复合索引

差异将显示在执行计划的
额外
列中,其中对于第一种情况,简单索引将显示“使用where,使用temporary”,而对于第二种情况,复合索引将显示“使用where,使用index”

正如都铎所指出的,担心5000条记录的速度是过早的优化。当您有500K记录或看到性能下降时,您应该开始担心了


注意:这两个查询不等价,因此您不能总是通过将字段移动到GROUP by来删除DINSTINT子句,并期望得到相同的结果:

SELECT DISTINCT msgid, response
FROM Tbl_responses 
WHERE username = 'zac1987' ;


我不明白,你是说distinct和groupby同时使用?我也不明白页面上的句子,我猜它是指同时使用distinct和groupby…为什么你不一次使用一个,看看哪个更快?在你的例子中,groupby和distinct的使用是相同的,所以优化器的计划保持不变。该链接适用于SQL server,但建议阅读it@James安德森,也许我可以把它当作一种学习/知识?关于你的信息,我只在plurk.com上玩了一年,但我已经回复了38294次。仅仅一年就已经>38000条记录。已经尝试过,按受影响的800行分组,不受影响的也有800行。同时使用GB和Dist也影响了800行。您在这里真的有性能问题吗?这个查询在多长时间内执行?(不要试图优化运行良好的内容)它不应该减慢速度-如果你在
username
上有一个索引和一个像样的MySQL缓存-在同一个用户有数十万条记录之前,这个查询应该不会出问题。我建议你制作一个包含10K(甚至100k)行的测试表,并尝试速度和执行计划,首先使用
username
上的索引,然后使用
(username,msgid)
上的复合索引,您试图实现的是所谓的过早优化-基本上,您在非关键问题上浪费资源(您的时间和公司的钱):)id是response\u id,为什么我需要在WHERE子句中指定response\u id?我举个例子,假设有10篇帖子,我已经回复了其中7篇。当其他用户向帖子发送响应时,系统必须检查并告诉我是否有7篇帖子收到了新的响应。系统不会检查其他3个帖子,它只会检查我回复的7个帖子。这就是为什么我需要选择不同的msgid WHERE username=“zac1987”,这就是为什么我不能将id=“XYZ”放在WHERE子句中。实际上,我通过查看受影响的行而不查看速度来测试它,因为受影响的行越多,意味着需要过滤行的次数越多,意味着速度会越慢。现在我已经看到输出800行受到影响。执行计划中存在差异(请参见“额外”列)。如果您使用100K+行进行测试,您也会看到速度上的差异。
SELECT msgid 
FROM Tbl_responses 
WHERE username = 'zac1987'
GROUP BY msgid ;
SELECT DISTINCT msgid, response
FROM Tbl_responses 
WHERE username = 'zac1987' ;
SELECT msgid, response
FROM Tbl_responses 
WHERE username = 'zac1987'
GROUP BY msgid ;