一、前言:
(资料图片)
我建了一个《学生管理系统》,其中有一张学生表和四张表(小组表,班级表,标签表,城市表)进行联合的模糊查询,效率非常的低,就想了一下如何提高like模糊查询效率问题
注:看本篇博客之前请查看:Mysql中如何查看Sql语句的执行时间
二、第一个思路建索引
1、like%keyword索引失效,使用全表扫描。
2、likekeyword%索引有效。
3、like%keyword%索引失效,使用全表扫描。
使用explain测试了一下:
原始表(注:案例以学生表进行举例)
--用户表
createtablet_users(
idintprimarykeyauto_increment,
--用户名
usernamevarchar(20),
--密码
passwordvarchar(20),
--真实姓名
real_namevarchar(50),
--性别1表示男0表示女
sexint,
--出生年月日
birthdate,
--手机号
mobilevarchar(11),
--上传后的头像路径
head_picvarchar(200)
);
建立索引
#createindex索引名on表名(列名);
createindexusernameont_users(username);
like%keyword%索引失效,使用全表扫描
explainselectid,username,password,real_name,sex,birth,mobile,head_pic
fromt_userswhereusernamelike"%h%";
likekeyword%索引有效。
explainselectid,username,password,real_name,sex,birth,mobile,head_pic
fromt_userswhereusernamelike"wh%";
like%keyword索引失效,使用全表扫描。
三、INSTR
这个我最开始都没听说过,今天查阅了一下资料,才知道有这个宝贝东西,
instr(str,substr):返回字符串str串中substr子串第一个出现的位置,没有找到字符串返回0,否则返回位置(从1开始)
#instr(str,substr)方法
selectid,username,password,real_name,sex,birth,mobile,head_pic
fromt_users
whereinstr(username,"wh")>0#0.00081900
#模糊查询
selectid,username,password,real_name,sex,birth,mobile,head_pic
fromt_users
whereusernamelike"whj";#0.00094650
比较两个效率差距不大主要原因是数据较少,最好多准备点原始数据进行测试效果最佳