mysql - 为什么我的 UPDATE 查询在 2200 万行中很慢
问题描述
我正在开发自己的广告系统,显示的每个横幅都会在数据库中插入一条记录(用于统计)。其中一个值是广告是否正在显示。然后当您离开页面时,它会更新该行并将值设置为 0。在 400 万左右的旧表上大约是 0.1 秒。
由于某种原因,查询计时器高于 1 秒
数据库结构:
CREATE TABLE `ad_views` (
`id` int(11) NOT NULL,
`datetime` datetime NOT NULL,
`visitor_id` varchar(30) NOT NULL,
`campagne_id` int(5) NOT NULL,
`banner_id` int(5) NOT NULL,
`position_id` int(5) NOT NULL,
`device` varchar(1) NOT NULL,
`seen` tinyint(1) NOT NULL,
`on_page` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `ad_views`
ADD PRIMARY KEY (`id`),
ADD KEY `visitor_id` (`visitor_id`);
需要很长时间的SQL:
UPDATE `ad_views` SET on_page = 0 WHERE visitor_id = 102577047
我在visitor_id 上添加了一个索引
版本信息
MySQL version 5.5.31
PHP version 7.2
phpMyAdmin 4.9.1
可能 MySQL 服务器版本可能是一个问题,因为它已过时(我无法升级 atm),但可能不会大幅改善查询时间?
解决方案
- 你需要一个索引
visitor_id
- 您需要使用正确的类型,以便使用索引
所以:
create index idx_ad_views_visitor_id on ad_views(visitor_id);
您可以在索引中添加其他列,但visitor_id
必须是第一列。
然后:
UPDATE `ad_views`
SET on_page = 0
WHERE visitor_id = '102577047';
推荐阅读
- javascript - 为什么 gulp 不构建新文件?
- kubernetes - k8s中patch和replace部署有什么区别?
- eclipse - 如何在 Eclipse 中从 github 导入新的代号演示项目?
- javascript - 文本输入未像 react-native 中的文本区域那样显示
- qt - 无法将 [未定义] 分配给 QColor
- php - Laravel - 检查命名错误包的名称
- ios - 在同一个项目中使用 Swift 和 Objective C 获取 UIApplication.shared.delegate
- python - Django:如何从谷歌地图用户选择的地址获取经度和纬度并保存到数据库
- asp.net - Rotativa 在本地主机上工作,在服务器上将字体显示为正方形(ASP.NET MVC)
- sbt - 如何在 sbt 中最好地利用增量编译