2013-05-31 102 views
0

我有一个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

Total count after execution is

任何人都可以在优化这个查询建议可能或可能我想计数的计数。请帮助运行一个老太婆工作。

+0

'SELECT COUNT(null)FROM cnitranr left join cnitrand on cnitrand.tx_no = cnitranr.tx_no'会稍微提高性能。还启用mysql缓存。此外,以块为单位削减这种大数据也是一个好主意。我不希望任何用户读取“31770999”行。所以你可以有多个表(甚至数据库),并根据请求从相应的数据源获取数据。 – Leri

+1

左连接独立地在连接条件下返回左侧表的所有值。你真的想要计算'cnitranr'的所有项目吗?也许你应该使用INNER JOIN? – Atber

+0

@PSR我已经尝试过,但这也需要很长时间。我认为我必须在分页中做一些技巧。 –

回答

1

您需要实现物化视图。

由于MySQL不直接支持他们,你需要创建一个这样的表:

CREATE TABLE totals (cnt INT) 

和两个表,将增加和INSERTUPDATEDELETE每个递减cnt写触发的表格。

请注意,如果您在任一表格中有多个链接记录的记录,则影响此记录的DML将会很慢。

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

这是非常不可能的,一个人想浏览页面上的20M +记录只能显示100左右。

相关问题