我有一个MySQL查询,用于显示应用程序列表页面中的数据计数。
查询
SELECT COUNT(*) FROM cnitranr left join cnitrand on cnitrand.tx_no=cnitranr.tx_no
解释屏幕截图
cnitranr上的索引
tx_no (primary )approx 1 crore of data[ENGINE MYISAM]
cnitrand上的索引
(tx_no secondary)approx 2 crore of data[ENGINE MYISAM]
Profiler输出是这样的
任何人都可以建议优化此查询的可能性,或者我可能想要运行一个用于计算计数的crone作业。请帮助。
答案 0 :(得分:1)
您需要实现物化视图。
由于MySQL不直接支持它们,您需要创建一个类似的表:
CREATE TABLE totals (cnt INT)
并在两个表上写一个触发器,它会在cnt
,INSERT
和UPDATE
上递增和递减DELETE
到每个表。
请注意,如果您在任一表中都有一个包含许多链接记录的记录,那么影响此类记录的DML
将会很慢。
在大数据量上,您很少需要精确计数,特别是对于分页。正如我在上面的评论中所说,谷歌,Facebook等只显示分页结果的近似数字。
一个人不太可能想要浏览页面上只能显示100个左右的20M +记录。