建立一個 table 並塞 fake data 來當作測試的資料表:
use `test`; CREATE TABLE `people` ( `id` bigint UNSIGNED NOT NULL, `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, `email` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL, `birth` date NOT NULL, `phone` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, `addr` varchar(250) COLLATE utf8mb4_unicode_ci NOT NULL, `city` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ALTER TABLE `people` ADD PRIMARY KEY (`id`);
正常情況下要查詢 rows count 大概就是以下的 query 方法:
SELECT count(*) from prople ;
這個 query 會跑去 scan table 或是 scan index,當資料量到一定規模,scan 會花上好幾分鐘。
另一個方法是去 information_schema
裡面做查詢,可以找到每個 table 的大概的狀況 (不會是準確的數字):
SELECT * FROM `TABLES` WHERE TABLE_SCHEMA = 'test' and TABLE_NAME = 'people'
不過我在找問題時用了 explain,意外發現一個更快、更準確的方法:explain 會列出 index size,如果是使用 primary key + auto increment,這個 index size 其實就是 table size:
> explain select count(9) from `people` \G id | 1 select_type | SIMPLE table | people partitions | <null> type | index possible_keys | <null> key | PRIMARY key_len | 8 ref | <null> rows | 11366812 filtered | 100.0 Extra | Using index