私はexplainを使用して、クエリで何が起こっているのかを把握しています。
explain select t from c where u1_id = 1 group by t;
結果セットのExtra列に「Usingwhere」と表示されます。ただし、これは、有効なu1_idを使用した場合にのみ発生します。したがって、同じサーバー上で無効なu1_idを使用して同じクエリを実行すると、Extraで「Using where; Usingtemporary; Using filesort」が表示されます。カラム。
これは、user_idがテーブルにない場合、MySQLが別のルートを使用してクエリを処理することを意味すると思います。なぜこれが起こるのか、どうすればこれを防ぐことができるのか誰かが知っていますか?
[〜#〜]編集[〜#〜]
これが私のテーブルです:
CREATE TABLE c (
pk int(11) NOT NULL AUTO_INCREMENT,
u1_id int(10) unsigned NOT NULL,
u2_id int(10) unsigned NOT NULL,
s decimal(11,5) NOT NULL DEFAULT ''0.00000'',
date datetime NOT NULL,
f decimal(11,5) NOT NULL,
t enum(''F'',''P'') ,
ti decimal(11,5) DEFAULT ''0.00000'',
ts decimal(11,5) DEFAULT ''0.00000'',
latest tinyint(1) DEFAULT ''0'',
sc decimal(11,5) DEFAULT ''0.00000'',
p_id int(10) unsigned NOT NULL,
PRIMARY KEY ( pk ),
KEY i1 ( u1_id ),
KEY i2 ( u2_id ),
KEY i3 ( u1_id , u2_id ),
KEY i4 ( sc ),
KEY i5 ( sc , u2_id , latest ),
KEY i5 ( p_id ),
KEY i8 ( ti ),
KEY i9 ( t ),
KEY i10 ( p_id , u1_id , latest , t ),
)
このクエリに最適なインデックスは(u1_id, t)
です。
私の最初の推測は正しかった、あなたは(t)
だけと(u1_id)
だけにインデックスを持っている。正確なEXPLAIN
出力(使用されるインデックス)を教えていないので、最も可能性の高い説明は、mysqlがこれらの既存のインデックスの1つを使用するか、まったく使用しないことを選択していることです(フルスキャンを実行します)表)、これはそれほど効率的ではない計画をもたらします。