2

ビューを使用するクエリがいくつかありますが、関連するすべてのテーブルにインデックスが付けられている場合(とにかくそれほど大きくない場合)、これらのクエリの実行速度は予想よりもはるかに遅くなります。

私はこれを説明できることを願っています:

私のメインクエリは次のようになります(大幅に簡略化されています)

select [stuff] from orders as ord 
left join calc_order_status as ors on (ors.order_id = ord.id)

calc_order_statusこのように定義されたビューです。

create view calc_order_status as
select ord.id AS order_id,
(sum(itm.items * itm.item_price) + ord.delivery_cost) AS total_total
from orders ord 
left join order_items itm on itm.order_id = ord.id
group by ord.id

Orders(ord)には注文がorder_items含まれ、各注文に関連付けられた個々のアイテムとその価格が含まれます。

すべてのテーブルは適切にインデックス付けされていますが、実行速度が遅く、EXPLAINを実行すると次のようになります。

  # id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
  1 1 PRIMARY ord ALL customer_id NULL NULL NULL 1002 Using temporary; Using filesort 
  2 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 1002   
  3 1 PRIMARY cus eq_ref PRIMARY PRIMARY 4 db135147_2.ord.customer_id 1 Using where 
  4 2 DERIVED ord ALL NULL NULL NULL NULL 1002 Using temporary; Using filesort 
  5 2 DERIVED itm ref order_id order_id 4 db135147_2.ord.id 2   

私の推測では、「派生2」はビューを指します。個々のアイテム(itm)は正常に機能しているようで、order_idでインデックス付けされています。問題は行#4のようです。これは、システムが注文テーブル(ord)のキーを使用していないことを示しています。ただし、MAINクエリでは、注文IDはすでに定義されています。左結合calc_order_status as ors on(ors.order _ id = ord.id)およびord.id(メインクエリとビュー内の両方)が主キーを参照します。

私は、MySQL simpliyがビューをうまく最適化せず、利用可能な場合でも特定の条件下でキーを利用しない可能性があることをどこかで読みました。これはそのようなケースの1つと思われます。

何か提案をいただければ幸いです。MySQLに「思ったよりも簡単です。主キーを使用するだけで大​​丈夫です」と強制する方法はありますか?それとも、ビューはこれについてまったく間違った方法ですか?

4

2 に答える 2

4

それらの結合を削除することが可能である場合は、それらを削除してください。それらをサブクエリに置き換えると、大幅に高速化されます。

このようなものを実行して、速度に違いがあるかどうかを確認することもできます。

select [stuff] from orders as ord 
left join (
  create view calc_order_status as
  select ord.id AS order_id,
  (sum(itm.items * itm.item_price) + ord.delivery_cost) AS total_total
  from orders ord 
  left join order_items itm on itm.order_id = ord.id
  group by ord.id
) as ors on (ors.order_id = ord.id) 
于 2009-06-24T17:09:33.380 に答える
0

インデックスは、大きなテーブルでいくつかの行を見つけるのに役立ちますが、すべての行をクエリする場合、インデックスは速度を低下させるだけです。したがって、ここで MySQL はおそらく [order] テーブル全体を使用することを想定しているため、インデックスを使用しない方がよいでしょう。

MySQL にインデックスを強制的に使用させることで、より高速になるかどうかを試すことができます。

from orders as ord force index for join (yourindex)
于 2009-06-20T11:14:37.990 に答える