0

私は、すべての行に特定のクラスがあるかなり大きなデータベースを使用しています。すべてのクラスは、個別のテーブルで指定されている一般化されたクラスに属します。したがって、アイテムの一般化されたクラスを見つけるには、JOINを実行する必要があります。

また、列の1つには、「w」などの特定の数値が含まれています。一般化されたクラスによってグループ化された、「w」の特定の範囲内のアイテムの数を与える効率的なクエリを見つけようとしています。したがって、たとえば、結果行の1つは、w <500、500 <w <1500、およびw>1500のそのクラスのアイテム数の内訳を示します。

現在、一般化されたクラスを結果セットにすでに結合している既存のビューを使用しているため、最終的なクエリでJOINを実行する必要はありません。その最後のクエリは、ここで見つけたトリックを使用して、特定の範囲内のアイテムの量を計算します。

SELECT generalized_class, 
    SUM(IF(w BETWEEN 1 AND 500, 1, 0)) AS low, 
    SUM(IF(w BETWEEN 500 AND 1500, 1, 0)) AS middle,
    SUM(IF(w > 1500, 1, 0)) AS high
FROM table_vw
GROUP BY generalized_class

ただし、これが最も効率的な方法であるかどうかはよくわかりません。データベースはかなり大きいため、全体が完了するまでに5分以上かかります。この種の計算は一般的にコストのかかる操作だと思いますが、負荷を軽減する別のアプローチを使用できるかどうか疑問に思っています。誰?

-編集-ビューの定義は見事なものではなく、次のようなものです。

CREATE VIEW table_vw AS SELECT d.id, d.class, c.generalized_class, <more fields>, 
(w_high/w_low)/2 AS w
FROM base_table d
LEFT OUTER JOIN secondary_table c   
    ON (d.class = c.class)

別のテーブルに対してもう1つ左外部結合が行われていることは確かですが、そのテーブルの行は使用されていません(前述したように、これは既存のビューであるため、調整されていないものがたくさんありますこのクエリの場合)。結合行'class'は、セカンダリテーブルでのみインデックス付けされます。

4

1 に答える 1

1

クエリの実行に非常に時間がかかる理由は、インデックスが適切に使用されていない(またはインデックスをまったく使用していない)ためである可能性があります。EXPLAINを使用して、MySQLがクエリを実行する方法を確認します。
http://dev.mysql.com/doc/refman/5.5/en/explain.html

もう1つの理由は、MySQLが最初にビューの結果全体を計算し、次にそれを使用してクエリ全体の結果を計算することである可能性があります。
その場合の解決策は、ビュー定義をクエリとマージすることです。

于 2012-06-05T13:48:28.080 に答える