MySQL中Like模糊查詢速度太慢該如何進(jìn)行優(yōu)化
一、前言:
我建了一個(gè)《學(xué)生管理系統(tǒng)》,其中有一張學(xué)生表和四張表(小組表,班級(jí)表,標(biāo)簽表,城市表)進(jìn)行聯(lián)合的模糊查詢,效率非常的低,就想了一下如何提高like模糊查詢效率問題
注:看本篇博客之前請(qǐng)查看:Mysql中如何查看Sql語句的執(zhí)行時(shí)間
二、第一個(gè)思路建索引
1、like %keyword 索引失效,使用全表掃描。
2、like keyword% 索引有效。
3、like %keyword% 索引失效,使用全表掃描。
使用explain測(cè)試了一下:
原始表(注:案例以學(xué)生表進(jìn)行舉例)
-- 用戶表 create table t_users( id int primary key auto_increment, -- 用戶名 username varchar(20), -- 密碼 password varchar(20), -- 真實(shí)姓名 real_name varchar(50), -- 性別 1表示男 0表示女 sex int, -- 出生年月日 birth date, -- 手機(jī)號(hào) mobile varchar(11), -- 上傳后的頭像路徑 head_pic varchar(200) );
建立索引
#create index 索引名 on 表名(列名); create index username on t_users(username);
like %keyword% 索引失效,使用全表掃描
explain select id,username,password,real_name,sex,birth,mobile,head_pic from t_users where username like '%h%';
like keyword% 索引有效。
explain select id,username,password,real_name,sex,birth,mobile,head_pic from t_users where username like 'wh%';
like %keyword 索引失效,使用全表掃描。
三、INSTR
這個(gè)我最開始都沒聽說過,今天查閱了一下資料,才知道有這個(gè)寶貝東西,
instr(str,substr)
:返回字符串str串中substr子串第一個(gè)出現(xiàn)的位置,沒有找到字符串返回0,否則返回位置(從1開始)
#instr(str,substr)方法 select id,username,password,real_name,sex,birth,mobile,head_pic from t_users where instr(username,'wh')>0 #0.00081900 #模糊查詢 select id,username,password,real_name,sex,birth,mobile,head_pic from t_users where username like 'whj'; # 0.00094650
比較兩個(gè)效率差距不大主要原因是數(shù)據(jù)較少,最好多準(zhǔn)備點(diǎn)原始數(shù)據(jù)進(jìn)行測(cè)試效果最佳
附:Like是否使用索引?
1、like %keyword? ? 索引失效,使用全表掃描。但可以通過翻轉(zhuǎn)函數(shù)+like前模糊查詢+建立翻轉(zhuǎn)函數(shù)索引=走翻轉(zhuǎn)函數(shù)索引,不走全表掃描。
2、like keyword%? ? 索引有效。
3、like %keyword% 索引失效,也無法使用反向索引。
總結(jié)
到此這篇關(guān)于MySQL中Like模糊查詢速度太慢該如何進(jìn)行優(yōu)化的文章就介紹到這了,更多相關(guān)MySQL?Like模糊查詢慢優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何用mysqldump進(jìn)行全量和時(shí)間點(diǎn)備份
這篇文章主要介紹了如何用mysqldump進(jìn)行全量和時(shí)間點(diǎn)備份,幫助大家更好的管理MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下2020-08-08MySQL從MyISAM轉(zhuǎn)換成InnoDB錯(cuò)誤與常用解決辦法
由于一些程序的要求,需要MyISAM數(shù)據(jù)引擎或InnoDB,下面是具體的解決方法,經(jīng)測(cè)試偶爾會(huì)出現(xiàn)一些問題。2011-05-05node 多種方法連接mysql數(shù)據(jù)庫(最新推薦)
mysql是一個(gè)流行的第三方模塊,可以通過npm安裝,在Node.js 中,有多種方法可以連接 MySQL 數(shù)據(jù)庫,本文通過實(shí)例代碼講解node 多種方法連接mysql數(shù)據(jù)庫的示例代碼,感興趣的朋友跟隨小編一起看看吧2023-07-07MySQL服務(wù)器權(quán)限與對(duì)象權(quán)限詳解
這篇文章主要介紹了MySQL服務(wù)器權(quán)限與對(duì)象權(quán)限,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08MySQL示例講解數(shù)據(jù)庫約束以及表的設(shè)計(jì)
約束主要完成對(duì)數(shù)據(jù)的檢驗(yàn),保證數(shù)據(jù)庫數(shù)據(jù)的完整性;如果有相互依賴數(shù)據(jù),保證該數(shù)據(jù)不被刪除,本篇文章教你如何給表設(shè)置約束及設(shè)計(jì)2022-06-06MyBatis攔截器實(shí)現(xiàn)分頁功能的實(shí)現(xiàn)方法
這篇文章主要介紹了MyBatis攔截器實(shí)現(xiàn)分頁功能的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文大家能夠?qū)崿F(xiàn)這樣的方法,需要的朋友可以參考下2017-10-10mysql實(shí)現(xiàn)多表關(guān)聯(lián)統(tǒng)計(jì)(子查詢統(tǒng)計(jì))示例
這篇文章主要介紹了mysql實(shí)現(xiàn)多表關(guān)聯(lián)統(tǒng)計(jì)(子查詢統(tǒng)計(jì)),結(jié)合具體案例形式分析了mysql多表關(guān)聯(lián)統(tǒng)計(jì)的原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-10-10Mysql LONGTEXT 類型存儲(chǔ)大文件(二進(jìn)制也可以) (修改+調(diào)試+整理)
MySql2.cpp : Defines the entry point for the console application.2009-07-07MySQL8.0?索引優(yōu)化invisible?index詳情
這篇文章主要介紹了MySQL8.0?索引優(yōu)化invisible?index詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09