2011-04-23 8 views
0

だから私はこれらの3つの行の3つの行とユニークなキーをインデックスすることに対していくつかのテストを行った。結果は自分自身を驚かせた。ユニークvsインデックス付き

CREATE TABLE locations (
    locationid INT(10)  NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    country INT(2)  NOT NULL, 
    state  INT(2)  NOT NULL, 
    city  VARCHAR(64) NOT NULL, 
    UNIQUE(`country`, `state`, `city`) 
); 

CREATE TABLE locations (
    locationid INT(10)  NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    country INT(2)  NOT NULL, 
    state  INT(2)  NOT NULL, 
    city  VARCHAR(64) NOT NULL, 
    INDEX(`country`), 
    INDEX(`state`), 
    INDEX(`city`) 
);  

だから私は完了し、いくつかの自動車を実行しようとしましたし、私は3つのインデックスを持つテーブルは、単一の一意のキーで速くテーブルよりも働きました。オートコンプリートSQLはので、私は、MySQLに行って、ちょうどで入力しようとしましたが、平均的に単一の固有キーが約5倍を実行します

<?php 
    $query = "SELECT state, city 
       FROM locations 
       WHERE city LIKE '$city%' and state=$state and country='US';"; 

    $mysqli->query($query); 
?> 

は、私は上記のコードは少し遅く走っていたことに気づいた...ように見えました遅い...なぜ?

+0

engineintodbと一緒にsmallint unsignedやtinyint unsignedなどのより適切な整数データ型を使用し、複合主キーを宣言してみてください。 –

+0

PHPでクエリのパフォーマンスをテストしても、正確なパフォーマンスの見積もりが得られません。 * SQL_NO_CACHE *でmysqlコマンドライン/ interfaceのクエリを実行してみてください。 –

答えて

0

最初の例は一意ですcomposite indexです。 2番目の例には、3つの一意でない索引が含まれています。それはかなり大きな違いです。

これらのケースで実際にどのインデックスが使用されていたかを確認するには、クエリでEXPLAINを実行してください。

表の行数、および個々の索引のカーディナリティ/選択性によって、索引が使用されているかどうかが決まることに注意してください。

0

これは、その後、3つのフィールド上の3つのインデックス何か他のもので、すべての3つのフィールド

UNIQUE(`country`, `state`, `city`) 

の指標である:

INDEX(`country`), 
INDEX(`state`), 
INDEX(`city`) 

(あなたが組み合わせ1 Iでインデックスを使用していません推測)

関連する問題