Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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 - Fatal编程技术网

加快mysql查询速度

加快mysql查询速度,mysql,Mysql,我有两张桌子。一个是点击日志,记录我们收到点击的确切时间。第二个是美元/天表格,记录我们在特定站点每天赚取的金额 我需要计算每个站点的每日CPC。下面的查询正在运行,但几乎需要一分钟 下面是解释的结果: id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE click_log ALL

我有两张桌子。一个是点击日志,记录我们收到点击的确切时间。第二个是美元/天表格,记录我们在特定站点每天赚取的金额

我需要计算每个站点的每日CPC。下面的查询正在运行,但几乎需要一分钟

下面是解释的结果:

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"