关键词:
【中文标题】如何使用其中的一些子查询优化此查询【英文标题】: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计数所有相 查看详情