遅いクエリを最適化しようとしています。コンピューターで実行するのに約 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」に依存しているため、結合に置き換えるのは難しいと感じます。