More than 1 year has passed since last update.

rowsが違うんですが・・・

テストしてて気付きました。
rowsを早く知りたくて show table status を使っていたのですが、実は適当な値だったのです。
膝から崩れ落ちそうになりました。

コンソール

※ 固有名などはマスクしています

[root@hoge batch]# mysql -uroot -proot --database=my_work
mysql> show table status;
+-----------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| Name      | Engine | Version | Row_format | Rows    | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment       |
+-----------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| hogehoge  | InnoDB |      10 | Compact    | 2502081 |          20164 | 50454331392 |               0 |   1566572544 |   7340032 |           NULL | 2014-06-02 03:17:08 | NULL        | NULL       | utf8_general_ci |     NULL |                |               |
+-----------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
mysql> select count(*) from hogehoge;
+----------+
| count(*) |
+----------+
|  4925548 |
+----------+
1 row in set (8.27 sec)

select count(*)の値が正しくて show table status; のrowsは正しくないです。
4925548 - 2502081 = 2423467 の差が出ています。倍近い差です。

ドキュメントを見ました

おじさん、ちょっとがっかりしちゃったな…

  • Rows

行数MyISAM のようないくつかのストレージ エンジンは、正確なカウントを格納します。InnoDB のような別のストレージ エンジンにとっては、この値はおおよその物であり、実際の値とは40から50%くらい異なります。そのような場合は、正確なカウントを得る為に SELECT COUNT(*) を利用してください。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.27 SHOW TABLE STATUS 構文 http://dev.mysql.com/doc/refman/5.1/ja/show-table-status.html

気を付けます。。。

select count(xxx) のxxxはインデクスを張っているフィールドを指定するとちょっとは早いので頑張ります。
※ 正確にはNULLを許容しないフィールドを指定すると早いです

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.