2016-10-24 1 views
0

MySQLcount(*)information_schema.TABLESによって報告された数字は全く異なります。MySQL information_schemaはcount()よりも少ない行を報告します

mysql> SELECT * FROM information_schema.TABLES WHERE TABLE_NAME = 'my_table'\G 
*************************** 1. row *************************** 
    TABLE_CATALOG: def 
    TABLE_SCHEMA: my_db 
    TABLE_NAME: my_table 
    TABLE_TYPE: BASE TABLE 
     ENGINE: InnoDB 
     VERSION: 10 
    ROW_FORMAT: Compact 
    TABLE_ROWS: 31016698 
AVG_ROW_LENGTH: 399 
    DATA_LENGTH: 12378439680 
MAX_DATA_LENGTH: 0 
    INDEX_LENGTH: 4863262720 
     DATA_FREE: 5242880 
AUTO_INCREMENT: NULL 
    CREATE_TIME: 2016-06-14 18:54:24 
    UPDATE_TIME: NULL 
    CHECK_TIME: NULL 
TABLE_COLLATION: utf8_general_ci 
     CHECKSUM: NULL 
CREATE_OPTIONS: 
    TABLE_COMMENT: 
1 row in set (0.00 sec) 

mysql> select count(*) from my_table; 
+----------+ 
| count(*) | 
+----------+ 
| 46406095 | 
+----------+ 
1 row in set (27.45 sec) 

information_schemaに応じ行、count()があることに注意が行... 1が信頼できる

今をレポート!なぜこれらの統計は異なるのですか?

私はMySQLサーバv5.6.30を使用しています。

答えて

0

出力のSHOW TABLE STATUSに似ているメタデータの数を信頼できません。それは、100以上の要因によって、それを上回るか下回っていることが多い。

この理由は、エンジンが、これを計算するまでテーブル内の行数を認識していないためです。重い負荷の下では、プライマリ・キー・インデックスに多くの競合があり、正確な値を高価な計算に固定する可能性があります。

この近似値は、合計データ長を平均行長で除算して計算されます。あなたのレコードの長さがほぼ同じで、たくさんのレコードを削除していない限り、それはすごく近いものです。

本当に信頼できる値はCOUNT(*)ですが、その操作には時間がかかることがありますので、注意してください。

関連する問題