2012-02-07 71 views
3

我想从2.5秒为mysql计数查询减少加载时间。查询中的所有列都有一个索引。MySQL计数优化

SELECT COUNT(1) 
FROM song AS s 
JOIN song_text AS st 
    ON(st.song_id = s.song_id) 
JOIN phpfox_user AS u 
    ON(u.user_id = s.user_id) 
WHERE st.lyrics LIKE '%a%' AND s.is_active = 1 AND s.public = 1 

获取返回行的查询在0.0009060秒内加载。

SELECT s.*, st.lyrics, u.first_name 
FROM song AS s 
JOIN song_text AS st 
    ON(st.song_id = s.song_id) 
JOIN phpfox_user AS u 
    ON(u.user_id = s.user_id) 
WHERE st.lyrics LIKE '%a%' AND s.is_active = 1 AND s.public = 1 
ORDER BY s.date_added DESC 
LIMIT 12 

为什么计数查询比返回行的查询有更多的加载时间?可以采取什么措施将计数查询的加载时间减少到类似于其他查询的时间?

+0

你试过在查询上运行'EXPLAIN'吗?这应该给你一些见解。我相信@AdityaNaidu可能是正确的 - 第二个查询中的“LIMIT”可能会过滤第一个查询中所需的大量工作。 – evan 2012-02-07 22:28:02

+0

从第二个查询中删除“LIMIT”子句并发布查询时间。使用'SELECT SQL_NO_CACHE <查询的其余部分>'从等式中删除缓存。 – 2012-02-07 22:40:47

+0

从第二个查询中删除限制导致查询时间为7.6967690秒。 – user1195817 2012-02-07 22:53:19

回答

0

你关心计数中的u.first_name值吗?如果否,则删除第二次加入,它似乎不添加任何值。

此外,尝试计数(s.song_id)从歌曲表而不是count(1)。我不确定这是真正的优化还是我的想象。

0

您的第二个查询一旦完成前12条记录就完成了。而您的第一个(计数)查询必须加入所有表中的所有列。

这是我能看到的唯一区别!

0

我认为这是因为

LIMIT 12 

你只能望尘莫及只有12 SELECT语句的线条。

0

第一个必须查看查询的执行计划。

我想在第一个查询中的临时表是相当大的,因此聚合应用于大量的数据。

另一方面,LIMIT 12已经告诉查询处理器,说明所有行只有12个是没有意义的,因此临时表很小。