sql查询语句的优化,exists与in的更换

自己开发的小站,页面访问查询的速度一直不让人满意,刚好今天有时间,就决定对它优化一下。

因为在本地开时发,查询的速度是相当快的,一开始就以为是mysql版本的问题,本地是MariaDB 5.5,服务器上是mysql 5.1,

将服务器上的数据弄到本地导了一份,居然发现一样变慢了,平均查询一个文章要1-2秒,列表超过2秒以上,才几千的数据这么慢肯定是哪里出了问题。

一点一点的定位打印日志,最后发现,居然是一条使用了exists的sql语句,查询就用了2秒,也就是说时间都花在这个上了,其它的基本都可以忽略了,语句如下:


  1. select * from TERM t where exists (select t2.TERM_ID from ASS_POST_TERM t2 where t.TERM_ID = t2.TERM_ID and t2.POST_ID = ?)

文章和分类的关联,这个语句没什么特别的地方,分开执行都是零点零几毫秒,拼在一起居然要2秒,不可思议。

难道是这个exists影响了吗?将exist换成in试一下:


  1. select * from TERM t where t.TERM_ID in (select t2.TERM_ID from ASS_POST_TERM t2 where t2.POST_ID = ?)

立马见效,查询时间从2秒提升为零点1毫秒左右,还真是这个exists的缘故。

网上都说exists的效率要高于in或才not in,看来也不尽然,具体情况还得具体分析啊,像在这里就比in差了20倍不止。

看来要好好研究一个exists这个关键字了。

时间: 2024-09-11 14:56:46

sql查询语句的优化,exists与in的更换的相关文章

select-oracle sql查询语句优化

问题描述 oracle sql查询语句优化 select moni.p_code,moni.department,moni.monitorserialno,moni.adminname,moni.buildingname from t_monitorroom moni where moni.p_code in (select roleauth.monitorroomid from t_monitorroom_role_authority roleauth left join t_monitorr

SQL查询语句优化的实用方法总结_Mysql

查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率.最近在对项目中的一些sql进行优化,总结整理了一些方法. 1.在表中建立索引,优先考虑where.group by使用到的字段. 2.尽量避免使用select *,返回无用的字段会降低查询效率.如下: SELECT * FROM t 优化方式:使用具体的字段代替*,只返回使用到的字段. 3.尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描.如下: SELEC

注释-oracle sql查询语句优化

问题描述 oracle sql查询语句优化 各位大神,我想问下在生产PLSQL,将****内的注释以后,可以查询出结果(用时:16S秒),否则,SQL就一直处于执行状态,查询不出结果.在线等,求各位大神们解惑 select cs.P_VOICEDIAL_FLAG PVoicedialFlag cs.pri_card_nbr priCardNbr cs.total_bal totalBal cs.overdue_amount totalOdue cs.risk_score riskScore ci

工作10几年的dba总结的sql查询语句优化

目录 1.什么是执行计划?执行计划是依赖于什么信息. 2. 统一SQL语句的写法减少解析开销 3. 减少SQL语句的嵌套 4. 使用"临时表"暂存中间结果 5. OLTP系统SQL语句必须采用绑定变量 6. 倾斜字段的绑定变量窥测问题 7. begin tran的事务要尽量地小. 8. 一些SQL查询语句应加上nolock 9.加nolock后查询经常发生页分裂的表,容易产生跳读或重复读 10.聚集索引没有建在表的顺序字段上,该表容易发生页分裂 11.使用复合索引提高多个where条件

oracle常用sql查询语句部分集合(图文)_oracle

Oracle查询语句 select * from scott.emp ; 1.--dense_rank()分析函数(查找每个部门工资最高前三名员工信息) select * from (select deptno,ename,sal,dense_rank() over(partition by deptno order by sal desc) a from scott.emp) where a<=3 order by deptno asc,sal desc ; 结果: --rank()分析函数(

sql 查询以指定字符开头sql查询语句

sql 查询以指定字符开头sql查询语句  像很多时间我们需要在mysql教程,mssql 进行查询符合条件的数据,今天我就碰到一个查询以"邓"开头的所有符合条件记录.  我用了二种查询方法下面来看实例    先登陆一个数据库教程cc,    create database cc;    再创建表    CREATE TABLE IF NOT EXISTS `string_find` (    `id` int(4) NOT NULL auto_increment,    `charL

日常收集常用SQL查询语句大全_MsSql

常用sql查询语句如下所示: 一.简单查询语句 1. 查看表结构 SQL>DESC emp; 2. 查询所有列 SQL>SELECT * FROM emp; 3. 查询指定列 SQL>SELECT empmo, ename, mgr FROM emp; SQL>SELECT DISTINCT mgr FROM emp; 只显示结果不同的项 4. 查询指定行 SQL>SELECT * FROM emp WHERE job='CLERK'; 5. 使用算术表达式 SQL>S

日常收集常用SQL查询语句大全

常用sql查询语句如下所示: 一.简单查询语句 1. 查看表结构 SQL>DESC emp; 2. 查询所有列 SQL>SELECT * FROM emp; 3. 查询指定列 SQL>SELECT empmo, ename, mgr FROM emp; SQL>SELECT DISTINCT mgr FROM emp; 只显示结果不同的项 4. 查询指定行 SQL>SELECT * FROM emp WHERE job='CLERK'; 5. 使用算术表达式 SQL>S

SQL查询语句对象化的实现(C#)

对象|语句   在开发数据库应用的过程难免会编写大量的SQL语句,其中大部份是查询语句:为不同情况编写查询语句是一件很烦琐的事件.用过hibernate或Nhibernate会了解到把SQL查询语句对象化后使用起非常方便和快捷:也大大减少在编写查询SQL语句所带来的错误等问题.        前段时间在编写一个数据处理类的时候同样遇到这个问题,经过一段时间思考和设计现实现了SQL查询语句对象化的功能:在这里我把自己小小的成果共享一下. 在讲解前先看几个例子(数据是SQLServer的Northw