背景:
批量插入單詞時,存在單詞匹配例句,批量插入時,like匹配 批量插入時幾十個單詞挨個模糊匹配,接口超時,因為是后台管理系統,不打算接入ES,並且允許接口一定程度的慢,但接口超時得解決
方案:
1、正則表達式匹配,同樣慢得令人發指
2、添加全文索引
只有Innodb和myisam存儲引擎能用全文索引(innodb支持全文索引是從mysql5.6開始的)
CREATE FULLTEXT INDEX index ON table(`content`);
查看執行計划,確認走了索引
三種類型的全文搜索方式
natural language search(自然語言搜索)
通過MATCH AGAINST 傳遞某個特定的字符串來進行檢,默認方式
boolean search(布爾搜索)
為檢索的字符串增加操作符,如“+”表示必須包含,"-"不包含,"*" 表示通配符,即使傳遞的字符串較小或出現在停詞中,也不會被過濾掉
query expansion search(查詢擴展搜索)
搜索字符串用於執行自然語言搜索,然后,搜索返回的最相關行的單詞被添加到搜索字符串,並且再次進行搜索,查詢將返回來自第二個搜索的行
但是具體到執行時間,並沒有太大得差別,難道問題不是出在這個like匹配上?
SELECT sentence FROM table a WHERE sentence LIKE CONCAT('%','one',' %' ) LIMIT 0,5; -- 0.0109 s SELECT sentence FROM table a WHERE match(sentence) against('one') LIMIT 0,5; -- 0.0049 s
后來恍然大悟,因為limit 得原因 關鍵字太簡單,查詢5條,很快就能匹配上,滿足5條直接返回。
經過測試,生僻一點的單詞,like 大約需要消耗2s,全文索引匹配耗時並沒有改變。