加快mysql查询速度
我有两张桌子。一个是点击日志,记录我们收到点击的确切时间。第二个是美元/天表格,记录我们在特定站点每天赚取的金额 我需要计算每个站点的每日CPC。下面的查询正在运行,但几乎需要一分钟 下面是解释的结果:加快mysql查询速度,mysql,Mysql,我有两张桌子。一个是点击日志,记录我们收到点击的确切时间。第二个是美元/天表格,记录我们在特定站点每天赚取的金额 我需要计算每个站点的每日CPC。下面的查询正在运行,但几乎需要一分钟 下面是解释的结果: id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE click_log ALL
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE click_log ALL url_id,click_time NULL NULL NULL 1404209 Using where; Using temporary; Using filesort
1 SIMPLE daily_dollars ref url_id,date date 3 func 6 Using where
以及查询:
SELECT date( click_log.click_time ) AS DAY,
click_log.shorturl AS site,
daily_dollars.money AS earned,
count( click_log.click_id ) AS clicks,
daily_dollars.money / count( click_log.click_id ) AS CPC
FROM `yourls_log` AS click_log, yourls_url_money AS daily_dollars
WHERE click_log.click_time >= "2011-07-01"
AND click_log.url_id = daily_dollars.url_id
AND date( click_log.click_time ) = daily_dollars.date
GROUP BY DAY , click_log.shorturl
我能做些什么来加快速度
表结构:
yourls_log
----------
click_id
click_time
shorturl
url_id
yourls_url_money
----------------
id
url_id
date
money
如果您在DBMS下创建了一个视图,然后查询该视图,那么该过程将更快地完成。这主要是因为视图是已经收集的数据,而不是从偏移量查询数据
还可以查看您的服务器统计数据,它可能负载过大?我想这就是您想要的:
SELECT DISTINCT date( click_log.click_time ) AS DAY,
click_log.shorturl AS site,
daily_dollars.money AS earned,
count( click_log.click_id ) AS clicks,
daily_dollars.money / count( click_log.click_id ) AS CPC
FROM `yourls_log` AS click_log, yourls_url_money AS daily_dollars
WHERE click_log.click_time >= "2011-07-01"
AND click_log.url_id = daily_dollars.url_id
AND date( click_log.click_time ) = daily_dollars.date
ORDER BY DAY , click_log.shorturl
不确定原因,但这要快得多(1.5秒):
你能发布一下表结构吗?我在MySQL方面做得还不够好,无法就如何加快查询速度提供建议,但我能做的是向你推荐。是GROUP BY减慢了查询速度,因为它不能使用索引。如果没有具体的原因,请尝试按删除该组。顺便说一下,从您的查询中,
DAY
指的是click\u log
click\u time
,由于时间在条目之间可能会有很大的差异,我认为没有什么理由在DAY
进行分组,不?@Abhay在进行分组之前,我将日期时间转换为一个简单的日期。我确实需要它,因为我将汇总表(youls\u url\u money)与明细表(yourls\u log)连接起来@Eric,您可以尝试通过创建索引来优化组。如解释所示,查询没有使用“click_log”别名的索引。您可以尝试使用的一些索引有(单击时间
,url\u id
)和(单击时间
,短url
)。如果您可以修改WHERE谓词以将两个“click\u time”字段保持在一起,这也可能是有意义的。谢谢,尽管这只返回一行。。。我需要一个每天/站点组合的总数。谢谢,尽管服务器和mysql都进行了很好的优化。我相信文件分类就是问题所在
SELECT m.date, c.shorturl, m.money, c.clicks, m.money / c.clicks AS CPC
FROM yourls_url_money AS m
LEFT JOIN (
SELECT date( click_time ) AS
DAY , url_id, shorturl, count( click_id ) AS clicks
FROM yourls_log
WHERE click_time >= "2011-07-01"
GROUP BY DAY , url_id, shorturl
) AS c ON m.url_id = c.url_id
AND m.date = c.day
WHERE date >= "2011-07-01"