【mysql】怎样检察大表记录行数

打印 上一主题 下一主题

主题 792|帖子 792|积分 2376

1. 使用 ANALYZE TABLE 和 SHOW TABLE STATUS



  • 1.ANALYZE TABLE 可以更新表的统计信息,然后使用 SHOW TABLE STATUS 来检察估算的行数。
  • 2.示例
  1. -- 更新表的统计信息
  2. ANALYZE TABLE your_table_name;
  3. -- 查看表的状态信息,包括估算的行数
  4. SHOW TABLE STATUS LIKE 'your_table_name';
复制代码


  • 3.在输出效果中,Rows 列表现的是表的估算行数
2. 查询 INFORMATION_SCHEMA 表



  • 1.查询 INFORMATION_SCHEMA.TABLES 表也可以获取表的估算行数。
  • 2.示例
  1. SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES
  2. WHERE TABLE_SCHEMA = 'your_database_name'  AND TABLE_NAME = 'your_table_name';
复制代码


  • 3.TABLE_ROWS 表现的是估算值,不是精确的行数。
3. 使用索引统计信息



  • 1.在 InnoDB 存储引擎中,可以使用索引的统计信息来获取行数。通过 SHOW INDEX 或查询 INFORMATION_SCHEMA.STATISTICS 可以获得索引的估算行数。
  • 2.使用示例
  1. SHOW INDEX FROM your_table_name;
复制代码
4. 维护行数缓存



  • 1.为了在生产情况中高效地获取精确的行数,可以使用触发器维护一个单独的表,用于记录每个大表的行数。(不发起,维护迁移太难了,影响性能)
  • 2.这种方法可以提供及时的精确计数,而不会每次都扫描整个表。
  • 3.示例
  1. -- 创建行数缓存表
  2. CREATE TABLE table_row_count (
  3.     table_name VARCHAR(255) PRIMARY KEY,
  4.     row_count INT
  5. );
  6. -- 初始化行数
  7. INSERT INTO table_row_count (table_name, row_count)
  8. VALUES ('your_table_name', (SELECT COUNT(*) FROM your_table_name));
  9. -- 创建插入触发器
  10. CREATE TRIGGER after_insert_trigger
  11. AFTER INSERT ON your_table_name
  12. FOR EACH ROW
  13. BEGIN
  14.     UPDATE table_row_count
  15.     SET row_count = row_count + 1
  16.     WHERE table_name = 'your_table_name';
  17. END;
  18. -- 创建删除触发器
  19. CREATE TRIGGER after_delete_trigger
  20. AFTER DELETE ON your_table_name
  21. FOR EACH ROW
  22. BEGIN
  23.     UPDATE table_row_count
  24.     SET row_count = row_count - 1
  25.     WHERE table_name = 'your_table_name';
  26. END;
  27. -- 查询行数
  28. SELECT row_count
  29. FROM table_row_count
  30. WHERE table_name = 'your_table_name';
复制代码
5. 使用分区计数



  • 1.假如表使用了分区,可以分别统计每个分区的行数,然后汇总得到总行数。这种方法可以避免在单个大表上进行全表扫描。
  • 2.示例
  1. SELECT SUM(partition_count)
  2. FROM (
  3.     SELECT COUNT(*) AS partition_count
  4.     FROM your_table_name PARTITION (partition_1)
  5.     UNION ALL
  6.     SELECT COUNT(*) AS partition_count
  7.     FROM your_table_name PARTITION (partition_2)
  8.     -- 继续添加其他分区
  9. ) AS total_count;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表