【发布时间】:2020-05-29 17:14:24
【问题描述】:
我们有下表
id # primary key
device_id_fk
auth # there's an index on it
old_auth # there's an index on it
还有下面的查询。
$select_user = $this->db->prepare("
SELECT device_id_fk
FROM wtb_device_auths AS dv
WHERE (dv.auth= :auth OR dv.old_auth= :auth)
LIMIT 1
");
请说明,我无法访问主客户端的服务器,但这里有另一个数据较少的客户端
由于在 auth 上有很多其他更新查询,更新查询开始被写入慢查询日志和 cpu 峰值
如果您从 auth 中删除索引,则选择查询会写入慢查询日志,但不会写入更新,如果您将索引添加到 device_id_fk,则没有区别。
我尝试使用 union 而不是 or 重写查询,但我被告知仍然存在 cpu 峰值,并且选择查询仍然写入慢查询日志
$select_user = $this->db->prepare("
(SELECT device_id_fk
FROM wtb_device_auths
AS dv WHERE dv.auth= :auth)
UNION ALL
(SELECT device_id_fk
FROM wtb_device_auths AS dv
WHERE dv.old_auth= :auth)
LIMIT 1"
);
");
解释
大多数情况下,这是慢查询日志中的唯一查询。是否有更优化的方式来编写查询?有没有更优化的方法来添加索引?客户端在运行 LAMP 的 centos 6 服务器上使用旧的 MariaDB 版本,相当于 MYSQL 5.5
附加信息
每当将索引添加到auth 时,都会记录到慢查询日志中的更新查询是
$update_device_auth = $this->db->prepare("UPDATE wtb_device_auths SET auth= :auth WHERE device_id_fk= :device_id_fk");
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。