0

次のクエリがあります。

SELECT  p2c.pid AS productNumber,
        p.name AS productName
    ,   (
            SELECT COUNT(*)
            FROM   products2customers
            WHERE  pid = p2c.pid
        ) AS registered
    ,   (
            SELECT COUNT(*)
            FROM   products2customers
            WHERE  pid = p2c.pid
               AND date_add(from_unixtime(purchased), INTERVAL 5 YEAR) >= CURDATE()
        ) AS inWarranty
    ,   (
            SELECT COUNT(*)
            FROM   products2customers
            WHERE  pid = p2c.pid
               AND date_add(from_unixtime(purchased), INTERVAL 5 YEAR) < CURDATE()
        ) AS outOfWarranty
    ,   (
            SELECT DATE_FORMAT( MAX( from_unixtime(purchased) ), '%d.%m.%Y')
            FROM   products2customers
            WHERE  pid = p2c.pid
        ) AS lastPurchased
    ,   (
            SELECT DATE_FORMAT( date_add( MAX( from_unixtime(purchased) ), INTERVAL 5 YEAR), '%d.%m.%Y')
            FROM   products2customers
            WHERE  pid = p2c.pid
        ) AS warrantyUntil
FROM    (
            SELECT DISTINCT
                p2c.pid
            FROM
                products2customers p2c
        ) AS p2c
JOIN
    products p
ON
    p.id = p2c.pid
ORDER BY
    inWarranty DESC

クエリは、25.000 行のデータベース テーブルで実行されます。このクエリの実行時間は約 40 秒です。結果はウェブページに表示されるので、結果が出るまで 40 秒も待つのはあまり良くありません。

このクエリを実行して出力を保存する方法はありますか? このクエリを毎晩実行すれば十分だからです。

これを行うための最良の方法は何ですか? cronjob を作成してこのクエリを実行し、結果をデータベースに書き込む必要がありますか? それとももっと良い方法がありますか?

または、このクエリを最適化して高速化できますか?

4

3 に答える 3

1

Explain Planインデックスを作成することで速度を上げることができる部分があるかどうかを確認することから始めてください。

于 2013-10-25T06:53:52.233 に答える
1

これをcronジョブに入れます:

CREATE TABLE products_warrany SELECT p2c.pid AS productNumber, ...

元の長いクエリの代わりに、後で次のクエリを使用します。

SELECT * FROM products_warrany ORDER BY ...

また、追加のフィルタリング、順序付けなどを実行する機能も得られます。参照。

于 2013-10-25T06:56:07.400 に答える