2

遅いクエリを最適化しようとしています。コンピューターで実行するのに約 5 分かかりますが、サーバー (8 GB の RAM を搭載) ではほぼ同じ時間です。

SELECT
    buyer_id as bid,
    date_sold as dsold,
    (
        SELECT seller_id
        FROM sale
        WHERE buyer_id = bid
        ORDER BY date_acquired
        LIMIT 1
     ) as sid
from sale
WHERE seller_id = 3585328;

このクエリのテスト インデックスを作成しました。

| sale  |          1 | test                |            1 | buyer_id         | A         |     4900222 |     NULL | NULL   |      | BTREE      |         |
| sale  |          1 | test                |            2 | date_acquired    | A         |    14700667 |     NULL | NULL   |      | BTREE      |         |

説明を実行すると、

mysql> EXPLAIN SELECT buyer_id as bid,date_sold as dsold, (SELECT seller_id FROM sale WHERE buyer_id = bid ORDER BY date_acquired LIMIT 1) as sid from sale WHERE seller_id = 3585328;
+----+--------------------+-------+------+---------------+------+---------+-------+-------+------------------------------------------+
| id | select_type        | table | type | possible_keys | key  | key_len | ref   | rows  | Extra                                    |
+----+--------------------+-------+------+---------------+------+---------+-------+-------+------------------------------------------+
|  1 | PRIMARY            | sale  | ref  | test          | test | 8       | const | 12466 | Using index                              |
|  2 | DEPENDENT SUBQUERY | sale  | ref  | test          | test | 8       | func  |     3 | Using where; Using index; Using filesort |

サブクエリが遅い可能性があることは理解していますが、最適化する方法についてのアイデアが不足しています。重要かどうかはわかりませんが、buyer_id でグループ化すると、クエリの実行速度が大幅に向上します。サブクエリで「制限 1」に依存しているため、結合に置き換えるのは難しいと感じます。

4

2 に答える 2

0

ここでの目的が最新のsidもののみを取得することである場合。次のようなものを試してください:

SELECT
    t1.buyer_id AS bid,
    t1.date_sold AS dsold,
    t1.id AS sid
FROM
    sale AS t1
LEFT OUTER JOIN
    sale AS t2
    ON (t1.buyer_id = t2.buyer_id AND t1.date_acquired < t2.date_acquired)
WHERE t2.date_acquired IS NULL;
于 2013-02-18T10:31:16.160 に答える
0

まず、あなたの質問は奇妙に思えます。「buyer_id」を取得したいのですが、どこでbuyer_id = 3585328;

第二に、これがタイプミスであり、何か他のことをしたい場合のイベントです。ORDER BY date_acquired の場合、date_acquired にインデックスが必要です。

于 2013-02-18T10:25:32.700 に答える