mysql – 我可以使用外键索引作为获取INNODB表中行数的快捷方式吗?

weixin_38081402 2019-09-12 10:41:07
我有一个包含大量行的表. 默认情况下,主键(自动递增整数)已编制索引. 在等待返回行计数时,我在另一个窗口中执行了EXPLAIN,结果如下: mysql> SELECT COUNT(1) FROM `gauge_data`; +----------+ | COUNT(1) | +----------+ | 25453476 | +----------+ 1 row in set (2 min 36.20 sec) mysql> EXPLAIN SELECT COUNT(1) FROM `gauge_data`; +----+-------------+------------+-------+---------------+-----------------+---------+------+----------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+-------+---------------+-----------------+---------+------+----------+-------------+ | 1 | SIMPLE | gauge_data | index | NULL | gauge_data_FI_1 | 5 | NULL | 24596487 | Using index | +----+-------------+------------+-------+---------------+-----------------+---------+------+----------+-------------+ 1 row in set (0.13 sec) 由于主键保证是唯一的,我可以从EXPLAIN中获取行数并将其用作表的行数吗? 顺便说一句,我认为数字的差异是由于更多数据不断被添加到该表中.
...全文
8 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38091234 2019-09-12
  • 打赏
  • 举报
回复
您无法信任EXPLAIN计划的行数.为什么? 每次查询优化发生在涉及InnoDB表的地方时,InnoDB存储引擎都会对密钥的BTREE条目进行近似处理.它们的近似值从查询变为查询. 只需运行SHOW INDEXES FROM guage_data;多次,每次都会得到一组不同的行数.您可以将innodb_stats_on_metadata设置为0: SET GLOBAL innodb_stats_on_metadata = 0; 这将导致SHOW INDEXES FROM guage_data;一遍又一遍地给出相同的数字.这仍然是弄巧成拙的,因为无论如何行数仍然是近似的.您必须禁用元数据统计信息并运行ANALYZE TABLE.再次,这是弄巧成拙的. 启用innodb_stats_on_metadata后,将始终进行近似处理.我在2011年6月21日回复了这篇文章:From where does the MySQL Query Optimizer read index statistics? 鉴于这一切,如果id是PRIMARY KEY,最好还是选择SELECT id FROM guage_data.但是,请注意MySQL在EXPLAIN计划中选择遍历gauge_data_FI_1索引.如果这个表是InnoDB,这在世界上是有意义的.为什么?每个非唯一索引都存储PRIMARY KEY的rowid.

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