公式のMySQL5.1ドキュメント
InnoDBがSHOW TABLE STATUS
で正確な統計を提供しないことを認めます 。 MYISAMテーブルは特に行数などのメタデータの内部キャッシュを保持しますが、InnoDBエンジンはテーブルデータとインデックスの両方を* / var / lib / mysql /ibdata**に格納します
InnoDBには、行番号のクイッククエリを可能にする適切なインデックスファイルがありません。
一貫性のないテーブル行番号は、SHOW TABLE STATUS
によって報告されます InnoDBは、テーブルデータの範囲(* / var / lib / mysql / ibdata **内)をサンプリングして「行」の値を動的に推定し、おおよその行数を推定するためです。 SHOW TABLE STATUS
を使用すると、InnoDBのドキュメントで最大50%の行番号の不正確さが認められるほどです。
MySQLのドキュメントでは、MySQLクエリキャッシュを使用して一貫した行番号クエリを取得することを提案していますが、ドキュメントでは方法を指定していません。 。これを行う方法の簡潔な説明は次のとおりです。
まず、クエリキャッシュが有効になっていることを確認します。
mysql> SHOW VARIABLES LIKE 'have_query_cache';
have_query_cacheの値が NO 次に、次の行を /etc/my.cnf に追加して、クエリキャッシュを有効にします。 その後、mysqldを再起動します。
have_query_cache=1 # added 2017 08 24 wh
query_cache_size = 1048576
query_cache_type = 1
query_cache_limit = 1048576
(詳細については、 http://dev.mysqlを参照してください。 com / doc / refman / 5.1 / en / query-cache.html )
を使用してキャッシュの内容をクエリします
mysql> SHOW STATUS LIKE 'Qcache%';
次に、SQL_CALC_FOUND_ROWS
を使用します SELECT
のステートメント クエリ:
SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table
SQL_CALC_FOUND_ROWS
キャッシュからの読み取りを試行し、このクエリが見つからない場合は、指定されたテーブルに対してクエリを実行してから、テーブルの行数をクエリキャッシュにコミットします。上記のクエリ(または他の'cachable' SELECT
)の追加の実行 ステートメント-以下を参照)はキャッシュを調べて正しい結果を返します。
後続のSELECT
> クエリ
-たとえLIMIT
であっても 結果-クエリキャッシュを調べて、テーブルの行の合計数を(1回限り)取得できるようにします
SELECT FOUND_ROWS();
これは、前にキャッシュされたクエリの正しいテーブル行の合計を返します。