Mysql 为什么我的更新查询在2200万行中速度慢

Mysql 为什么我的更新查询在2200万行中速度慢,mysql,sql,sql-update,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 NUL

我正在开发自己的广告系统,每一个显示的横幅都会在数据库中插入一条记录(用于统计)。其中一个值是当前是否正在显示广告。然后,当您离开页面时,它会更新该行并将该值设置为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:

更新页面=0上设置的“广告视图”,其中访客id=102577047
我添加了一个关于访客id的索引

版本信息

MySQL version 5.5.31
PHP version 7.2
phpMyAdmin 4.9.1
MySQL服务器版本可能会成为一个问题,因为它已经过时(我无法升级atm),但可能不会大大缩短查询时间

编辑:

  • 您需要在
    访客id
  • 您需要使用正确的类型,以便使用索引
  • 因此:

    索引中可以有其他列,但
    visitor\u id
    必须是第一列

    然后:


    “我在访客id上添加了一个索引”这就是你所说的,但是
    CREATE
    没有显示这一点。。无论如何,有关性能的问题应包括
    解释
    ,如果您在
    update
    上使用不支持
    EXPLAIN
    的较旧MySQL版本,请在访问者id=102577047的ad_视图中运行
    EXPLAIN-SELECT on_page=0,而改为…@RaymondNijland根据用户的行为,可以找到无限次访问者id。如果你仍然使用PHP5,我强烈建议你尽快升级。不再支持此版本@达曼它应该说7.2我的坏。。。。但问题仍然存在,这不是一个答案,因为他已经提到索引已经在访问者id上创建,并且没有提供任何内容new@Andrew&RaymondNijland当字符串与INT比较时,MySQL会将字符串转换为INT。因此无法使用索引。所以,正如Gordon所写,您需要在WHERE子句中使用字符串。@PaulSpiegel,但这与性能问题无关,而且..Nanko已经检查过了,但它没有resolved@Andrew你是在告诉我,索引的使用与性能无关吗?看见别介意@PaulSpiegel和Gordon我从来没有注意到topicstarter在选择时使用了错误的数据类型。。咖啡因含量又低了。。
    
    create index idx_ad_views_visitor_id on ad_views(visitor_id);
    
    UPDATE `ad_views`
        SET on_page = 0
        WHERE visitor_id = '102577047';