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