2013-11-28 5 views
9

私はMySQLのインデックスを学習しており、そのインデックスはSELECTクエリのWHERE句に指定された任意の列に適用する必要があることがわかりました。MySQLの初心者 - 複数の列のインデックス

次に、Multiple Column Index vs Multiple Indexesが見つかりました。

最初のQ、私は何が複数の列のインデックスですか?私は、Joomlaのコードは、この複数の列のインデックスですか?

CREATE TABLE `extensions` (
    `extension_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(100) NOT NULL, 
    `type` VARCHAR(20) NOT NULL, 
    `element` VARCHAR(100) NOT NULL, 
    `folder` VARCHAR(100) NOT NULL, 
    `client_id` TINYINT(3) NOT NULL, 
    ... ... 
    PRIMARY KEY (`extension_id`), 

    // does code below is multiple column index? 

    INDEX `element_clientid` (`element`, `client_id`), 
    INDEX `element_folder_clientid` (`element`, `folder`, `client_id`), 
    INDEX `extension` (`type`, `element`, `folder`, `client_id`) 
) 

第二にQは、1つの複数の列のインデックスは、1つのSELECTで使用されていることを考えた場合、私は修正するのですか?インデックスの親指の

SELECT column_x WHERE element=y AND clinet_id=y; // index: element_clientid 

SELECT ex.col_a, tb.col_b 
    FROM extensions ex 
    LEFT JOIN table2 tb 
    ON (ex.ext_id = tb.ext_id) 
    WHERE ex.element=x AND ex.folder=y AND ex.client_id=z; // index: element_folder_clientid 

答えて

20

一般的なルールはWHEREまたはJOIN句で使用される任意のフィールド上に1を平手打ちすることです。

言われているように、いくつかの最適化を行うことができます。 KNOW特定のテーブルでWHEREで使用される唯一のフィールドの組み合わせがある場合は、これらのフィールドに単一のマルチフィールドキーを作成することができます。

INDEX (field1, field2, field5) 

v.s.

INDEX (field1), 
INDEX (field2), 
INDEX (field5) 

マルチフィールドインデックスは、多くの場合、複数のインデックスをスキャンする必要があります。欠点は、問題のフィールドがWHERE句で実際に使用されている場合にのみ、マルチフィールドインデックスが使用できることです。

サンプルクエリでは、elementfield_idがすべて3つのインデックスに含まれているため、それらを専用のインデックスに分割する方がよい場合があります。これらが変更可能なフィールドの場合は、独自の専用インデックスを保持する方がよいでしょう。例えばfield_idをバルクで変更する必要がある場合、DBは3つの異なるインデックスv.sysを更新する必要があります。専用のものを1つだけ更新します。

しかし、それはすべてベンチマークになります。さまざまなインデックス設定を使用して特定の設定をテストし、どれが最も優れているかを確認します。親指のルールは便利ですが、時間の100%は動作しません。

+0

はい、フィールド1に基づいていくつかのテストソートを行い、他のフィールドは自動的に索引付けされます。しかし、私は要素とfield_idを別々に分割することについてはわかりません。 – qaharmdz