如何使用其中的一些子查询优化此查询

     2023-04-15     20

关键词:

【中文标题】如何使用其中的一些子查询优化此查询【英文标题】:How to optimize this query with some subqueries in it 【发布时间】:2013-03-18 10:05:46 【问题描述】:

我的查询是这样的:

SELECT date_format( created_at, '%Y-%m-%d' ) AS the_date, 
COUNT(s.id) AS total, 
(SELECT COUNT(ks.id) FROM kc_shares ks WHERE site = 'facebook' AND date_format( created_at, '%Y-%m-%d' ) = the_date ) AS total_facebook, 
(SELECT COUNT(ks.id) FROM kc_shares ks WHERE site = 'twitter' AND date_format( created_at, '%Y-%m-%d' ) = the_date ) AS total_twitter 
FROM `kc_shares` s
GROUP BY `the_date`

我想要得到的是每日分享的数量,其中包含总计、facebook 的总份额(因此 site = 'facebook')和 twitter 的总份额。这就是为什么我需要GROUP BY

当它有几千行时,没有问题。但是该表目前有将近 200,000 行,并且查询非常慢,大约需要 20-30 秒,我猜还要更多。

我尝试向 site 和 created_at 字段添加索引,但无济于事。

谢谢

【问题讨论】:

【参考方案1】:

我认为子查询正在消耗性能。所以也许你可以这样做:

SELECT 
    date_format( created_at, '%Y-%m-%d' ) AS the_date, 
    COUNT(s.id) AS total, 
    SUM(CASE WHEN s.site='facebook' THEN 1 ELSE 0 END) AS total_facebook, 
    SUM(CASE WHEN s.site='twitter' THEN 1 ELSE 0 END) AS total_twitter
FROM 
    `kc_shares` s
GROUP BY 
    `the_date

`

【讨论】:

【参考方案2】:

移动子选择以便加入它们,而不是对每个返回的行进行子选择。

类似这样的东西(未经测试):-

SELECT date_format( created_at, '%Y-%m-%d' ) AS the_date, 
COUNT(s.id) AS total, 
Sub1.total_facebook, Sub2.total_twitter
FROM `kc_shares` s
LEFT OUTER JOIN (SELECT date_format( created_at, '%Y-%m-%d' ) AS sub_date, COUNT(ks.id) AS total_facebook FROM kc_shares ks WHERE site = 'facebook' GROUP BY sub_date ) Sub1 ON date_format( created_at, '%Y-%m-%d' ) = Sub1.sub_date
LEFT OUTER JOIN (SELECT date_format( created_at, '%Y-%m-%d' ) AS sub_date, COUNT(ks.id) AS total_twitter  FROM kc_shares ks WHERE site = 'twitter' GROUP BY sub_date ) Sub2 ON date_format( created_at, '%Y-%m-%d' ) = Sub2.sub_date
GROUP BY `the_date`

虽然找到一种方法来对非派生列(即日期/时间的日期部分)进行连接也会有所帮助。在这里可能是一个很好的例子来进行一点或非规范化,在当前存储的日期/时间之外添加一个仅用于日期的字段。

【讨论】:

我已经尝试将它移动到连接中,它好多了,查询现在需要 6-8 秒,但@Arion 给出了完美的解决方案。不过谢谢!【参考方案3】:

另一种方法是更改​​查询的工作方式。以下将提供每一天/网站的行,而不是将两个网站放在同一行。

SELECT 
   date_format( created_at, '%Y-%m-%d' ) AS the_date,site, 
   count(id) 
FROM 
   kc_shares s 
where 
   (site="facebook" or site="twitter") ) 
group by  
   created_at, site

我假设 created_at 是一个日期字段。

这应该提供相同的数据(我想,我没有尝试过),但格式不同。

尝试在 (created_at,site) 上建立索引。

【讨论】:

我使用子查询的原因是因为在选择中会有另一个聚合。所以它就像 count(id) as total,count(something_id) as total_something 等等。因此,结果将被很好地格式化,这样我就可以每天循环获取共享的总数,无论它们是 facebook、twitter等加上其他聚合值。

如何优化此 SQL Server 查询 - 多个子查询

】如何优化此SQLServer查询-多个子查询【英文标题】:HowtooptimizethisSQLServerquery-Multiplesubqueries【发布时间】:2020-07-2422:41:07【问题描述】:我在SQLServer中有这个带有4个子查询的查询,我正在寻找优化它的方法:DECLARE@INICIODATEDECLARE@... 查看详情

有关优化此多层(具有多层子查询)SQL 查询的提示

