MySQL查看表行数

MySQL查看表行数

引言

评估表规模、判断是否需要分表、统计数据量时都要看行数。COUNT(*)最准但大表慢,information_schema的TABLE_ROWS快但InnoDB是估算值,两个手段按场景选。

精确统计:COUNT(*)

SELECT COUNT(*) FROM users;

精确返回真实行数,MyISAM直接读元数据很快,InnoDB要逐行扫描,大表千万级以上会锁读、耗时长。

带条件统计

SELECT COUNT(*) FROM orders WHERE status = 1;

统计满足条件的行数,WHERE命中索引时走索引扫描,比全表快。

估算行数:information_schema

SELECT TABLE_NAME, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'blog' AND TABLE_NAME = 'users';

秒出结果,适合先摸底表规模,但InnoDB的TABLE_ROWS是基于采样的估算值,可能和真实值差10%到20%。

一次查看库里所有表行数

SELECT TABLE_NAME, TABLE_ROWS, DATA_LENGTH/1024/1024 AS data_mb
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'blog'
ORDER BY TABLE_ROWS DESC;

按行数排序,快速找出最大的几张表,配合DATA_LENGTH看占用空间。

大表COUNT优化思路

  • 先看估算值判断量级,需要精确再COUNT;
  • COUNT(*)走二级索引,别COUNT(主键)以外的可空字段;
  • 历史归档、分表后单表控制在千万行以内;
  • 实时统计用缓存或汇总表,不在线上大表直接COUNT。

注意事项

  • InnoDB的COUNT(*)不加WHERE返回约数,精确值必须扫描;
  • information_schema的TABLE_ROWS只是估算,别当准确值用于对账;
  • 大表COUNT期间会产生一致性读,占用缓冲池,避开高峰;
  • 表刚大量增删后元数据统计信息可能陈旧,先ANALYZE TABLE刷新;
  • MyISAM的TABLE_ROWS是精确值,和InnoDB机制不同;
  • 统计行数别用COUNT(1)和COUNT(*)纠结,性能基本一致。

总结

COUNT()精确统计行数,大InnoDB表慢且耗资源;information_schema.TABLE_ROWS秒出估算值用于摸底。先看估算判断表规模,需要精确再COUNT(),条件统计尽量走索引。大表COUNT避开业务高峰,增删数据后先ANALYZE TABLE刷新元数据。实时报表建议走汇总表或缓存,避免线上大表反复全表扫描。


emer 发布于  2026-10-22 07:10 

PHP判断数组为空

PHP判断数组为空

引言

接口返回、查询结果、表单收集都要先判断数组有没有数据,再决定走空分支还是遍历。empty、count、!$arr三种写法结果接近,但适用边界不同,选错会把0或null误判。

empty最常用

$list = [];
if (empty($list)) {
    echo '数组为空';
}

empty对空数组、未定义变量、null、0、''都返回true,不会报未定义警告,最适合先判空。

count取元素个数

if (count($arr) === 0) {
    echo '没有元素';
}

精确判断元素数量,count为0才是空;注意$arr本身未定义会警告,先isset。

逻辑非写法

if (!$arr) {
    echo '空';
}

短但要求$arr一定是已初始化数组,未定义会Notice。

判断键是否为空

不是判断整体,而是某键值:

if (empty($arr['name'])) {
    echo 'name为空';
}

避免直接取未定义键。

多维数组判空

if (!empty($arr['items']) && is_array($arr['items'])) {
    foreach ($arr['items'] as $item) {}
}

先确认外层键存在且是数组,再遍历内层。

注意事项

  • empty(0)和empty('')也为true,数字0场景别用empty判数组元素;
  • count第二个参数1可统计多维总元素;
  • 严格比较用count($arr)===0;
  • 数组里全是空字符串不等于空数组;
  • 查询无结果返回[]而非null,按空数组处理;
  • 结合isset防止未定义键警告。

总结

整体判空首选empty($arr)防未定义,精确统计用count($arr)===0,短逻辑非要求变量已初始化,判单个键用empty($arr['key']),多维先确认键存在再遍历。注意empty对0和空串也为真,数字场景改用count严格判断。


emer 发布于  2026-10-19 07:31 
'); })();