Mysql

像’%‘在MySql中使用longblob列搜尋值很慢

  • May 4, 2020

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和檢查更新是有意義的,謝謝。

問題最終通過將 INNODB_BUFFER_POOL_SIZE 從 256M 增加到 1G 來解決,之後查詢執行不到一秒。

引用自:https://dba.stackexchange.com/questions/253212