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

このレコード/ファンアウトロジックは、MySQLのクエリプランナーの統計なしの場合にどのように導き出されましたか?

    問題に関するデータがまったくない場合は、見積もりを行う必要があります。

    その式の一般的な形式はコメントで説明されています:

    • キー列を1つだけ使用する場合(x )複数列のインデックス(cを使用) 列)、aを取得します 行(合計行の1%)。したがって、x=1の場合 、結果はaです 定義により。
    • 複数列のインデックスのすべてのキー列の値がわかっている場合は、キー全体あたりの行数を取得します。 (b );したがって、x=cの場合 、bを取得します 行( 1 または10 )定義による。
    • その間に(すべてではないが複数のキー列にキー値を使用する場合)、追加の既知のキー値ごとに、いくつかの追加の行を除外できます。a-b フルがわかっている場合に属さない行 キー(bがあります 行)、および定義により、使用可能なキー列の比率((x-1)/(c-1))に比例して除外されます。 )。
    • -1 (x-1)/(c-1)追加を数えるだけでよいので、これは単なるシフトです(異なる変数名を使用することもできます)。 列、ただしc およびx 最初の列を含むカウントです。 (時系列では、最初の列のパラメータを呼び出します。 t=0 、および-1 まさにそれを行います。

    したがって、結論として、a - (a-b) * (x-1)/(c-1)が得られます。 (a 最初のキー列から比例的に除外する行を引いたもの)。これは(その式を少し変換すると)正確に与えられた式です。簡単な健全性チェック:x=1の場合 (x-1=0 )、第2項は 0 aを取得します 、最初の条件で定義されているとおり。 x=cの場合 、a-(a-b)=bを取得します 2番目の条件で定義されています。

    これらの仮定を使用してこの仮説を立てることは不合理ではありませんが、おそらく同じくらい意味のある別の式を見つけることができます。しかし、それがより良いと主張することはより難しい仕事になるでしょう。

    次に、値を選択する問題があります(b=10 および1% この場合)。明らかに任意の値を選択できます。腸の感覚以外の信頼できるデータなしでこれを行うために、Fermi推定> :

    基本的に、入力パラメーターにはマグナイトのオーダー(1、1000000、1 / 100)を選択するだけで、結果に対して妥当なオーダーの大きさが得られます。

    では、非一意キーがカバーすると予想される行数はいくつですか? 1より大きい場合は、一意のキーにしますが、2、10、または100のようなものですか? 10はおそらく良い推測です(その見積もりでは約3から30までの値をカバーしています)。したがって、この数値は、主要な分布に関する2年間の世界的な調査から得られた可能性がありますが、10の累乗の推定値は、通常、そのような方法で導き出されます。絶対に確信したい場合は、開発者に聞いてください。

    そして、必須のxkcd この種のトピックの場合: What-if?地球を描く




    1. SQL Server 2016:ログインを作成する

    2. 引用符付きのPythonおよびMySQLクエリ

    3. PHPは特定の状況下でmysqlコンテナ名を解決できません

    4. OracleODP.NetおよびEFCodeFirst-SaveChangesエラー