为什么我的UPDATE查询在2200万行中变慢

时间:2019-10-18 12:56:45

标签: mysql sql sql-update

我在自己的广告系统上工作,每个显示的横幅都会在数据库中插入一条记录(用于统计)。值之一是是否正在立即展示广告。然后,当您离开页面时,它将更新该行并将其值设置为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),但可能应该不会大大缩短查询时间?

编辑: EXPLAIN SELECT

1 个答案:

答案 0 :(得分:1)

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