平时开发中,常用一些模糊查询,例如查询表格user中uname包含“塔”的数据,可以使用如下三种方式:
select * from user where uname like '%塔%';
select * from user where INSTR(uname,'塔');
select * from user where LOCATE('塔', uname);
但是如果有一个需求,我要查询user表格中uname值
包含在“北境史塔克家族”
中的数据,尝试了下,直接反过来:
select * from user where '北境史塔克家族' like CONCAT('%',uname,'%');
select * from user where INSTR('北境史塔克家族', uname);
select * from user where LOCATE(uname,'北境史塔克家族');
平时开发中,常用一些模糊查询,例如查询表格user中uname包含“张”的数据,可以使用如下三种方式:select * from user where uname like '%塔%';select * from user where INSTR(uname,'塔');select * from user where LOCATE('塔', uname);但是如果有一个需求,我要查询user表格中...
问题:明明建立了索引,为何Like
模糊查询
速度还是特别慢?
Like是否使用索引?
1、like %keyword 索引失效,使用全表扫描。但可以通过翻转函数+like前
模糊查询
+建立翻转函数索引=走翻转函数索引,不走全表扫描。
2、like keyword% 索引有效。
3、like %keyword% 索引失效,也无法使用
反向
索引。
使用
mysql
的explain简单测试如下:
explain
select
* from company_info where cname like ‘%小%’
explain
select
* from company_inf
假设有模型
class Category(models.Model):
id = models.CharField(primary_key = True,max_length = 255)
type_name = models.CharField(max_length = 255)
def __str__(self):
return ...
在查询中使用 `%` 符号可以匹配任意数量的任意字符。因此,上面的查询将返回所有名字中包含 "john" 的记录,无论 "john" 出现在名字的开头、结尾还是中间。
还可以使用 `_` 符号匹配单个字符。例如,下面的查询将返回所有名字以 "joh" 开头、后跟任意单个字符的记录:
SELECT
* FROM users WHERE name LIKE 'joh_';
可以使用多个 `%` 和 `_` 符号来构建复杂的模糊匹配查询。例如,下面的查询将返回所有名字以 "joh" 开头、后跟任意数量的任意字符、最后是 "n" 的记录:
SELECT
* FROM users WHERE name LIKE 'joh%n';
注意,
MySQL
中的
模糊查询
是不区分大小写的。因此,上面的查询也会返回名字中包含 "JOH"、"JoH" 等字符串的记录。如果需要区分大小写,可以使用 BINARY 关键字,例如:
SELECT
* FROM users WHERE BINARY name LIKE 'joh%n';