如何通过查询修复缓慢的MySQL CURDATE组

时间:2014-03-14 04:07:22

标签: mysql database performance

我的MySQL查询速度很慢,使用了DATE和CURDATE。使用的表是:

记录l = 1,760,000条记录(已更新的索引和client_id) 客户c = 4167记录(主键client_id上的索引)


SELECT LEFT(c.client,12) client , COUNT( l.client_id) amount
FROM logs l, customers c 
WHERE c.client_id = l.client_id 
AND c.client_id NOT IN (5,7,217 ) 
AND DATE( l.updated ) = CURDATE()   
GROUP BY l.client_id  ORDER BY Amount DESC LIMIT 5 

当我运行此查询时,它需要8秒钟。现在我明白日志表有接近2MLN的记录,但我只是要求它得到今天的(CURDATE)计数,MySQL查询优化器是不是只获取最新的记录并将这些记录与客户相加?似乎要少花很多钱。

以上查询的EXPLAIN表示:


1 SIMPLE customer ALL   PRIMARY  Key(null) ref(null) rows 4167 Using where,using temp,filesort

1 SIMPLE logs  ref user_id,idx_client_id  user_id  rows 5  Using Where

任何建议都将不胜感激

1 个答案:

答案 0 :(得分:0)

它不会使用索引。请尝试更改为datediff。

SELECT LEFT(c.client,12) client , COUNT( l.client_id) amount 
FROM logs l, customers c 
WHERE c.client_id = l.client_id 
AND c.client_id NOT IN (5,7,217)
AND DATEDIFF(l.updated, curdate()) = 0 
GROUP BY l.client_id  ORDER BY Amount DESC LIMIT 5