0

我们有一个执行全表扫描的 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)

但似乎查询仍在进行全盘扫描。

4

1 回答 1

0

表中有多少行?什么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))
于 2020-11-20T22:42:53.767 回答