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

Mysql 计数(*)使用左连接需要很长时间才能响应,mysql,performance,Mysql,Performance,我有一个MySQL查询,用于显示应用程序列表页面中的数据计数 质疑 解释屏幕截图 cnitranr上的索引 tx_no (primary )approx 1 crore of data[ENGINE MYISAM] cnitrand索引 (tx_no secondary)approx 2 crore of data[ENGINE MYISAM] 分析器输出如下 任何人都可以建议优化此查询的可能性,或者我想运行crone作业来计算计数。请帮助 您需要实现物化视图 由于MySQL不直接支持

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

质疑

解释屏幕截图

cnitranr上的索引

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

(tx_no secondary)approx 2 crore of data[ENGINE MYISAM]
分析器输出如下


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

您需要实现物化视图

由于MySQL不直接支持它们,因此需要创建如下表:

CREATE TABLE totals (cnt INT)
并在两个表上写入一个触发器,该触发器将在
插入
更新
删除
时对每个表执行递增和递减操作

请注意,如果两个表中都有一个包含许多链接记录的记录,则影响该记录的
DML
将非常缓慢

在大数据量上,很少需要精确计数,尤其是分页。正如我在上面的评论中所说,谷歌、Facebook等在分页结果上只显示大致数字


一个人不太可能在只能显示100条左右的页面上浏览2000多条记录。

从cnitranr左键选择COUNT(null)并在cnitrand上加入cnitrand。tx\u no=cnitranr.tx\u no
将略微提高性能。还可以启用mysql缓存。此外,将此类大数据切成块也是一个好主意。我不希望任何用户阅读
31770999
行。所以,您可以有多个表(甚至数据库),并根据请求从相应的数据源获取数据。是否确实要获取
cnitranr
的所有项目的计数?也许你应该使用内部连接?@PSR我已经试过了,但也花了很长时间。我想我必须在分页方面做一些技巧。恐怕不会比这更快。。。3100万条记录的合并需要时间。@Jack我现在也意识到了。要分区吗
CREATE TABLE totals (cnt INT)