SQL中遇到 like'%xx%'怎么优化

技巧

如果你经常需要一个以通配符开头的查询,常用的方法是在数据库中保存需要查询的值的反序值。例如,假设你想要找所有以.com 结尾的电子邮件地址,当搜索 email Like '%.com' 时 MySQL不能使用索引;而搜索 reverse_email LIKE REVERSE('%.com')就可以使用定义在 reverse_email 列上的索引。

REVERSE(str)

    返回颠倒字符顺序的字符串str。

    mysql> select REVERSE('abc');

            -> 'cba'

    该函数对多字节可靠的。

key_len: 4 // INT NOT NULL

key_len: 5 // INT NULL

key_len: 30 // CHAR(30) NOT NULL

key_len: 32 // VARCHAR(30) NOT NULL

key_len: 92 // VARCHAR(30) NULL CHARSET=utf8

mysql> EXPLAIN SELECT p.* FROM parent p WHERE p.id NOT IN (SELECT c.parent_id FROM childc)\G

********************* 1. row ***********************

id: 1

select_type: PRIMARY

table: p

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 160

Extra: Using where

********************* 2. row ***********************

id: 2

select_type: DEPENDENT SUBQUERY

table: c

type: index_subquery

possible_keys: parent_id

key: parent_id

key_len: 4

ref: func

rows: 1

Extra: Using index

2 rows in set (0.00 sec)

mysql> EXPLAIN SELECT p.*

-> FROM parent p

-> LEFT JOIN child c ON p.id = c.parent_id

-> WHERE c.child_id IS NULL\G

********************* 1. row ***********************

id: 1

select_type: SIMPLE

table: p

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 160

Extra:

********************* 2. row ***********************

id: 1

select_type: SIMPLE

table: c

type: ref

possible_keys: parent_id

key: parent_id

key_len: 4

ref: test.p.id

rows: 1

Extra: Using where; Using index; Not exists

2 rows in set (0.00 sec)

mysql> EXPLAIN SELECT p.*

-> FROM parent p

-> WHERE NOT EXISTS

-> SELECT parent_id FROM child c WHERE c.parent_id

= p.id)\G

********************* 1. row ***********************

id: 1

select_type: PRIMARY

table: p

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 160

Extra: Using where

********************* 2. row ***********************

id: 2

select_type: DEPENDENT SUBQUERY

table: c

type: ref

possible_keys: parent_id

key: parent_id

key_len: 4

ref: test.p.id

rows: 1

Extra: Using index

2 rows in set (0.00 sec)

时间: 2024-07-31 19:54:33

SQL中遇到 like'%xx%'怎么优化的相关文章

MySQL 查询中的分页思路的优化

mysql|分页|优化 作者:steeven 似乎讨论分页的人很少,难道大家都沉迷于limit m,n?在有索引的情况下,limit m,n速度足够,可是在复杂条件搜索时,where somthing order by somefield+somefieldmysql会搜遍数据库,找出"所有"符合条件的记录,然后取出m,n条记录.如果你的数据量有几十万条,用户又搜索一些很通俗的词,然后要依次读最后几页重温旧梦...mysql该很悲壮的不停操作硬盘. 所以,可以试着让mysql也存储分页

SQL Server索引的使用和优化

    在应用系统中,尤其在联机事务处理系统中,对数据查询及处理速度已成为衡量应用系统成败的标准.而采用索引来加快数据处理速度也成为广大数据库用户所接受的优化方法. 在良好的数据库设计基础上,能有效地使用索引是SQL Server取得高性能的基础,SQL Server采用基于代价的优化模型,它对每一个提交的有关表的查询,决定是否使用索引或用哪一个索引.因为查询执行的大部分开销是磁盘I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读表的每一个数据页,如果有索引指向数据

SQL Server跟踪数据实现索引优化向导

使用SQL Server事件探查器工具,你可用一个捕获到的跟踪来收集有关服务器的重要信息.与索引优化向导(Index Tuning Wizard,ITW)以及正确的常规索引信息配合,这种跟踪可帮助你调试SQL Server应用程序并优化性能.本文将逐步指导你获取跟踪数据,并在ITW中实际使用它. SQL Server性能优化 请参考以下文章,了解如何优化SQL Server应用程序的性能: 优化SQL Server索引的小技巧: 使用索引调节向导调整应用程序的性能: 使用查询分析器调整SQL服务

MySQL 查询中的分页思路的优化教程

  复杂条件搜索时,where somthing order by somefield+somefieldmysql会搜遍数据库,找出"所有"符合条件的记录,然后取出m,n条记录.如果你的数据量有几十万条,用户又搜索一些很通俗的词,然后要依次读最后几页重温旧梦.mysql该很悲壮的不停操作硬盘. 所以,可以试着让mysql也存储分页,当然要程序配合. ASP的分页:在ASP系统中有Recordset对象来实现分页,但是大量数据放在内存中,而且不知道什么时候才失效(请ASP高手指点).

Spark SQL中的DataFrame

在2014年7月1日的 Spark Summit 上,Databricks 宣布终止对 Shark 的开发,将重点放到 Spark SQL 上.在会议上,Databricks 表示,Shark 更多是对 Hive 的改造,替换了 Hive 的物理执行引擎,因此会有一个很快的速度.然而,不容忽视的是,Shark 继承了大量的 Hive 代码,因此给优化和维护带来了大量的麻烦.随着性能优化和先进分析整合的进一步加深,基于 MapReduce 设计的部分无疑成为了整个项目的瓶颈. 详细内容请参看 Sh

SQL中IS NOT NULL与!=NULL的区别_数据库其它

平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS NOT NULL去做条件判断,因为SQL默认情况下对WHERE XX!= Null的判断会永远返回0行,却不会提示语法错误. 这是为什么呢? SQL Server文档中对Null值的比较运算定义了两种规则,如在SQL Server 2000中: 规则一是是ANSISQL(SQL-92)规定的Null

SQL导入txt以及SQL中的时间格式操作

原文:SQL导入txt以及SQL中的时间格式操作 MySQL中导入txt的指令为: load data local infile "路径名称" into table "表名" 比如我文件的具体位置为"f:\\dataset\\beijing\\xx.txt",创建的表名为"person",则上述指令的具体表达为: load data local infile "f:\\dataset\\beijing\\xx.txt

SQL中删除某数据库所有trigger及sp

原文:SQL中删除某数据库所有trigger及sp SQL中删除某数据库所有trigger及sp   编写人:CC阿爸   2014-6-14   在日常SQL数据库的操作中,如何快速的删除所有trigger及sp呢 以下有三种方式可快速处理.     --第一种 --事务的处理方法 Begin Transaction Begin try declare @SQL varchar(max) set @SQL='' select @SQL=@SQL+name+',' from sysobjects

怪异问题!sql在pl/sql中执行结果与java jdbc执行结果不一致

问题描述 做一查询系统(struts2+myeclipse+tomcat+oracle9),一般先在pl/sql中测试sql语句,无问题后在action中使用oracle thin模式连接数据库,执行sql语句,然后将查询结果存入HashMap后输出至jsp页面.出现如下怪异问题:1.在pl/sql中测试sql语句时结果正常.结果中有6个字段,其中两个字段为count()函数统计出的数值.2.将在pl/sql中测试过的sql语句写入struts2的action中,通过jdbc thin模式执行,