我想知道索引是否可以加快查询速度.我上次检查需要9秒.流量表大约有30万行,列表和用户有5k行.如果这只是一个糟糕的查询,我也很容易受到嘲笑/屈辱.我很久以前写的.
它应该获得具有最多页面浏览量(流量)的列表.让我知道是否缺少解释.
SELECT traffic_listingid AS listing_id,
COUNT(traffic_listingid) AS genuine_hits,
COUNT(DISTINCT traffic_ipaddress) AS distinct_ips,
users.username,
listings.listing_address,
listings.datetime_created,
DATEDIFF(NOW(), listings.datetime_created) AS listing_age_days
FROM traffic
LEFT JOIN listings
ON traffic.traffic_listingid = listings.listing_id
LEFT JOIN users
ON users.id = listings.seller_id
WHERE traffic_genuine = 1
AND listing_id IS NOT NULL
AND username IS NOT NULL
AND DATEDIFF(NOW(), traffic_timestamp) < 24
GROUP BY traffic_listingid
ORDER BY distinct_ips DESC
LIMIT 10
附言
ENGINE=MyISAM /
MySQL Server 4.3
解决方法:
旁注:
1.你有
LEFT JOIN listings
ON traffic.traffic_listingid = listings.listing_id
...
WHERE ...
AND listing_id IS NOT NULL
此条件将取消LEFT JOIN.将查询更改为:
INNER JOIN listings
ON traffic.traffic_listingid = listings.listing_id
并从WHERE条件中删除listing_id IS NOT NULL.
同样的情况适用于LEFT JOIN用户和用户名IS NOT NULL.
2,检查traffic_timestamp:
DATEDIFF(NOW(), traffic_timestamp) < 24
使得索引难以使用.将其更改为可以使用索引的内容
(并检查我的版本是否等效,可能有误):
traffic_timestamp >= CURRENT_DATE() - INTERVAL 23 DAY
3. COUNT(非空列)等于COUNT(*).更改:
COUNT(traffic_listingid) AS genuine_hits,
至:
COUNT(*) AS genuine_hits,
因为它在MySQL中速度更快(尽管我不确定版本4.3是否如此)
对于索引问题,用于连接的每个列上至少应有一个索引.为traffic_timestamp再添加一个可能也会有所帮助.
如果您告诉我们traffic_ipaddress和traffic_timestamp在哪些表中,以及EXPLAIN EXTENDED显示的内容,那么可能会有更好的主意.
再次读取查询,似乎实际上只是表流量中的GROUP BY,而其他2个表用于获取参考数据.因此,该查询等效于(流量分组依据)-join-listing-join-user.不确定这对您的MySQL旧版本是否有帮助,但是最好同时使用两个版本的查询并测试一个查询在系统中的运行速度是否更快.