⑴ 一条查询极为缓慢的sql语句,如何去优化呢
1、将查询条件字段简历index;
2、将尽可能筛选掉最大数据量的条件放到where条件最后面,因为sql执行时,where条件是由右往左执行。
3、尽可能少用like、in等函数
⑵ 如何进行SQL性能优化
这里分享下mysql优化的几种方法。
1、首先在打开的软件中,需要分别为每一个表创建 InnoDB FILE的文件。
⑶ 如何解决SQL查询速度太慢
1. 执行计划中明明有使用到索引,为什么执行还是这么慢?
2. 执行计划中显示扫描行数为 644,为什么 slow log 中显示 100 多万行?
a. 我们先看执行计划,选择的索引 “INDX_BIOM_ELOCK_TASK3(TASK_ID)”。结合 sql 来看,因为有 "ORDER BY TASK_ID DESC" 子句,排序通常很慢,如果使用了文件排序性能会更差,优化器选择这个索引避免了排序。
那为什么不选 possible_keys:INDX_BIOM_ELOCK_TASK 呢?原因也很简单,TASK_DATE 字段区分度太低了,走这个索引需要扫描的行数很大,而且还要进行额外的排序,优化器综合判断代价更大,所以就不选这个索引了。不过如果我们强制选择这个索引(用 force index 语法),会看到 SQL 执行速度更快少于 10s,那是因为优化器基于代价的原则并不等价于执行速度的快慢;
b. 再看执行计划中的 type:index,"index" 代表 “全索引扫描”,其实和全表扫描差不多,只是扫描的时候是按照索引次序进行而不是行,主要优点就是避免了排序,但是开销仍然非常大。
Extra:Using where 也意味着扫描完索引后还需要回表进行筛选。一般来说,得保证 type 至少达到 range 级别,最好能达到 ref。
在第 2 点中提到的“慢日志记录Rows_examined: 1161559,看起来是全表扫描”,这里更正为“全索引扫描”,扫描行数确实等于表的行数;
c. 关于执行计划中:“rows:644”,其实这个只是估算值,并不准确,我们分析慢 SQL 时判断准确的扫描行数应该以 slow log 中的 Rows_examined 为准。
4. 优化建议:添加组合索引 IDX_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID)
优化过程:
TASK_DATE 字段存在索引,但是选择度很低,优化器不会走这个索引,建议后续可以删除这个索引:
select count(*),count(distinct TASK_DATE) from T_BIOMA_ELOCK_TASK;+------------+---------------------------+| count(*) | count(distinct TASK_DATE) |+------------+---------------------------+| 1161559 | 223 |+------------+---------------------------+
在这个 sql 中 REL_DEVID 字段从命名上看选择度较高,通过下面 sql 来检验确实如此:
select count(*),count(distinct REL_DEVID) from T_BIOMA_ELOCK_TASK;+----------+---------------------------+| count(*) | count(distinct REL_DEVID) |+----------+---------------------------+| 1161559 | 62235 |+----------+---------------------------+
由于有排序,所以得把 task_id 也加入到新建的索引中,REL_DEVID,task_id 组合选择度 100%:
select count(*),count(distinct REL_DEVID,task_id) from T_BIOMA_ELOCK_TASK;+----------+-----------------------------------+| count(*) | count(distinct REL_DEVID,task_id) |+----------+-----------------------------------+| 1161559 | 1161559 |+----------+-----------------------------------+
在测试环境添加 REL_DEVID,TASK_ID 组合索引,测试 sql 性能:alter table T_BIOMA_ELOCK_TASK add index idx_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID);
添加索引后执行计划:
这里还要注意一点“隐式转换”:REL_DEVID 字段数据类型为 varchar,需要在 sql 中加引号:AND T.REL_DEVID = 000000025xxx >> AND T.REL_DEVID = '000000025xxx'
执行时间从 10s+ 降到 毫秒级别:
1 row in set (0.00 sec)
结论
一个典型的 order by 查询的优化,添加更合适的索引可以避免性能问题:执行计划使用索引并不意味着就能执行快。
⑷ 开发中,SQL语句优化有哪些方法
看你数据库类型和框架是否支持。
一般开发中遇到慢SQL存在3个问题(索引健全的情况下)。
数据量多导致总行数慢,因为数据在不归档、迁移、转总账的情况下会不断积压。权限越高看见的数据量就越大,数据量越大总行数就越高。一般框架是以分页的SQL为基础计算总行数的。这样就会导致扫描行数高物理读高查询速度慢。优化方案就是总行数进行状态归档,以归档+实时的方式展现出来
连表超过多,部分数据表是单独的,但是不同部门的数据又有关联性,领导要看全生命周期或者流程数据的情况下必须多表相连。这样由于N个明细表导致笛卡儿积先不说,逻辑复杂连表多会消耗CPU,哪怕你查询能500毫秒内显示但是如果多人同时查就让CPU超100%甚至做成锁等待等堵塞。这个情况就是要用类似“云计算”的分布式计算。通过触发器、存储过程等规定时间内吧业务表数据计算好并写到展示表中,直接通过展示表进行关联,这样锁表也于业务表无关,关联表也能变少达到减少CPU消耗的目的。
iops与cpu占比高导致数据库瘫痪。第2点看出如果CPU高数据库全SQL都会慢,IOPS也一样。SQL慢会导致事务中的查询慢,解放事务变慢了其他查询就会锁等待状态变成堵塞。所以遇到大规模的查询是否先查主键然后通过游标一个一个计算再进临时表。这个是消耗时间和内存换CPU和IOPS的一个例子。反正服务器资源最高怎样开发应该是了解的,如何管制资源之间的平衡这个很重要。
举个例子,部分MYSQL框架喜欢一次性把数据库都导出来,然后减少子查询,这个算法针对有效的基础数据这样是可行的。针对业务数据应该没人会用,但是基础数据中也可能会存在海量的情况,比如坐标轨迹、省市区、电话号码归属等。如果无脑应用这个框架会导致查询起来很慢。
⑸ 复杂慢sql语句如何优化
很简单啊,优先索引,第二结构,第三算法。
索引最简单,如果是SQL server客户端或者toad可以提示有哪些需要进行优化的地方。
结构就是针对要查询的值,尽量集中到一个表,减少串表,函数查询,左链的表字段查询。
算法就是OR还是IN?串表时IN还是EXISTS ?oracle in 的限制。条件执行顺序等。
然后还有其他注意的,例如只查固定字段就不要 select * 只要注意以上步骤,千万级数据串10个秒也能1秒内显示出来。
有条件的话,当然是用归档数据进行查询,这样就不会占用业务数据IO了,最后一步就是“云计算”(解析有一百种,没有统一概念,我的意识其实就是归档过程中根据分组维度计算好,并根据日期放进相关的表,减少表粒度,只进行简单的select查询)
⑹ sql优化 查询太慢,需要提高查询速度
你的这个查询要优化的地方不是not in, 而是整个查询的结构: 使用了太多的子查询,而且都是查找的相同的表(GISDUCT表查询4次),这肯定不是好的查询方法,应该把你要达到的目的再思考,转化成合适的查询语句。
个人认为,你算OCCUPYCOUNT和TOTALCOUNT的子查询应该可以在一个查询中搞定的,因为都是查询GISDUCT表,只是统计取值的条件有所不同罢了,而按条件统计可以用类似“case when 条件 then count(xxx) else 0 end”的结构来实现。有问题可再讨论。
⑺ sql server数据库查询慢怎么优化
在安装有SQLServer数据库的计算机上,我们在使用数据库的过程中,有时候会在任务管理器里发现sqlservr.exe这个进程的内存和CPU占用率较高。
接下来我们来看一下,如何解决上面这个问题,需要设置SQLServer数据库的内存配置。登录数据库,这里使用的是SQLServer2008,右键点击最上方的服务器名,在弹出的菜单中,点击【属性】
打开服务器属性窗口。默认显示的是第一项【常规】内容,点击第二项【内存】进行内存配置。
点击【内存】后,打开服务器内存选项配置界面。这里的【使用AWE分配内存】可以对内存进行扩展支持,我们要做的是更改下方的最大服务器内存。这个数值根据自己服务器内存大小来做适当设置。
5
个人建议设置本机内存的一半或稍微高一点,如机器内存为2G,那么我们这里填写1000。需要注意的是内存设置调小以后,在数据库执行较复杂SQL语句的时候,可能会比较慢,出现这种情况,我们再适当上调最大内存配置大小。
⑻ 如何优化慢查询的SQL语句
优化方法一般从几个方面这几个考虑:
1、根据业务情况,精简代码逻辑,
2、根据读写方式,降低数据表读写量
3、关键条件列增加合适的索引
4、对于碎片多的索引进行重建
多数情况下只需要考虑前两条就能解决很大的效率问题,业务模式可能在最初开发的时候,因需求分析不彻底,或者需求理解不深入,导致逻辑不合理,或者后续多次变动业务模式,新增功能与最初的开发理念发生变化,这时就应该对代码的逻辑进行重新优化改写。
⑼ 查询特别慢 如何优化SQL
思路:
首先,要确定使用的是什么数据,
若是MSSQL,那么需要看一下查询计划,然后逐一解决慢的问题;
若是Access,那么就要看表的索引创建是否合适,另外Access还有一个弊病,就是数据库大于10MB后,速度和性能将极大的下降
⑽ SQL语句执行起来真的很慢,请大家帮忙优化一下
先建立索引,索引名随便起:
CREATE INDEX index_name ON COPTD(TD004);
CREATE INDEX index_name ON MOCTB(TD004);
CREATE INDEX index_name ON MOCTA(TD004);
insert into ZDIDAN(DD01,DD02,DD03) SELECT distinct TD004,SUM(TD08),'O' FROM COPTD,MOCTA,MOCTB where COPTD.TD004=MOCTA.TD004 and MOCTB.TD004=MOCTA.TD004 and COPTD.TD021 = 'Y' AND COPTD.TD016 = 'N' AND COPTD.TD008+COPTD.TD024-COPTD.TD009-COPTD.TD025 > 0 and TB001+TB002=TA001+TA002 and TA013='Y' AND TA011 < 'Y' AND TB004>TB005 GROUP BY COPTD.TD004;