web-dev-qa-db-ja.com

行が返されない場合のクエリの最適化

私は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 ),
 )
1
Ali

このクエリに最適なインデックスは(u1_id, t)です。

私の最初の推測は正しかった、あなたは(t)だけと(u1_id)だけにインデックスを持っている。正確なEXPLAIN出力(使用されるインデックス)を教えていないので、最も可能性の高い説明は、mysqlがこれらの既存のインデックスの1つを使用するか、まったく使用しないことを選択していることです(フルスキャンを実行します)表)、これはそれほど効率的ではない計画をもたらします。

2
ypercubeᵀᴹ