2017-09-11 9 views
1

2つのテーブル:1の選択のために、より速く、なぜあるべきMYSQLではどのテーブルが高速ですか?

CREATE TABLE `htmlcode_1` (
    `global_id` int(11) NOT NULL, 
    `site_id` int(11) NOT NULL, 
    PRIMARY KEY (`global_id`), 
    KEY `k_site` (`site_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `htmlcode_2` (
    `global_id` int(11) NOT NULL, 
    `site_id` int(11) NOT NULL, 
    PRIMARY KEY (`site_id`,`global_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

'select * from table where site_id=%s' 
+1

あなたの2つのテーブルは異なるエンティティを表しています。 'global_id'があなたの実際のプライマリキー(これはおそらく一意です)ならば、この一意性をもはや強制しないので、別のpkを選択しないでください。そのようにプライマリキーを選択しないでください。この状況では、追加の索引が同じ結果(その照会の速度)を持ちます。スピードだけに関して、ビルはあなたに答えを与えました。 – Solarflare

+0

@Solarflare - MySQLでは、 'PRIMARY KEY'は定義上、' UNIQUE'です。それについての「おそらくユニーク」はありません。 –

+0

@RickJames私は、 'global_id'はおそらくそれが何であるかによって本質的に一意でなければならない値です(そうでなければ最初のテーブルは不可能です)。 evgが '(site_id、global_id)'をpkとして使用して、そのクエリを速くしようとすると、この属性は失われます。 – Solarflare

答えて

3

後者のテーブルは、SELECTクエリのほうが多少高速ですが、テーブルの行数がそれほど多くないと仮定します。

主キーでInnoDBを照会するとき、ルックアップはテーブルのクラスタ化インデックスに対して行われます。

2次キー検索では、索引で検索が必要な場合は、主キー値を表示します。主キー値は、主キーで検索するために使用されます。したがって、これは2回のルックアップを使用します。 PRIMARY KEYを使用する

+1

他の列がある場合のみ、2つのルックアップがあります。そうでなければ、2つのテーブルは比較的高速です。 @Evg - 他の列がある場合は、そうする必要があります。そうでなければ、間違った答えを与えることができます。 –

+0

@RickJames、十分に公正。この例では、他の列は表示されないため、とにかく索引を扱います。しかし、私はそれが実際にはテーブルのこのシンプルではないと思われます。 –

0

理由は、あなたの第二の例では迅速なアクセスOR参照整合性(CONSTRAINT ... FOREIGN KEY ...

のいずれかを可能にすることで、他のテーブルが参照している場合、あなたは参照整合性のための適切なキーを持っていませんあなたのテーブルに。その場合、他の操作は非常に遅くなります。

いずれのケースでも、スピードの違いは小さすぎるとは言いませんが、適切な設計によって最初のアプローチが決まります。

0

最初の表は、各「サイト」内に多数の「グローバル」を表します。つまり、「多対1」の関係です。しかし、それを行うのは間違った方法です。代わりにGlobalsテーブルには、Sitesテーブルとの関係を表すカラムsite_idが必要です。一方、htmlcode_1の存在は非効率的な無駄です。

第2のテーブルは、「サイト」と「グローバル」との「多対多」関係を表している場合があります。これが本当に欲しいものなら、my tipsを見てください。グローバルからサイトにマップする可能性が高いため、別のインデックスが必要です。

関連する問題