您好,欢迎访问一九零五行业门户网

关于mysql set字段类型的模糊查询有关问题

关于mysql set字段类型的模糊查询问题
有个40万条的测试数据表
flag  set('r', 'l', 'c', 'p')
select a. * , b.typedir
from mzrui_archives a
left join mzrui_kind b on a.kid = b.uid
where a.flag like '%p%'
and a.kid
in ( 3, 17, 18 )
order by a.uid
limit 0 , 15
这个语句查询需要2.5秒的时间,把like去掉后查询相当快,不知道怎么优化,求教。
uid是主键
key kid(kid,flag) 索引
分享到:
------解决方案--------------------
既然是set,为何要like查询?  find_in_set('p',a.flag)
------解决方案--------------------
引用:quote: 引用:
既然是set,为何要like查询?  find_in_set('p',a.flag)
find_in_set 的效率也是一样,我测试了,关键是find_in_set不能('c,p',a.flag)多条件,这样我查不出记录来
你可以
find_in_set('p',a.flag) and find_in_set('c',a.flag)
------解决方案--------------------
如果你仅仅4个标识('r', 'l', 'c', 'p') ,不如用 1 2 4 8 作为标识位,用例如 1
------解决方案--------------------
2 = 3 的方式来标识flag,查询的时候可以 where flag & 2 的方式,应该会快不少
------解决方案--------------------
对于 set 类型字段 find_in_set 用的就是位运算
不过 like '%l%' 这样肯定是不可取的,如果是 like '%l,r%' 或 like '%l,p%' 不就什么都找不到了吗?
当然,无论是 like 还是 find_in_set 都是要遍历整个表的,不然就不知道哪条记录能匹配的上
set 类型是按长整形存储的,加上索引可能会快些
其它类似信息

推荐信息