使用左连接计数(*)需要很长时间才能响应

时间:2013-05-31 06:29:54

标签: mysql performance

我有一个MySQL查询,用于显示应用程序列表页面中的数据计数。

查询

SELECT COUNT(*) FROM cnitranr left join cnitrand on cnitrand.tx_no=cnitranr.tx_no

解释屏幕截图 enter image description here

cnitranr上的索引

tx_no (primary )approx 1 crore of data[ENGINE MYISAM]

cnitrand上的索引

(tx_no secondary)approx 2 crore of data[ENGINE MYISAM]

Profiler输出是这样的 profiler

Total count after execution is

任何人都可以建议优化此查询的可能性,或者我可能想要运行一个用于计算计数的crone作业。请帮助。

1 个答案:

答案 0 :(得分:1)

您需要实现物化视图。

由于MySQL不直接支持它们,您需要创建一个类似的表:

CREATE TABLE totals (cnt INT)

并在两个表上写一个触发器,它会在cntINSERTUPDATE上递增和递减DELETE到每个表。

请注意,如果您在任一表中都有一个包含许多链接记录的记录,那么影响此类记录的DML将会很慢。

在大数据量上,您很少需要精确计数,特别是对于分页。正如我在上面的评论中所说,谷歌,Facebook等只显示分页结果的近似数字。

一个人不太可能想要浏览页面上只能显示100个左右的20M +记录。