Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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中的多个where或slow_Mysql_Sql - Fatal编程技术网

mysql中的多个where或slow

mysql中的多个where或slow,mysql,sql,Mysql,Sql,我有一个名为logs的表,我在其中存储模型的更改。该表当前包含55000条记录 日志表 id: int(10) model: varchar(191) model_key: varchar(191) backend_user_id: int(10) changes: TEXT created_at: TIMESTAMP updated_at: TIMESTAMP 索引:在日志上创建索引ix1(型号、型号密钥、更新日期) 我要执行的查询需要0.080秒: 从日志中选择*` 其中(`model`=

我有一个名为
logs
的表,我在其中存储模型的更改。该表当前包含55000条记录

日志表

id: int(10)
model: varchar(191)
model_key: varchar(191)
backend_user_id: int(10)
changes: TEXT
created_at: TIMESTAMP
updated_at: TIMESTAMP
索引:
在日志上创建索引ix1(型号、型号密钥、更新日期)

我要执行的查询需要0.080秒:

从日志中选择*`
其中(`model`=“Oms\\Core\\Models\\Order”和`model\u key`=13763)
或(`model`=“Oms\\Core\\Models\\Customer”和`model\u key`=13761)
或(`model`=“Oms\\Core\\Models\\OrderRow”和`model\u key`=13764)
或(`model`=“Oms\\Core\\Models\\Address”和`model\u key`=13763)
订单由“更新”在“描述限制8偏移量0”
解释问题:


如何加速此查询?

要提高性能,可以添加以下索引:

create index ix1 on logs (model, model_key, updated_at)

MySQL不像处理
条件那样处理
条件;但是对中的
进行了一些优化,这些优化可以用来代替某些或条件。除了已经建议的复合索引外,您还可以修改您的WHERE,如下所示:

WHERE (`model`, `model_key`) IN (
    ('Oms\\Core\\Models\\Order', 13763)
   , ('Oms\\Core\\Models\\Customer', 13761)
   , ('Oms\\Core\\Models\\OrderRow', 13764)
   , ('Oms\\Core\\Models\\Address', 13763)
)

此外,从您显示的数据来看,
model\u key
始终是一个整数值;如果总是这样,我建议使用更合适的类型(如INT),因为字符串比较通常比INT比较昂贵。

1)是否需要所有列
SELECT*
?2) 您是否有关于型号和型号索引的索引?当您运行
EXPLAIN
时,它使用的是什么执行计划?您是有一个组合索引,还是每个字段都有单独的索引?在解释的可能_键中可见的名称表明了后者。有一点不同。@uuerdo我现在已经在所有三个字段上添加了一个组合索引,现在查询将在0.080秒后执行。我还是希望它更快一些,是不是可能?顺便说一下,INT声明(或TINYINT、BIGINT等)后面括号中的数字几乎没有意义,也可以省略。通过这个索引,我得到的结果是0.080秒,这是mysql处理这个查询的最快速度吗?我用你索引的新结果更新了我的问题。@Jacob这看起来还不错。“估计筛选行”为34。然后只需要对它们进行排序并保留前8个。现在,这只是“估计”;现实可能不同。你的建议将持续时间降低到0.062秒:),也许它不能像我希望的那样快。类型并不总是
INT
,这就是为什么
model\u key
是varchar。