2016-07-25 14 views
1

私には得られないMySQLのパフォーマンス上の問題があります。単純な選択クエリのMySQLパフォーマンスの問題

このクエリでは、ほとんどの場合、実行に1秒かかりますが、5分以上かかることがあります。

SELECT sb.id AS id, sb.name AS name, 
ROUND(sb.dkprice/100, 0) AS price, bs.name AS shopname, country 
    FROM shopbikes sb, categoriesshopbikes csb, shops s 
    WHERE sb.id = csb.`shopbikeid` 
     AND csb.categoryid = 93 
     AND sb.brand = 'Ghost' 
     AND dkprice > 0 
     AND sb.dkprice IS NOT NULL 
     AND sb.`shopid` = s.id 
    ORDER BY dkprice 
    LIMIT 1 

時々、これらのクエリのうちの5〜8個が異なるブランドで同時に実行されていることがあります。

私はSHOW FULL PROCESSLISTを実行すると、これらのクエリのいくつかが実行中であり、そのうちのいくつかが長時間(数分間)実行されていることがわかります。

クエリ内のテーブルはすべて、すべての関連する列(つまり、テーブルが一致する列)のインデックスを持っています。テーブルの

サイズ:

  • shopbikes =60万行
  • = 100,000行
  • categoriesshopbikes
  • ショップ= 100行

間違って何が起こっていると私は修正することができますどのように任意のアイデアそれ?


アップデート:私は、明示的にクエリを変換した参加:

SELECT sb.id AS id, sb.name AS NAME, 
ROUND(sb.dkprice/100, 0) AS price, s.name AS shopname, country 
    FROM shopbikes sb 
    JOIN categoriesshopbikes csb ON (sb.id = csb.shopbikeid) 
    JOIN shops s ON (sb.shopid = s.id) 
    WHERE csb.`categoryid` = 93 
     AND sb.`brand` = 'Cannondale' 
     AND dkprice > 0 
     AND dkprice IS NOT NULL 
    ORDER BY dkprice 
    LIMIT 1 

それは助けにはなりませんでした。依然としてクエリの実行にはしばしば時間がかかります。


出力についての説明:http://i.imgur.com/kfMPBrd.png

+0

サイドノート:明示的な結合構文(別名ANSI結合)は長年にわたり使用されています(MySQLはこれを最初からサポートしている可能性があります)。私はそれがクエリの読みやすさをより読みやすくするので、試してみることをお勧めします。 –

+0

「SHOW FULL PROCESSLIST」出力にリストされている遅いクエリを投稿してください。 –

+0

'EXPLAIN'の出力はどこですか?どのストレージエンジンについて話していますか?あなたのMySQLはサーバリソースを適切に利用できるようにチューニングされていますか?'EXPLAIN'(それが何であるかわからない場合は同様のmysql質問をチェックします)、使用しているストレージエンジン、問題の各テーブルとMySQLの' SHOW CREATE TABLE'の出力を提供する必要があります構成。その後、ボトルネックとそれをどのように並べ替えるかを決定するのに十分な情報が得られます。 – Mjh

答えて

1

を助けることを推測しています。 categoriesshopbikesが多対多のマッピングテーブルである場合は、すべての推奨事項に従いましたhere

sbの順に、INDEX(brand, dkprice)が必要です。

私はAND dkprice IS NOT NULLAND dkprice > 0と重複していると思います。

+0

あなたが言及しているインデックスを追加すると、問題が修正されたようです。 – Louisa

+0

完璧に動作します。ありがとう! – Louisa

0
FROM shopbikes sb, categoriesshopbikes csb, shops s 

私はクエリプランを見ていると思いますが、私はこの行が問題だと思います。この種のFROM節は、リストされたテーブル(すなわち、600k×100k×100行)からデカルト積を生成するであろう。

私は適切なJOIN句はいずれの順序でINDEX(shopbikeid, category_id)を必要とcsb

FROM shopbikes sb JOIN categoriesshopbikes csb ON (sb.id = csb.shopbikeid) JOIN shops s ON (sb.shopid = s.id) 
+0

ありがとうございます。私は上のアップデートに示されているようにクエリを編集しました。パフォーマンスは向上しませんでした。 – Louisa

関連する問題