mysql like %keyword%不走索引替代方法--转[足球带我奔跑]
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%不走索引替代方法--转[足球带我奔跑]相关推荐
- mysql like为什么不走索引,如何改写
本文旨在用最通俗的语言讲述最枯燥的基本知识: 这个话题比较有意思. 昨天中午吃完饭间突然有个同事蹦出了一句:"like有索引吗?",我顺口就说没有,另一个同事反驳说有啊,还有些同事 ...
- mysql datetime month不走索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...
like百分号加前面一定不走索引吗? 正常来讲,我们都知道在mysql的like查询中,百分号加在关键词后面是走索引的,比如 select * like "张三%",而百分号在前面 ...
- MySQL sysdate()函数 不走索引的问题
下面说明了SYSDATE()函数的语法: SYSDATE(fsp); SQL 如果函数用于字符串上下文或YYYYMMDDHHMMSS格式,则SYSDATE()函数将返回当前日期时间,格式为" ...
- 详解mysql什么时候不走索引
全值匹配我最爱,最左前缀要遵守: 带头大哥不能死,中间兄弟不能断: 索引列上不计算,范围之后全失效: LIKE百分写最右,覆盖索引不写 *: 不等空值还有or,索引失效要少用: 字符单引不可丢,SQL ...
- mysql 数据连续不走索引6_MySql组合索引最左侧原则失效
最近在看MySQL索引的知识,看到组合索引的时候,有一个最左侧原则,我就建了个简单的表验证一下,过程中碰到有些不懂的,在这里求教一下,mysql版本5.7的 CREATE TABLE `testp` ...
- MySQL时间查询不走索引,MySQL带时间字段的范围查询不走索引了?
今天群里抛出了个乍看之下很迷的问题: 看到问题的第一瞬间,我想这是什么原理,比较方向的修改就能引起索引失效了?于是我自己先试了一下. 环境:MySQL 5.7.25 1. 创建测试表 我先整了个32万 ...
- Mysql时间范围查询不走索引问题
使用Mysql进行数据查询时,如果在SQL语句中出现范围查询,类似如下语句: select * from logs where create_time >= '2020-01-01' ; 此时, ...
- mysql时间字段不走索引_MySQL使用=或=范围查询时不走索引
2020-02-27 最近一个日志页面查询很慢,然后去跟踪了查询sql,发现日期字段上即使建了索引,查询还是很慢,执行语句还是使用了全表扫描,于是继续分析下去. 查询语句类似: select * fr ...
- MySQL为什么在使用索引的情况下能够提高查询效率,不使用索引又会是什么情形
先来个生活学习中直观的体验--查字典 字典都有拼音.偏旁部首或者笔画数三个供检索的部分. 它们能以不同的方式快速定位到某个字词在哪一页. 而且存放这些索引部分的地方很好找,不是字典后面,就是字典前面. ...
最新文章
- Java新手如何学习Spring、Struts、Hibernate三大框架?
- C# 委托 (一)—— 委托、 泛型委托与Lambda表达式
- SPARK安装二:HADOOP集群部署
- 关于APP更新,两包共存的解决方案
- [vue] 分析下vue项目本地开发完成后部署到服务器后报404是什么原因呢?
- hasLayout和filter滤镜的细节
- 分布式系统的开发经验与心得
- iOS 之如何利用 RunLoop 原理去监控卡顿?
- SQL中的集合运算有必要存在的几个例子
- uniapp 使用 colorUI
- ffplay播放摄像头
- java中怎么读取txt文件_Java读取TXT文件
- Java中的Ant与Maven比较整理
- 【设计】计数(一)基数计数
- Windows 键盘按键 测试
- 士兵突击:每个人的心灵史
- PySpark 之 连接变换 union、intersection、subtract、cartesian
- 参数方程下的特殊图像
- ThinkPHP源码解析之控制器
- Android之获取外部存储空间解释