我的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
任何建议都将不胜感激
答案 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