Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在3列上创建索引的最佳方法是什么?如果可能的话?_Mysql_Indexing_Mariadb 10.3 - Fatal编程技术网

Mysql 在3列上创建索引的最佳方法是什么?如果可能的话?

Mysql 在3列上创建索引的最佳方法是什么?如果可能的话?,mysql,indexing,mariadb-10.3,Mysql,Indexing,Mariadb 10.3,我们有一个SQL查询正在执行完整表扫描: 删除 从oc_车 其中(api\u id>?或客户\u id=?) 添加日期?比添加日期更具选择性,那么这可能是最好的: 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 &

我们有一个SQL查询正在执行完整表扫描:

删除
从oc_车
其中(api\u id>?或客户\u id=?)
添加日期
是否可以创建索引来优化此查询

目前,我创建了两个索引:

  • 添加了一个日期为的
  • 一个在(添加日期、客户id和api id)

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

表中有多少行?
SHOW CREATE TABLE
提供了什么
解释选择…`

不可能对查询进行太多优化

如果
api\u id>?
比添加日期更具选择性,那么这可能是最好的:

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);
如果
api\u不是选择性的,也可以添加

INDEX(date_added, api_id)  (but _not_ INDEX(date_added))

添加日期的索引是多余的。(我想我说得对)另一个索引只能部分使用。如果(date\u added,customer\u id)没有帮助,请尝试(date\u added,api\u id),并尝试围绕索引顺序进行交换。你可以采取更科学的方法,但这里的排列太少了,以至于“吸一口,看一看”会更快
INDEX(date_added, api_id)  (but _not_ INDEX(date_added))