MySQL 版本是 5.7.25
我有桌子
CREATE TABLE `applications` (
`id` varchar(25) NOT NULL,
`application` longblob NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
“应用程序”是大约 50kb 的 xml 文本。
该表包含大约 120k 条记录。
当我进行搜索时
Select * from `applications`
where
application like '%<l:name>8085%</l:name>%'
查询因 30 分钟超时而失败。
如果我做
Select A.* from (
Select * from `applications`
Limit 0,1000
)A where
A.application like '%<l:name>8085%</l:name>%'
查询在 6 秒内完成。
所以通过分页我可以在 120*6 = 720 秒内得到查询结果
有趣的是,限制为 0,10000 的相同查询在 120 秒内完成,限制为 0,100000 的查询因超时 30 分钟而失败
从这篇 SO 帖子中,我了解到可能 longblob 查询性能与行数不是线性的。
我终于完成了通过分页和连接结果来获取查询结果。
Select A.id from (
Select * from `applications`
Limit 0,10000
)A where
A.application like '%<l:name>8085%</l:name>%'
Select A.id from (
Select * from `applications`
Limit 10000,20000
)A where
A.application like '%<l:name>8085%</l:name>%'
......
问题是如何更方便地获得结果。
搜索字符串会有所不同,并且事先是未知的,将列类型更新为TEXT
现在不是一种选择,因为这需要应用程序重构,而此时没有人想要。查询是手动更新的一部分,所以执行时间不是问题。
伦纳特:
题外话,但即使没有人更新表,您也可能会错过某些行。如果要保证检查所有行,则需要与 limit 一起进行 order by。
添加ORDER BY
和检查更新是有意义的,谢谢。