以前にログに記録された価格の詳細と共にいくつかの製品を取得するクエリの最適化に苦労しています。
私の 3 つのサブクエリは、最後に記録された価格を返すために降順と制限 1 を使用し、ログ テーブルには数万行が含まれているため (長期的には数百万行が含まれる可能性があります)、クエリ結果を生成するための 5 秒の領域 (約 3000 の製品があります)。
SELECT products.*,
(SELECT value_new FROM log_actions
WHERE action='edit' AND target_entity='net_price_euro'
AND target_table='products'
AND target_id=products.product_id
ORDER BY log_time DESC LIMIT 1
) AS previous_net_price_euro,
(SELECT value_new FROM log_actions
WHERE action='edit' AND target_entity='retail_sterling'
AND target_table='products' AND target_id=products.product_id
ORDER BY log_time DESC LIMIT 1
) AS previous_retail_sterling,
(SELECT value_new FROM log_actions
WHERE action='edit' AND target_entity='gp'
AND target_table='products'
AND target_id=products.product_id
ORDER BY log_time DESC LIMIT 1
) AS previous_gp
FROM products
WHERE products.deleted IS NULL ORDER BY products.status asc
私が知る限り、関連するすべてのフィールドにインデックスが付けられています。上記で EXPLAIN を実行すると、次の結果が返されます。
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY products ALL deleted NULL NULL NULL 3192 Using where
4 DEPENDENT SUBQUERY log_actions ref target_entity,target_id,action,target_table target_id 4 products.product_id 4 Using where; Using filesort
3 DEPENDENT SUBQUERY log_actions ref target_entity,target_id,action,target_table target_id 4 products.product_id 4 Using where; Using filesort
2 DEPENDENT SUBQUERY log_actions ref target_entity,target_id,action,target_table target_id 4 products.product_id 4 Using where; Using filesort
デスクインデックスを追加するとパフォーマンスが向上する可能性があることを読みましたが、さらに読むと、MySQL は現在これをサポートしていないようです。