2016-03-21 3 views
2

以下は私のクエリユニオンは、クエリをより効率的にするために代わりに使用します。 MySQLの

Select 
count(t.prid) 
from 
(select 
    pr.prid 
from 
    jcp 
inner join pr ON pr.prid = jcp.prid 
where 
    jcp.custid = 123 union select 
    pr.prid 
from 
    jcl 
inner join pr ON pr.prid = jcl.prid 
where 
    jcl.custid = 123) as t 

それをより効率的にするどのような方法があるのですか?このクエリはある機能の中にあり、1000秒間実行されます。とてもゆっくりとしています。

+0

テーブルがありますか?custidは主キーですか? – Derenir

+0

[sqllfiddle](http://sqlfiddle.com/)のようなあなたのテーブルとあなたの目標を説明するだけで便利です! 、より単純なクエリを発見することさえできます。 – Arash

+0

jcpとjclから別々のカウントを取得して、それらをphp(または関数の言語に関係なく)で一緒に追加する方が早いかもしれません。2つの非常に高速なクエリは、悪い結合を持つものよりも優れたパフォーマンスを発揮します。 – AntonChanning

答えて

0

まず、あなたのクエリは2つの非常に異なるタイプのデータを結合しているように見えます。最初の部分はIDの数であり、2番目の部分はリテラルIDです。あなたが書いたとおりにすることを意図したことを本当にやっています。しかし、次のように、単に額面でそれを取って、あなたが最初の部分でサブクエリを排除することができる:

SELECT COUNT(pr.prid) 
FROM jcp 
    INNER JOIN pr 
    ON pr.prid = jcp.prid 
WHERE jcp.custid = 123 

私はあなたのデータのコンテキストを知らなくても、あなたのパフォーマンスを助けるだろうとどのくらいと言うが、それはできません確かに傷ついていないだろう。

2つのデータセットの違いを考慮すると、これらの2つの異なるビットのデータを同じ列に強制したい場合、結合を避けることはできません。もしあなたがそれらを別々の列に入れるなら、おそらく組合を避けることができます。

関連する問題