...含6层子查询的查询,目前的结构是这样的。我期待建议如何:减少层数而不重复相同的语句(例如,我可以将\'casewhenE& 查看详情

4.1查询性能优化

...的一些子任务,要么减少子任务的执行次数。下面来看看如何进行性能优化:4.2优化数据访问4.3重构查询方式 查看详情

如何使用 WHERE IN 子查询优化 SQL 查询

】如何使用WHEREIN子查询优化SQL查询【英文标题】:HowtooptimizeSQLquerywithWHEREINsubquery【发布时间】:2020-06-1212:09:30【问题描述】:我在MySQL5.6中有两个表用于收集事件数据。当事件发生时,它会在特定时间段内生成数据。名为“事... 查看详情

如何使用嵌套的 SELECT 子查询优化 UPDATE?

】如何使用嵌套的SELECT子查询优化UPDATE?【英文标题】:HowtooptimizeUPDATEwithanestedSELECTsubquery?【发布时间】:2019-06-1001:24:29【问题描述】:我编写了一个复杂的UPDATE查询,它可以工作,但看起来很危险。这是我正在尝试做的事情:... 查看详情

SQL Server - 如何优化此查询?

】SQLServer-如何优化此查询?【英文标题】:SQLServer-howcanthisquerybeoptimized?【发布时间】:2013-07-2218:36:01【问题描述】:此查询平均需要4秒。它将成为存储过程中的子查询,我需要它花费一秒。这是查询:(selectcustomercampaignname+\'$\'... 查看详情

如何在 Firebird 2.1 中优化此查询?

】如何在Firebird2.1中优化此查询?【英文标题】:HowcanIoptimizethisqueryinFirebird2.1?【发布时间】:2012-03-0103:47:12【问题描述】:我正在使用Firebird2.1,我需要一些帮助来优化此查询:(可能通过将IN-s替换为JOINS或其他方式来加快速度... 查看详情

优化昂贵的 php 查询/子查询

...面显示所有提交,其中column_id=16和data=(\'\'or0)。为此,我使用子查询来获取我需要的所有不同的subm 查看详情

带有连接和子查询的 mysql 查询优化

...的这个查询需要11秒才能运行并且它会占用服务器资源。如何重新编写此查询以实现更大的优化?P.S:表格已编入索引。查询:SELECTSUM(the_val)ASvalueFROM(SELECTDISTINCTbas 查看详情

如何使用具有多个 GROUP BY、子查询和 WHERE IN 在大表上的查询来优化查询?

】如何使用具有多个GROUPBY、子查询和WHEREIN在大表上的查询来优化查询?【英文标题】:HowtooptmizequerywithaquerywithmultipleGROUPBY\'s,subqueriesandWHEREINoveralargetable?【发布时间】:2015-01-2912:29:48【问题描述】:我正在开展一个抓取项目,... 查看详情

如何使用 5 个子查询优化此查询?

】如何使用5个子查询优化此查询?【英文标题】:HowcanIoptimizethisquerywith5subqueries?【发布时间】:2014-11-2019:09:40【问题描述】:SELECT(SELECTCOALESCE(SUM(t.hours),0)ASallotted_hoursFROMtasksAStWHEREt.projects_id=8ANDt.complete!=100ANDt.nameLIKE\'%Ongoin 查看详情

如何使用子查询优化“WHERE NOT IN”

】如何使用子查询优化“WHERENOTIN”【英文标题】:Howtooptimize"WHERENOTIN"withsubquery【发布时间】:2014-01-1410:19:09【问题描述】:我有这个问题,这个线程中的讨论输出是什么:MysqlJOINsubquery查看当前小提琴:http://sqlfiddle.com/#... 查看详情

mysql中,如何向测试人员介绍连接查询和子查询的优劣势?

连接查询和子查询,都是要作用多个表。子查询的优势是缺什么数据去查询什么数据,所以查询时非常自由灵活,缺点是只能看到主表(括号外面的表)字段。连接查询的优势是可以看到多个表的所有字段,但缺点是不管查什么... 查看详情

mysql的子查询中有统计语句我该如何优化

子查询优化策略对于不同类型的子查询,优化器会选择不同的策略。1.对于IN、=ANY子查询,优化器有如下策略选择:semijoinMaterializationexists2.对于NOTIN、<>ALL子查询,优化器有如下策略选择:Materializationexists3.对于derived派生表... 查看详情

如何优化 MySQL 中的 IN 子查询?

】如何优化MySQL中的IN子查询?【英文标题】:HowtooptimizeINsubqueryinMySQL?【发布时间】:2010-11-0715:43:10【问题描述】:我的查询似乎与来自http://dev.mysql.md/doc/refman/5.1/en/in-subquery-optimization.html的示例非常相似,但不幸的是,本手册的... 查看详情

如何使用 JOINS 和嵌套 SELECT 优化此 SQL 查询?

】如何使用JOINS和嵌套SELECT优化此SQL查询?【英文标题】:HowcanIoptimizethisSQLquerywithJOINSandnestedSELECT?【发布时间】:2016-10-0415:24:46【问题描述】:我的SQL查询需要大量时间来执行,因为事务表在某种程度上非常巨大。我正在寻找提... 查看详情

Mysql子查询优化?

...:2014-05-2503:15:53【问题描述】:我可以以任何不同的方式使用此代码来获得更好的性能吗?我试过这种方式;SELECTK.id,M.m_id,K.Sil,K.Banli,K.Foto,K.KullaniciAdi,K.Ad,K.Soyad,K.Gender,(selectrate_id,Rate,Zamanfromrati 查看详情

为子查询优化 Postgresql 查询

...题描述】:我对postgres很陌生,这可能是一个新手问题。如何改进此查询?三个表,campaigns1-->Mthreads1-->Mmessages。我有活动ID,并且我希望所有线程及其全部个体opens、clicks和replies计数所有相 查看详情