我同意@RemusRusanu(他的回答为+1)
SELECT COUNT(*) FROM mydb.mytable
InnoDB中的行为类似于事务性存储引擎。将其与MyISAM进行比较。
我的ISAM
如果mydb.mytable
是MyISAM表,则启动SELECT COUNT(*) FROM mydb.mytable;
就像运行SELECT table_rows FROM information_schema.table WHERE table_schema = 'mydb' AND table_name = 'mytable';
。这将触发快速查找MyISAM表标题中的行数。
创新数据库
如果mydb.mytable
是InnoDB表,那么您会碰到很多事情。您正在执行MVCC,管理以下内容:
- ib_logfile0 / ib_logfile1(重做日志)
- ibdata1
- 缓冲池管理
- 事务隔离(4种类型)
向InnoDB索要表计数要求浏览这些不祥的事物。实际上,永远不会真正知道SELECT COUNT(*) from mydb.mytable
仅计数可重复读取还是包含已提交的读取和未提交的读取。
您可以尝试通过启用innodb_stats_on_metadata来稍微稳定一下。
根据有关innodb_stats_on_meta_data的MySQL文档
启用此变量后(默认设置,与创建变量之前一样),InnoDB会在元数据语句(例如SHOW TABLE STATUS或SHOW INDEX)期间或在访问INFORMATION_SCHEMA表TABLES或STATISTICS时更新统计信息。(这些更新类似于ANALYZE TABLE的情况。)禁用时,InnoDB不会在这些操作期间更新统计信息。禁用此变量可以提高具有大量表或索引的模式的访问速度。它还可以提高涉及InnoDB表的查询的执行计划的稳定性。
禁用它可能不会使您在设置EXPLAIN计划方面更加稳定。它可能SELECT COUNT(*) from mydb.mytable
以一种好方法,一种坏方法或根本不影响性能。试试看吧!