1

以下のような2つのテーブルがあります

inv_ps
--------
inv_fkid  ps_fkid
1         2
1         4
1         5

other_table
----------
id   ps_fkid  amt  other_data
1     2       20   xxx
2     NULL    10   xxx
3     NULL    5    xxx 
4     5       6    xxx
5     4       7    xxxx

そしてここにクエリがあります

SELECT inv_ps.ps_fkid, ot.amt FROM invoice_ps inv_ps INNER JOIN other_table ot ON ot.ps_fkid = inv_ps.ps_fkid WHERE inv_ps.inv_fkid=1 GROUP BY inv_ps.ps_fkid

これは正常に動作しますが、EXPLAIN Sql を表示すると

id  select_type       table     type        possible_keys       key        key_len      ref         rows        Extra
1   SIMPLE           inv_ps     ref         inv_fkid,ps_fkid    inv_fkid      4     const            1            Using where; Using temporary; Using filesort
1   SIMPLE            ot        ref         ps_fkid             ps_fkid       5     inv_ps.ps_fkid  3227       Using where

これは3行のみをスキャンするはずですが、両方の結合列にインデックスを追加したにもかかわらず、なぜ3227行で検索しているのでしょうか? 列ot.ps_fkidがNULLに設定されたためですか?

説明してください

4

1 に答える 1

1

私のナレッジインデックスによると、それがカバリングインデックスGROUP BYである場合にのみ節で使用されます

covering indexs次の表で説明してみてください。

ALTER TABLE other_table ADD INDEX ix1 (ps_fkid, amt);
ALTER TABLE invoice_ps ADD INDEX ix1 (inv_fkid, ps_fkid);

SELECT a.ps_fkid, b.amt
FROM  (SELECT ps_fkid
       FROM invoice_ps
       WHERE inv_fkid = 1
       GROUP BY ps_fkid
      )a
      INNER JOIN other_table b
         ON a.ps_fkid = b.ps_fkid;
于 2012-08-16T11:27:35.653 に答える