どのインデックスを選択する必要がありますか(Mysql)

表:

CREATE TABLE `table1` (
  `f1` int(11) NOT NULL default '0',
  `f2` int(4) NOT NULL default '0',
  `f3` bigint(20) NOT NULL default '0',
  PRIMARY KEY  (`f1`)
) TYPE=MyISAM

クエリ:

select `f1` from table1 where `f2`=123 またはder by `f3` desc;

私はこのクエリのための "カバーインデックス"を作成したい

ALTER TABLE `table1` ADD INDEX (`f2`,`f3`,`f1`);

または

ALTER TABLE `table1` ADD INDEX (`f2`,`f1`,`f3`);

私はそれを選ぶべきですか?

2
彼らのどちらかがあなたを有意義な方法で助けてくれるかどうかは疑問です。
追加された 著者 NullUserException,
@NullUserExceptionఠ_ఠ私は有用だと確信していますが、私はどちらが良いか分かりません
追加された 著者 Koerr,

2 答え

最初の1つ。 MySQLはいずれかのインデックスを使用して、実際のテーブルから読み込むことなく結果セットを取得できます。最初の索引は、行を並べ替える余分な手順を実行する必要がないため、やや効率的です。

2
追加された
はい。最初の索引では、索引のWHERE句に一致する索引の部分を、追加の順序付けなしで順次読み取るだけで済みます。これは、クエリのパフォーマンスを向上させる最大の機会を提供します。
追加された 著者 Larry Lustig,

クエリでは、f2のみのインデックスが必要です。

"where f1 = 12 and f2 = 15"のようなwhere句を持つクエリの場合は、f1とf2のインデックスも できます。ただし、データと完全なクエリに応じて、主キーが結果をより速く提供することがあります。

3(where句内)にあるクエリがある場合は、3つのフィールドをカバーするインデックスが必要です。

15年後には、結果を注文するためだけにインデックスを作成する必要はありませんでした。この操作は非常に高速です。遅いのは、行の検索(where句)と、別のセットの一致(結合)です。

今確信が持てない場合は、両方を作成してください。 mysqlが使用するexplain_planを使ってクエリを実行して調べますか?その後、もう一方の^^をドロップします。

0
追加された
ええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ、あなたが言うように、条件の下では 非常に強力です。 ... 2月29日です。
追加された 著者 roselan,
filesortを避けるためのインデックスには f3 を追加し、インデックスをカバーするインデックスには f1 を追加します。 カバーインデックス:クエリを満たすために必要なすべてのデータを含む(またはカバーする)インデックスをカバーインデックスと呼びます。カバーインデックスは非常に強力なツールであり、パフォーマンスを大幅に向上させることができます。
追加された 著者 Koerr,