Mysql 为什么我的更新查询在2200万行中速度慢
我正在开发自己的广告系统,每一个显示的横幅都会在数据库中插入一条记录(用于统计)。其中一个值是当前是否正在显示广告。然后,当您离开页面时,它会更新该行并将该值设置为0。在一张400万左右的旧桌子上,时间大约是0.1秒 由于某些原因,查询计时器超过1秒 数据库结构: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
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';