[site_list] ~100,000行... 10mb大小。
[site_list_data] ~1500多万行并且正在增长...大约600mb。
粗体列是唯一索引键。
我需要返回50个最近更新的网站以及最近的数据 - 连接时间,速度,日期......
这是我的问题:
SELECT SQL_CALC_FOUND_ROWS
site_list.site_url,
site_list_data.site_connect_time,
site_list_data.site_speed,
site_list_data.date_checked
FROM site_list
LEFT JOIN site_list_data
ON site_list.site_data_most_recent_record_id = site_list_data.record_id
ORDER BY site_data.date_checked DESC
LIMIT 50
如果没有ORDER BY和SQL_CALC_FOUND_ROWS(我需要它用于分页),查询大约需要1.5秒,超过2秒或更长时间这是不够好的,因为显示此数据的特定页面正在获取20K +综合浏览量/天,这个查询显然太重了(服务器几乎在我放这个时就死了)而且太慢了。
mySQL的专家,你会怎么做?如果该表达到1亿条记录怎么办?每隔30秒将这个巨大的结果缓存到临时表中是我得到的唯一其他解决方案。
答案 0 :(得分:2)
您需要为查询添加启发式。您需要对查询进行门控以获得合理的性能。它按照日期降序有效地对您的site_list_date表进行排序 - 整个表格。
因此,如果您知道前50名将在最后一天或一周内,请添加“和date_checked>< boundary_date>”到查询。然后它应该首先减少整个结果集,然后排序。
答案 1 :(得分:1)
SQL_CALC_ROWS_FOUND使用COUNT代替。看看here
答案 2 :(得分:1)
一些观察结果。
ORDER BY
和SQL_CALC_FOUND_ROWS
都会增加您的演出成本。通过适当的索引可以改进ORDER BY
子句 - 你的date_checked列上有索引吗?这可能有所帮助。
您对SQL_CALC_FOUND_ROWS
的确切需求是什么?请考虑将其替换为使用COUNT
的单独查询。假设您的查询缓存已启用,这可能会更好。
如果您可以使用COUNT
,请考虑将LEFT JOIN
替换为INNER JOIN
,因为这也有助于提升效果。