首页 > 解决方案 > 为什么我的 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),但可能不会大幅改善查询时间?

编辑: 解释选择

标签: mysqlsqlsql-update

解决方案


  1. 你需要一个索引visitor_id
  2. 您需要使用正确的类型,以便使用索引

所以:

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';

推荐阅读