2

次のテーブルがあるとします。

create table table_a (
    id int,
    name varchar(25),
    address varchar(25),
    primary key (id)
) engine = innodb;

このクエリを実行すると:

select * from table_a where id >= 'x' and name = 'test';

MySQL はそれをどのように処理しますか? すべての id の最初 (1000 行を想定) をプルしてから、where 句 name = 'test' を適用しますか?

または、ID を探している間に、すでに where 句を同時に適用していますか?

4

5 に答える 5

2

id は PK (および名前にインデックスがない) であるため、id ベースの基準を満たすすべての行をメモリにロードした後、結果セットを名前基準でフィルター処理します。両方のフィールドを含む複合インデックスを追加すると、両方の基準を満たすレコードのみが読み込まれることになります。名前フィールドに個別の単一列インデックスを追加しても、インデックス マージ操作が行われない場合があります。この場合、インデックスは効果がありません。

于 2012-04-08T21:52:36.703 に答える
0

どちらかの列にインデックスがありますか?実行計画に影響を与える可能性があります。もう1つは、文字列比較ではなく数値比較を確実にするために'x'::intをキャストする場合があります。

于 2012-04-08T21:44:49.653 に答える
0

最良の結果を得るには、id 列と name 列の両方を含む単一のインデックスを作成する必要があります。

あなたの場合、そのクエリに対するプライマリ インデックスの影響についてはお答えできません。これは、DBMS とバージョンによって異なります。インデックスを増やしたくない場合 (インデックスを増やすと書き込みと更新が遅くなるため)、テーブルに 10.000.000 のようなランダムな結果を入力し、試して効果を確認してください。

于 2012-04-08T21:52:11.800 に答える
0

id が where 句で最初に来るときに最初にクエリを実行し、次に名前を交換して最初に持ってくることで、実行時間を比較できます。インデックスを使用した mysql のパフォーマンスの例を見るには、http://www.mysqlperformanceblog.com/2006/06/02/indexes-in-mysql/ をチェックしてください。

于 2012-04-08T22:03:51.430 に答える
0

クエリを実行することで、クエリの処理方法に関する情報を取得できEXPLAINます。

アイデアがそのクエリを最適化することである場合は、次のようなインデックスを追加することをお勧めします:

alter table table_a add unique index name_id_idx (name, id);

于 2012-04-08T21:57:51.220 に答える