Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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 使用UNION ALL和ORDER BY优化查询_Mysql_Query Optimization_Database Performance - Fatal编程技术网

Mysql 使用UNION ALL和ORDER BY优化查询

Mysql 使用UNION ALL和ORDER BY优化查询,mysql,query-optimization,database-performance,Mysql,Query Optimization,Database Performance,我有3个表(例如a、b、c),它们表示不同项目的活动(例如评论、喜欢等)以及每个活动的时间。我试图做一个基本的新闻提要,首先显示最新的活动。我为所有三个表构建了一个UNION ALL,将所有活动分组在一起,然后创建一个group BY,以确保相同项目的活动不会显示两次并按时间顺序显示。此函数使用无限滚动,因此查询也必须能够适当地移动 我想知道是否有任何方法可以优化这一点(每个表大约有500-900K,并且还在增长)。截断的代码如下所示 SELECT time,item_id FROM (

我有3个表(例如a、b、c),它们表示不同项目的活动(例如评论、喜欢等)以及每个活动的时间。我试图做一个基本的新闻提要,首先显示最新的活动。我为所有三个表构建了一个UNION ALL,将所有活动分组在一起,然后创建一个group BY,以确保相同项目的活动不会显示两次并按时间顺序显示。此函数使用无限滚动,因此查询也必须能够适当地移动

我想知道是否有任何方法可以优化这一点(每个表大约有500-900K,并且还在增长)。截断的代码如下所示

SELECT time,item_id FROM (
   SELECT a.time AS time, a.item_id FROM a 
      UNION ALL 
   SELECT b.time AS time, b.item_id FROM b 
      UNION ALL 
   SELECT c.time AS time, c.item_id FROM c
) temp 
GROUP BY item_id 
ORDER BY time DESC 
LIMIT 10

您编写的查询将创建一个非常大的临时表。然后按临时表中的列进行排序。您应该尝试限制每个表,可能如下所示:

SELECT time,item_id FROM (
   SELECT a.time AS time, a.item_id FROM a LIMIT 10 ORDER BY time DESC 
      UNION ALL 
   SELECT b.time AS time, b.item_id FROM b LIMIT 10 ORDER BY time DESC 
      UNION ALL 
   SELECT c.time AS time, c.item_id FROM c LIMIT 10 ORDER BY time DESC 
) temp 
GROUP BY item_id 
ORDER BY time DESC 
LIMIT 10
您需要确保
time
在每个表上都有一个索引

但我并不喜欢这样做,因为要准确地“滚动”浏览结果可能很困难

当进入“下一页”时,您可能需要考虑添加<代码> > 子句,如<代码>,其中A/B/C.ITEMIDID> NUM <代码>,而不是<代码>限制偏移,长度。这将有助于提高准确性

编写查询时,您应该在查询前面加上
EXPLAIN
,以查看查询是如何处理的。这将使您更好地了解正在发生的事情:是否正在创建临时表?它有多大?正在使用哪些索引?等等


另一种方法是使用填充单个“提要”表。

据我所知,此查询是不确定的:
选择时间,项id来自。。。GROUP BY item_id
此处选择的列(
time
)不是聚合函数,也不是在
GROUP BY
子句中指定的。在这种情况下,“服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。”