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

新しいインデックスを追加しても、MySQLのインデックスのカーディナリティが変更されないのはなぜですか?

    テーブルに行が1つしかない場合は、もちろん、インデックスのカーディナリティは1である必要があります。一意の値の数を数えているだけです。

    インデックスをバケットに基づくルックアップテーブル(ハッシュなど)と考える場合、カーディナリティはバケットの数です。

    仕組みは次のとおりです。一連の列にインデックスを作成する場合(a,b,c,d) 、次に、データベースはテーブル内のすべての行を調べ、各行について、それらの4つの列の順序付けられた4つ組を調べます。テーブルが次のようになっているとしましょう:

    a  b  c  d  e   
    -- -- -- -- --  
    1  1  1  1  200 
    1  1  1  1  300
    1  2  1  1  200
    1  3  1  1  200
    

    したがって、データベースが調べるのは4つの列(a、b、c、d)だけです:

    a  b  c  d  
    -- -- -- --
    1  1  1  1 
    1  2  1  1 
    1  3  1  1 
    

    一意の行が3つしか残っていないことがわかりますか?それらは私たちのバケツになりますが、私たちはそれに戻ります。実際には、テーブルの各行にレコードIDまたは行識別子もあります。したがって、元のテーブルは次のようになります。

    (row id) a  b  c  d  e   
    -------- -- -- -- -- --  
    00000001 1  1  1  1  200 
    00000002 1  1  1  1  300
    00000003 1  2  1  1  200
    00000004 1  3  1  1  200
    

    したがって、(a、b、c、d)の4つの列だけを見ると、実際には行IDも見ています:

    (row id) a  b  c  d 
    -------- -- -- -- --
    00000001 1  1  1  1
    00000002 1  1  1  1
    00000003 1  2  1  1
    00000004 1  3  1  1
    

    ただし、行IDではなく(a、b、c、d)でルックアップを実行したいので、次のように生成します。

    (a,b,c,d) (row id)
    --------- --------
    1,1,1,1   00000001
    1,1,1,1   00000002
    1,2,1,1   00000003
    1,3,1,1   00000004
    

    最後に、同一の(a、b、c、d)値を持つ行のすべての行IDをグループ化します。

    (a,b,c,d) (row id)
    --------- ---------------------
    1,1,1,1   00000001 and 00000002
    1,2,1,1   00000003
    1,3,1,1   00000004
    

    分かりますか? (1,1,1,1)(1,2,1,1)と(1,3,1,1)である(a、b、c、d)の値は、ルックアップテーブルのキーになりました元のテーブルの行に追加します。

    実際には、これは実際には起こりませんが、インデックスの「ナイーブ」(つまり、単純な)実装がどのように行われるかについての良いアイデアが得られるはずです。

    しかし、肝心なのはこれです。カーディナリティは、インデックスにある一意の行の数を測定するだけです。この例では、ルックアップテーブルのキーの数は3でした。

    お役に立てば幸いです。



    1. エラー1396(HY000):'user'@'localhost'の操作DROPUSERが失敗しました

    2. 値が現在の値より大きい場合のMySQLの更新

    3. あるデータベースから含まれているテーブルをコピーして、別のデータベーステーブルに挿入したい

    4. 複数の値に一致するレコードのグループを検索します