SELECT `Id`, `company`, `address`, `industry` FROM `TableQ` WHERE (`address` LIKE '%北京%') ORDER BY `Id` ASC LIMIT 0, 10
SELECT `Id`, `company`, `address`, `industry` FROM `TableQ` WHERE (`industry` LIKE '%教育%') ORDER BY `Id` ASC LIMIT 0, 10
SELECT `Id`, `company`, `address`, `industry` FROM `TableQ` WHERE (`company` LIKE '%新东方%') ORDER BY `Id` ASC LIMIT 0, 10
SELECT `Id`, `company`, `address`, `industry` FROM `TableQ` WHERE (`company` LIKE '%新东方%') AND (`industry` LIKE '%教育%') ORDER BY `Id` ASC LIMIT 0, 10
SELECT `Id`, `company`, `address`, `industry` FROM `TableQ` WHERE (`address` LIKE '%北京%') AND (`industry` LIKE '%教育%') ORDER BY `Id` ASC LIMIT 0, 10
SELECT `Id`, `company`, `address`, `industry` FROM `TableQ` WHERE (`address` LIKE '%北京%') AND (`address` LIKE '%朝阳区%') ORDER BY `Id` ASC LIMIT 0, 10
MYSQL数据库,经常需要对company
, address
, industry
三个字段进行单列搜索,或对company
, industry
,或对address
, industry
两个字段进行组合搜索,搜索语句同上。
因为都是带LIKE的搜索,所以,以上5种情况,是不是需要建立5个索引呢?
补充:company
, address
, industry
三个字段里面的数据都是北京
朝阳区
金兴路
这样的数据,数据之间会有空格,但是搜索关键词都是北京
或上海
或金兴路
或在同一字段内的多关键词组合,比如WHERE (address
LIKE '%北京%') AND (address
LIKE '%朝阳区%')
like前缀匹配才会走索引,你这种需求类似分词搜索了,预处理提取词语或者使用elasticsearch这种第三方组件
mysql哪个版本的、
如果是mysql5.7及以上版本支持json数据类型
如果数据格式一致可以考虑将这三列改造成json,数组或者键值对都可以、
并且5.7及以上版本支持虚拟列、 可以添加索引、
可以参考以下文章
索引可以提升查询效率,但是过多的索引会降低数据库insert、update的写入效率。所以一般单表最好索引控制在6个以内。
可以建一个联合索引 index(industry,address,company)和 两个普通索引index(address)、index(company)。利用联合索引的最左匹配原则(最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。)可以让上述提到的所有查询需求都能使用到索引。
同时:mysql查询优化器会判断纠正这条sql语句该以什么样的顺序执行效率最高,最后才生成真正的执行计划。所以sql中条件中字段顺序可以与联合索引中的顺序存异。
最后:like 只有 %不在左侧才能使用到索引!!!