Mysql
像’%‘在MySql中使用longblob列搜尋值很慢
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 來解決,之後查詢執行不到一秒。