2016-03-20 23 views
-1

私はこのMySQLクエリを持っています。レコードがたくさんあるので、これは非常に遅くなります。ソフトウェアを使用するコンピュータ(キャッシュレジスタ)もそれほど強力ではありません。 同じ結果を得る方法はありますか?本当に助けに感謝しますか?MySQLクエリ - 高速ですか?

SELECT d.sifra, COUNT(d.sifra) AS pogosti, c.*, s.Stevilka as Stev_sk FROM Cenik c, dnevna d, Podskupina s 
WHERE d.sifra = c.Sifra AND d.datum >= DATE(DATE_SUB(NOW(),INTERVAL 3 DAY)) 
GROUP BY d.sifra ORDER BY pogosti DESC limit 27 
+0

sとのクロスジョインはどのようなポイントですか?あなたは結合を交差させることができず、sの行数を掛けるだけで、同じ数が得られます。 – maraca

+0

より具体的な回答を得るには、関係するテーブルの定義と関連するサンプルデータを提供してください。 – trincot

+0

単純なルール:*決して* 'FROM'句でカンマを使用します。 *常に*明示的な 'JOIN'構文を使用します。 –

答えて

0

あなたはインデックスを試みたことがありますか?

あなたはおそらく

CREATE INDEX Cenik_Sifra ON Cenik(Sifra); 

をしたいので、また、あなたはdnevnaからデータムとシフラーを使用して、データがあなたのSELECTですので、

CREATE INDEX dnevna_ndx ON dnevna(datum, sifra); 

最後にあります、WHEREでc.Sifraを使用していますPodskupinaにJOIN条件はありません。いつStevilkaを描きますか?これは一定のテーブルですか?それは、Podskupinaの行数をカウントしているだけで、1行しかない場合を除いて、不特定の値を取得していることになります。 MySQLの一部のバージョンでは

あなたはまた、データムを事前に計算して利益を見つけるかもしれない:

SELECT @datum := DATE(DATE_SUB(NOW(), INTERVAL 3 DAY)) 

、その後、クエリで@datum使用。これにより、インデックス付きのパフォーマンスが向上する可能性があります。

関連するテーブルの構造とカーディナリティについて詳しく知ることなく、行うことはほとんどありません。

非常に少なくとも、あなたは質問に

EXPLAIN SELECT...(your select) 

の結果を掲示する必要があります。

+0

私はこれを逃した方法を知らないけど、あなたが言ったように、すでに日付をあらかじめ計算しておくと、大きな違いができました!今すぐ十分速い! 問題は、ボタンをポピュレートするループでクエリが使用されているため、超低速です。とにかく、助けてくれてありがとう! – thor43

0

あなたはPodskupinaに参加するための条件がなく、クロスジョイント(全部すべて)を取得するので、「d.sifra = c.Sifra」というx行をPodskupinaのy行と乗算します

0

これは非常に問題のあるクエリのようです。あなたは本当にc。*のすべてを返す必要がありますか?そしてPodskupinaでの結合やフィルターはどこにありますか?クエリを締めたら、テーブルに適切なインデックスが作成されていることを確認してください。たとえば、一意のIDにクラスタード・インデックスがあると仮定した場合、パフォーマンスは通常、sifraおよびdatum列にセカンダリ・インデックスを置くことでパフォーマンスが向上します。

関連する問題