sql >> データベース >  >> RDS >> Mysql

innodbのSHOWTABLESTATUSがそれほど信頼できないのはなぜですか?

    公式の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)の追加の実行 ステートメント-以下を参照)はキャッシュを調べて正しい結果を返します。

    後続の'cachable' SELECT> クエリ -たとえLIMITであっても 結果-クエリキャッシュを調べて、テーブルの行の合計数を(1回限り)取得できるようにします

    SELECT FOUND_ROWS();
    

    これは、前にキャッシュされたクエリの正しいテーブル行の合計を返します。



    1. SQLServerで自動インクリメント主キーを定義する方法

    2. データベース設計のステップは何ですか?

    3. 日ごとにグループ化し、行のない日を表示しますか?

    4. PHP登録フォームからMysqlに日付が保存されない