2016-05-19 8 views
0

を実行するクエリに参加:Countは、私はこれらすべてのテーブルには約140KのRAW持って長い時間

SELECT COUNT(DISTINCT p.product_id) AS total 
FROM bh_product p 
LEFT JOIN bh_product_description pd ON (p.product_id = pd.product_id) 
LEFT JOIN bh_product_to_store p2s ON (p.product_id = p2s.product_id) 

を、それは正常です。このクエリの実行には、約3秒かかりますか?
すべてのテーブルにproduct_idフィールドのインデックスがあります。
何とか改善できますか? 元のクエリ:更新

SELECT COUNT(DISTINCT p.product_id) AS total 
FROM bh_product p 
LEFT JOIN bh_product_description pd ON (p.product_id = pd.product_id) 
LEFT JOIN bh_product_to_store p2s ON (p.product_id = p2s.product_id) 
WHERE pd.language_id = '2' 
AND p.status = '1' 
AND p.date_available <= NOW() 
AND p2s.store_id = '0' 
AND (
pd.name LIKE '%душевые%' 
OR pd.tag LIKE '%душевые%' 
OR LCASE(p.model) = 'душевые' 
OR LCASE(p.sku) = 'душевые' 
OR LCASE(p.upc) = 'душевые' 
OR LCASE(p.ean) = 'душевые' 
OR LCASE(p.jan) = 'душевые' 
OR LCASE(p.isbn) = 'душевые' 
OR LCASE(p.mpn) = 'душевые' 
) 

を更新しましたそれはそれは、SQL処理を遅くして、サーバが他の集約的なプロセスを実行していたことを考え出しました。 他のプロセスの電源をオフにした後、許容可能になります。

+0

あなたは 'p.product_id'列に対するインデックスを持っているのですか? – Alex

+0

@Alexはい、すべてのテーブルにPRIMARY、BTREE – Sol

+0

というインデックスが付けられています。これは非常に奇妙なスキーマです。なぜ3つのテーブルに同じ 'PRIMARY'キーが必要ですか? – Alex

答えて

0

のようなクエリを実行しようとしていると思う:

SELECT COUNT( 
    DISTINCT p.product_id) AS total 
FROM bh_product p 
INNER JOIN bh_product_description pd 
ON p.product_id = pd.product_id 
    AND pd.language_id = 2 
INNER JOIN bh_product_to_store p2s 
ON p.product_id = p2s.product_id 
    AND p2s.store_id = 0 
WHERE p.status = '1' 
AND p.date_available <= NOW() 
AND (
pd.name LIKE '%душевые%' 
OR pd.tag LIKE '%душевые%' 
OR 'душевые' IN (p.model , p.sku , p.upc , p.ean , p.jan , p.isbn , p.mpn)) 

しかし、ここではあなたの最も弱いポイントは、あなたのWHERE句です。どこでも検索しようとしています。それはあまりスマートではありません。 p.eanはバーコードで、p.isbnと同じにはなりません。душевыеと同じではないと確信しています。したがって、本当に必要なことだけを行うようにクエリを変更する必要があります。しかし、 "魚を捕まえる"という希望ですべてをフィルタリングしないでください。

更新チェックこのクエリ(はるかに高速あなたの第一1、その後でなければなりません):

SELECT COUNT( 
    DISTINCT p.product_id) AS total 
FROM bh_product p 
INNER JOIN bh_product_description pd 
ON p.product_id = pd.product_id 
    AND pd.language_id = 2 
INNER JOIN bh_product_to_store p2s 
ON p.product_id = p2s.product_id 
    AND p2s.store_id = 0 
+0

ok、少しは分かりますが、なぜもっとも単純なクエリがWHEREの実行が遅いのですか? "私はこの理由がないテーブルに参加していてもかなり高速だと思います。 質問の最初のクエリは3分実行されます。 – Sol

+0

既存のインデックスを使用していないためです。私の更新をチェック.. – Alex

2

あなたがleft joinを使用している場合left joinがあなたのproduct_idで何をフィルタリングすることができなかったので、あなたの結果は

select count(distinct p.product_id) as total 
from bh_product p 

と同じになります。

+0

私は追加されたテーブルをフィルタリングしました。テストクエリ。私はなぜ実行に時間がかかるのか分かりません。 – Sol

+1

あなたの本当の質問を提供してください。なぜなら、これはあまり巧妙ではないからです。なぜなら、あなたは理由のないテーブルに参加していてもかなり速いと思います。 – Alex

+0

実際にデータをフィルタリングする場合は、内部結合を使用する必要があります。 –

-1

私はあなたがこのクエリから開始することができますが、この

SELECT COUNT(DISTINCT p.product_id) AS total 
FROM bh_product p ,bh_product_description pd,bh_product_to_store p2s where 
p.product_id = pd.product_id and p.product_id = p2s.product_id ; 
+0

私は最初の投稿と同じクエリを実行します... – Sol

関連する問題