2

クエリで EXPLAIN を実行した後:

explain 
select name from t1 where name like '%smthing%'
UNION ALL
select name from t2 where name like '%smthing%'
UNION ALL
select name from t3 where name like '%smthing%'
UNION ALL
select name from t4 where name like '%smthing%'

4 つのテーブルの UNION によって構成され、次のようになります。

 id  select_type   table         type    possible_keys  key     key_len  ref         rows  Extra                   
 1  PRIMARY       t1             index   (NULL)         name    152      (NULL)      337  Using where; Using index
 2  UNION         t2             index   (NULL)         name    152      (NULL)    3842  Using where; Using index
 3  UNION         t3             index   (NULL)         name    452      (NULL)     204  Using where; Using index
 4  UNION         t4             index   (NULL)         name    452      (NULL)    8269  Using where; Using index
(NULL)  UNION RESULT  <union1,2,3,4>  ALL     (NULL)         (NULL)  (NULL)   (NULL)  (NULL)  

ユニオンの各コンポーネントを説明すると、型は「INDEX」ですが、ユニオン結果の型は「ALL」です。この動作の理由はどれですか? ありがとう

4

1 に答える 1

3

UNION の代わりに UNION ALL を使用してみてください。そうしないと、MySQL は重複する行を削除しようとします (結果セットを見ているため、おそらくテーブルのインデックスを差し引いたものになります)。

また、UNION の結果に ORDER BY または WHERE 句がありますか? 繰り返しますが、これはテーブル レベルではなく、結果セットに対して実行されます。

于 2009-04-27T12:49:01.577 に答える