mysql左边加入一个非常大的表 - 超级慢

时间:2013-01-27 04:28:33

标签: mysql

[site_list] ~100,000行... 10mb大小。

  • site_id
  • SITE_URL
  • site_data_most_recent_record_id

[site_list_data] ~1500多万行并且正在增长...大约600mb。

  • RECORD_ID
  • SITE_ID
  • site_connect_time
  • site_speed
  • date_checked

粗体列是唯一索引键。

我需要返回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秒将这个巨大的结果缓存到临时表中是我得到的唯一其他解决方案。

3 个答案:

答案 0 :(得分:2)

您需要为查询添加启发式。您需要对查询进行门控以获得合理的性能。它按照日期降序有效地对您的site_list_date表进行排序 - 整个表格。

因此,如果您知道前50名将在最后一天或一周内,请添加“和date_checked>< boundary_date>”到查询。然后它应该首先减少整个结果集,然后排序。

答案 1 :(得分:1)

SQL_CALC_ROWS_FOUND使用COUNT代替。看看here

答案 2 :(得分:1)

一些观察结果。

ORDER BYSQL_CALC_FOUND_ROWS都会增加您的演出成本。通过适当的索引可以改进ORDER BY子句 - 你的date_checked列上有索引吗?这可能有所帮助。

您对SQL_CALC_FOUND_ROWS的确切需求是什么?请考虑将其替换为使用COUNT的单独查询。假设您的查询缓存已启用,这可能会更好。

如果您可以使用COUNT,请考虑将LEFT JOIN替换为INNER JOIN,因为这也有助于提升效果。

祝你好运。