https://blog.csdn.net/zxssoft/article/details/79651889

在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万级,千万级的时候,查询的效率就很容易显现出来。这个时候查询的效率就显得很重要!

一般情况下like模糊查询的写法为(field已建立索引):

SELECT `column` FROM `table` WHERE `field` like '%keyword%';

上面的语句用explain解释来看,SQL语句并未用到索引,而且是全表搜索,如果在数据量超大的时候,可想而知最后的效率会是这样

对比下面的写法:

SELECT `column` FROM `table` WHERE `field` like 'keyword%';

这样的写法用explain解释看到,SQL语句使用了索引,搜索的效率大大的提高了!

但是有的时候,我们在做模糊查询的时候,并非要想查询的关键词都在开头,所以如果不是特别的要求,"keywork%"并不合适所有的模糊查询

这个时候,我们可以考虑用其他的方法
1.LOCATE('substr',str,pos)方法

SELECT LOCATE('xbar',`foobar`); 
    ###返回0

SELECT LOCATE('bar',`foobarbar`); 
    ###返回4

SELECT LOCATE('bar',`foobarbar`,5);
    ###返回7
备注:返回 substr 在 str 中第一次出现的位置,如果 substr 在 str 中不存在,返回值为 0 。如果pos存在,返回 substr 在 str 第pos个位置后第一次出现的位置,如果 substr 在 str 中不存在,返回值为0。

SELECT `column` FROM `table` WHERE LOCATE('keyword', `field`)>0

备注:keyword是要搜索的内容,field为被匹配的字段,查询出所有存在keyword的数据

2.POSITION('substr' IN `field`)方法
    position可以看做是locate的别名,功能跟locate一样

SELECT `column` FROM `table` WHERE POSITION('keyword' IN `filed`)

3.INSTR(`str`,'substr')方法

SELECT `column` FROM `table` WHERE INSTR(`field`, 'keyword' )>0

除了上述的方法外,还有一个函数FIND_IN_SET

FIND_IN_SET(str1,str2):
返回str2中str1所在的位置索引,其中str2必须以","分割开。

SELECT * FROM `person` WHERE FIND_IN_SET('apply',`name`);

以上方法在使用 * 时不走索引, 使用多个列时走所以.

mysql5.6中已经解决了 like %keyword% 第一个%分好的问题.但注意EXPLAIN SELECT city_id ,city FROM city WHERE city LIKE '%xin%';   select 的列不能时* 否则不走索引.

mysql like %keyword%不走索引替代方法--转[足球带我奔跑]相关推荐

  1. mysql like为什么不走索引,如何改写

    本文旨在用最通俗的语言讲述最枯燥的基本知识: 这个话题比较有意思. 昨天中午吃完饭间突然有个同事蹦出了一句:"like有索引吗?",我顺口就说没有,另一个同事反驳说有啊,还有些同事 ...

  2. mysql datetime month不走索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...

    like百分号加前面一定不走索引吗? 正常来讲,我们都知道在mysql的like查询中,百分号加在关键词后面是走索引的,比如 select * like "张三%",而百分号在前面 ...

  3. MySQL sysdate()函数 不走索引的问题

    下面说明了SYSDATE()函数的语法: SYSDATE(fsp); SQL 如果函数用于字符串上下文或YYYYMMDDHHMMSS格式,则SYSDATE()函数将返回当前日期时间,格式为" ...

  4. 详解mysql什么时候不走索引

    全值匹配我最爱,最左前缀要遵守: 带头大哥不能死,中间兄弟不能断: 索引列上不计算,范围之后全失效: LIKE百分写最右,覆盖索引不写 *: 不等空值还有or,索引失效要少用: 字符单引不可丢,SQL ...

  5. mysql 数据连续不走索引6_MySql组合索引最左侧原则失效

    最近在看MySQL索引的知识,看到组合索引的时候,有一个最左侧原则,我就建了个简单的表验证一下,过程中碰到有些不懂的,在这里求教一下,mysql版本5.7的 CREATE TABLE `testp` ...

  6. MySQL时间查询不走索引,MySQL带时间字段的范围查询不走索引了?

    今天群里抛出了个乍看之下很迷的问题: 看到问题的第一瞬间,我想这是什么原理,比较方向的修改就能引起索引失效了?于是我自己先试了一下. 环境:MySQL 5.7.25 1. 创建测试表 我先整了个32万 ...

  7. Mysql时间范围查询不走索引问题

    使用Mysql进行数据查询时,如果在SQL语句中出现范围查询,类似如下语句: select * from logs where create_time >= '2020-01-01' ; 此时, ...

  8. mysql时间字段不走索引_MySQL使用=或=范围查询时不走索引

    2020-02-27 最近一个日志页面查询很慢,然后去跟踪了查询sql,发现日期字段上即使建了索引,查询还是很慢,执行语句还是使用了全表扫描,于是继续分析下去. 查询语句类似: select * fr ...

  9. MySQL为什么在使用索引的情况下能够提高查询效率,不使用索引又会是什么情形

    先来个生活学习中直观的体验--查字典 字典都有拼音.偏旁部首或者笔画数三个供检索的部分. 它们能以不同的方式快速定位到某个字词在哪一页. 而且存放这些索引部分的地方很好找,不是字典后面,就是字典前面. ...

最新文章

  1. Java新手如何学习Spring、Struts、Hibernate三大框架?
  2. C# 委托 (一)—— 委托、 泛型委托与Lambda表达式
  3. SPARK安装二:HADOOP集群部署
  4. 关于APP更新,两包共存的解决方案
  5. [vue] 分析下vue项目本地开发完成后部署到服务器后报404是什么原因呢?
  6. hasLayout和filter滤镜的细节
  7. 分布式系统的开发经验与心得
  8. iOS 之如何利用 RunLoop 原理去监控卡顿?
  9. SQL中的集合运算有必要存在的几个例子
  10. uniapp 使用 colorUI
  11. ffplay播放摄像头
  12. java中怎么读取txt文件_Java读取TXT文件
  13. Java中的Ant与Maven比较整理
  14. 【设计】计数(一)基数计数
  15. Windows 键盘按键 测试
  16. 士兵突击:每个人的心灵史
  17. PySpark 之 连接变换 union、intersection、subtract、cartesian
  18. 参数方程下的特殊图像
  19. ThinkPHP源码解析之控制器
  20. Android之获取外部存储空间解释

热门文章

  1. iapd计算机软件,如何让iPad更强大 多款实用iPad软件推荐
  2. 量化投资_止盈止损在策略中的有效性(改编)
  3. 2022债市波动分析
  4. X Chen笔记---老毛子Padavan固件安装17ce插件
  5. svg-icon图片修改颜色的两种方法
  6. Jensen‘s inequality
  7. PG::Covfefe
  8. 十年一觉扬州梦,赢得青楼薄幸名
  9. 代码传奇丨专业造轮子,进度已至2%的轮子哥
  10. IT群侠传第四回大鱼小虾