2017-03-24 51 views
1

を実行するために13分を要し、と私はMySQLのクエリは、私は3つのテーブルを持っている

  • orders下のコードを使用してそれらを結合してい30K行
  • orders_detailsを持って100kの行を超える
  • servicesは4行
  • を持っています

Fish Database.netのスクリプトを実行すると、結果を表示する前に13分以上実行されます。

select 
    `o`.`created` AS `created`, 
    sum(`o`.`total`) AS `total`, 
    sum(`o`.`paid`) AS `paid`, 
    `od`.`service_id` AS `service_id`, 
    `s`.`name` AS `grp` 
from ((`orders` `o` 
    left join `orders_details` `od` on 
    (
     (`od`.`order_id` = `o`.`id`) 
    )) 
    left join `services` `s` on 
    (
     (`s`.`id` = `od`.`service_id`) 
    )) 
group by 
    `od`.`service_id`, 
    `o`.`created`, 
    `s`.`name` 
order by 
    `o`.`created` 
  • idを持つすべての列名が作成され、整数主キー列
  • ある支払わ日時列
  • 合計は、(10,2)列
  • 小数ですされている名前はVARCHAR(60 )列

説明結果は

です

EDITS

id select_type table type possible_keys key key_len ref rows Extra 

1 SIMPLE o ALL NULL NULL NULL NULL 23558 Using temporary; Using filesort 
1 SIMPLE od ALL NULL NULL NULL NULL 40304 
1 SIMPLE s eq_ref PRIMARY PRIMARY 4 mydb.od.service_id 1 

私は私改善/ボトルネックを見つけることができます?

+2

は私たちに 'order_id'、' service_id'、 'created'と' name'のまだ行っていない場合は必要に応じ –

+1

外部キーにインデックスを追加してみてください。しかし、上記のクエリーの 'explain'はもっと分析するのに役立ちますので、説明の結果を質問に投稿してください。 –

+0

可能性指標を使用したインデックスを参照するクエリのEXPLAINを示し –

答えて

2

(役に立たない)()ネストされたが(unseful削除してみてください その後、パフォーマンスを低下させることができますを使用)
は、あなたが正しいod.order_idのインデックス、o.id、s.idを持っていることを確認してください、

をod.service_id私はまたbackticsを削除した、より良い読書のための
select 
    o.created AS created, 
    sum(o.total) AS total, 
    sum(o.paid) AS paid, 
    od.service_id AS service_id, 
    s.name AS grp 
    from orders o 
    left join orders_details od on od.order_id = o.id 
    left join services s on s.id = od.service_id 
    group by 
    od.service_id, 
    o.created, 
    s.name 
    order by 
    o.created 

..あなたがresersved言葉はそれほど必要とすべきではないマルチ言葉の列名をODはありません)

0

SQLスクリプトのボトルネックを見つけるためのステップがあります。

  1. まず、実行計画とクエリ統計を調べます。
  2. 実行計画によってボトルネックがどこにあるかがわかります。
  3. 問題に応じて、インデックスを作成し、再度実行計画を調べます。
  4. 必要に応じて改ページを適用します。バッチでデータを送信することで違いが生まれます。
関連する問題