问题:
计算一个大约有 9 的巨大 InnoDB 表中的行数通过 COUNT(*) 或 COUNT(id) 计算百万条记录带来了重大的性能挑战,执行时间长达 6 秒。
初始优化尝试:
引用外部源,它有人建议强制 InnoDB 使用索引可以缓解这个问题。然而,实现“SELECT COUNT(id) FROM perf2 USE INDEX (PRIMARY)”并没有带来性能提升。
替代解决方案:
MySQL 5.1.6 及更高版本提供强大的解决方案:
1.创建统计表:
创建一个名为“stats”的专用表来存储行数:
CREATE TABLE stats (`key` varchar(50) NOT NULL PRIMARY KEY, `value` varchar(100) NOT NULL);
2.安排事件:
使用 MySQL 的事件调度程序设置一个名为“update_stats”的事件,以定期更新统计表的行数:
CREATE EVENT update_stats ON SCHEDULE EVERY 5 MINUTE DO INSERT INTO stats (`key`, `value`) VALUES ('data_count', (select count(id) from data)) ON DUPLICATE KEY UPDATE value=VALUES(value);
好处:
此解决方案具有多个优点:
以上是如何优化 InnoDB 表上的 COUNT(*) 查询以提高性能?的详细内容。更多信息请关注PHP中文网其他相关文章!