我们有一个执行全表扫描的 SQL 查询:
DELETE
FROM oc_cart
WHERE (api_id > ? OR customer_id = ?)
AND date_added < DATE_SUB(NOW(), INTERVAL ? HOUR)
是否可以创建索引来优化此查询?
现在我已经创建了 2 个索引:
- 一个在 date_added
- 一对(添加日期、客户 ID 和 api_id)
但似乎查询仍在进行全盘扫描。
我们有一个执行全表扫描的 SQL 查询:
DELETE
FROM oc_cart
WHERE (api_id > ? OR customer_id = ?)
AND date_added < DATE_SUB(NOW(), INTERVAL ? HOUR)
是否可以创建索引来优化此查询?
现在我已经创建了 2 个索引:
但似乎查询仍在进行全盘扫描。
表中有多少行?什么SHOW CREATE TABLE
提供?
EXPLAIN SELECT ...`?
不可能对查询进行太多优化。
如果 api_id > ?
比 更具选择性date added < ...
,那么这可能是最好的:
DELETE
FROM oc_cart
WHERE api_id > ?
AND date_added < DATE_SUB(NOW(), INTERVAL ? HOUR);
DELETE
FROM oc_cart
WHERE customer_id = ?
AND date_added < DATE_SUB(NOW(), INTERVAL ? HOUR);
连同这两个索引:
INDEX(api_id, date_added)
INDEX(customer_id, date_added)
如果api_is not
有选择性,还添加
INDEX(date_added, api_id) (but _not_ INDEX(date_added))