找出mysql中like模糊查询效率低的sql语句

相比update和insert,一般查询应该是数据库中操作最频繁的。而在有些应用场景需要用到like模糊查询,那么对于大数据,查询的时候就要注意了。

 

现在来分析一下为什么like语句查询的效率会很低,测试数据共4000000条,如下图:

 

 

第一步:不使用索引

下图可以看出,不使用索引的时候普通查询与like查询的耗时相当,like略长,这也是必然的,因为它要进行额外的算法。

 

 

第二步:使用索引

 

如下图,使用索引后,普通查询的耗时基本算是秒查,非常快;而like查询还是耗时一秒多。

 

 

 

第三步:分析原因

 

如下图,用explain分析一下,此时我们立刻明白了,普通查询用到了索引,但是like语句没有用到索引。

 

 

所以,照成mysql中like查询效率低下的原因是:在有些情况下,like查询使用不到索引,会扫描全表。

 

最后,补充一下,like语句有时候也是可以用到索引的,如下图,如果我们查询的时候写成“like 'dd_'或者like 'dd%'”,这样是可以用到索引的,此时的查询速度也会相对的快一点。虽然快了一点,但是还是比普通查询耗时要多很多。

 

 

因此,当表的数据量比较大的时候,尽量还是不要用like语句了。如果想做模糊搜索,建议用搜索引擎,比如solr,这样会比like强大n倍。

时间: 2024-11-01 19:46:52

找出mysql中like模糊查询效率低的sql语句的相关文章

My SQL模糊查询,可能是sql语句的转义符问题

问题描述 My SQL模糊查询,可能是sql语句的转义符问题 select * from ticketorder where journey like '%HKG[^-]%' 这是语句, 我想查询journey字段里HKG后面没有"-"的值 解决方案 我自己已经解决了 journey REGEXP 'HKG[,]' or journey REGEXP 'HKG$' 条件这样写就可以了,谨此作为参考 解决方案二: sql 中模糊查询转义 escape

查询mysql中执行效率低的sql语句的方法_Mysql

一些小技巧1. 如何查出效率低的语句?在MySQL下,在启动参数中设置 --log-slow-queries=[文件名],就可以在指定的日志文件中记录执行时间超过long_query_time(缺省为10秒)的SQL语句.你也可以在启动配置文件中修改long query的时间,如: 复制代码 代码如下:  # Set long query time to 8 seconds    long_query_time=8 2. 如何查询某表的索引?可使用SHOW INDEX语句,如: 复制代码 代码如

MySQL中批量删除指定前缀表的sql语句_Mysql

复制代码 代码如下: Select CONCAT( 'drop table ', table_name, ';' ) FROM information_schema.tables Where table_name LIKE 'dede_%'; "dede"为要删除的表前缀,执行此SQL语句后会生成一串SQL语句,必须再执行生成的这些SQL语句才能真正执行删除操作 另外一个就是批量修改表名: 复制代码 代码如下: Select CONCAT( 'ALTER TABLE ', table_

如何找出MySQL数据库中的低效SQL语句

面对业务的迅猛发展,DBA的一项重要工作就是及时发现数据库中的低效SQL语句,有的可以立刻着手解决(比如缺少合适的索引),有的需要尽快反馈给开发人员进行修改. MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句: 1,slow_query_log 这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句. 2,long_query_time 当SQL语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短. 3,slow_query_log_file 记录日志的文件名

mysql中关于分页查询的输出问题!

问题描述 mysql中关于分页查询的输出问题! String sql = ""select * from emp order by empno limit ??"";prepareStatement stmt = con.prepareStatement(sql); stmt.setInt(1 begin); stmt.setInt(2 end); ResultSet rs = stmt.executeQuery(); while (rs.next()) { Sys

MySQL数据库中查找执行效率慢的SQL语句

启动Mysql时加参数--log-slow-queries来记录执行时间超过long_query_time秒的sql: /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-locking --port=3306 --socket=/var/run/mysqld/mysqld.sock --log-slow- querie

MySQL中IN子查询会导致无法使用索引

原文:MySQL中IN子查询会导致无法使用索引   今天看到一个博客园的一篇关于MySQL的IN子查询优化的案例,一开始感觉有点半信半疑(如果是换做在SQL Server中,这种情况是绝对不可能的,后面会做一个简单的测试.)随后动手按照他说的做了一个表来测试验证,发现MySQL的IN子查询做的不好,确实会导致无法使用索引的情况(IN子查询无法使用所以,场景是MySQL,截止的版本是5.7.18) MySQL的测试环境 测试表如下 create table test_table2 ( id int

[华为机试练习题]61.找出字符串中第一个出现次数最多的字符

题目 描述: 找出字符串中第一个出现次数最多的字符 详细描述: 接口说明 原型: bool FindChar(char* pInputString, char* pChar); 输入参数: char* pInputString:字符串 输出参数(指针指向的内存区域保证有效): char* pChar:出现次数最多的字符 返回值: false 异常失败 true 输出成功 练习阶段: 初级 代码 /*--------------------------------------- * 日期:2015

mysql 用like模糊查询 怎么查包含了%号的字符串

问题描述 mysql 用like模糊查询 怎么查包含了%号的字符串 如题 select * from table where column like '%%%'中间的百分号怎么写 解决方案 like '%%%'就可以了 解决方案二: MySQL模糊查询likemysql中文like模糊查询问题模糊查询like 解决方案三: 如果我就真的要查%或者_,怎么办呢?使用escape,转义字符后面的%或_就不作为通配符了,注意前面没有转义字符的%和_仍然起通配符作用 Sql代码 select usern