---- Oracle优化10-SQL_TRACE解读 Oracle优化11-10046事件 ---- 概述 当我们想了解一条SQL或者是PL/SQL包的运行情况时,特别是当他们的性能非常差时,比如有的时候看起来就好好像卡在什么地方一样 altered #对当前的会话开启sql_trace SQL> alter session set sql_trace=true; Session altered SQL> 执行具体的sql Misses in library cache during parse: 1–shared pool中没有命中,说明这是一次硬解析,软解析这里为0 Optimizer mode: ALL_ROWS–当前的优化器模式 递归SQL: 执行一条SQL语句衍生出执行的一些其他的SQL,这些衍生出来的SQL就叫做递归SQL。 的深度, og=1:optimizer goal优化器模式, plh=282154677:, tim=1481751318263300:时间戳 ---- STATS部分 id=2 :执行计划的行源号
sql语句层的优化主要包括锁的使用、慢查询的定位、limit分页优化 1. 慢查询定位 2.1 临时启动慢查询日志 默认未开启 $ mysqld --safe-mode -slow-query-log # 慢查询阈值默认10秒,修改为1秒 mysql> show variables profiling = 1; (2) 查询时间 mysql> show profiles; (3) 不需要分析时关闭profile mysql> set profiling = 0; 3. limit分页优化 预处理:(1) 设置主键索引 (2) 关闭查询缓存 分页算法: limit (page-1)*length, length; 优化方法: 业务上解决:不允许翻过100页 不用offset,用条件查询
mysql学习总结10 — 优化(sql语句层)-锁与sql优化 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.com/csxiaoyaojianxian Email: sunjianfeng@csxiaoyao.com QQ: 1724338257 sql语句层的优化主要包括锁的使用、慢查询的定位、limit分页优化 1. 慢查询定位 2.1 临时启动慢查询日志 默认未开启 $ mysqld --safe-mode -slow-query-log # 慢查询阈值默认10秒,修改为1秒 mysql> show variables profiling = 1; (2) 查询时间 mysql> show profiles; (3) 不需要分析时关闭profile mysql> set profiling = 0; 3. limit分页优化 预处理:(1) 设置主键索引 (2) 关闭查询缓存 分页算法: limit (page-1)*length, length; 优化方法: 业务上解决:不允许翻过100页 不用offset,用条件查询
另外字段尽可能用not null 3、当然无可避免某些字段会用到text,varchar等字符类型,最好将text艾段的单独出另外一个表出来(用主键关联好) 4、 字段的类型,以及长度,是一个很考究开发者优化功力的一个方面 如果表数据有一定的量了,不妨用PROCEDURE ANALYSE()命令来取得字段的优化建议! 别的操作都进不来了,就我来说有时候我宁愿用for循环来一个个执行这些操作 9、不要用永久连接mysql_pconnet();除非你真的非常肯定你的程序不会发生意外,不然很可能也会导致你的mysql死掉 10
SQL 优化一般步骤 | 通过慢查日志等定位那些执行效率较低的 SQL 语句 | explain 分析SQL的执行计划 需要重点关注 type、rows、filtered、extra。 优化 SQL 语句:修改 SQL、IN 查询分段、时间查询分段、基于上一次数据过滤 改用其他实现方式:ES、数仓等 数据碎片处理 场景分析 | 案例 1:最左匹配 索引: KEY `idx_shopid_orderno by c desc limit 10000, 10; 对于大分页的场景,可以优先让产品优化需求,如果没有优化的,有如下两种优化方式: 一种是把上一次的最后一条数据,也即上面的 c 传过来,然后做“c | 案例 7:优化器选择不使用索引的情况 如果要求访问的数据量很小,则优化器还是会选择辅助索引,但是当访问的数据占整个表中数据的蛮大一部分时(一般是 20% 左右),优化器会选择通过聚集索引来查找数据。 | 案例 10:大数据 对于推送业务的数据存储,可能数据量会很大,如果在方案的选择上,最终选择存储在 MySQL 上,并且做 7 天等有效期的保存。
一、一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts! =1 not in/not exists都不是好习惯 可以优化为in查询: select * from order where status in(2,3) (2)前导模糊查询不能使用索引 select 可以优化为: select * from user where login_name=? limit 1 原因:你知道只有一条结果,但数据库并不知道,明确告诉它,让它主动停止游标移动 (10)把计算放到业务层而不是数据库层,除了节省数据的CPU,还有意想不到的查询缓存优化效果 select * from order where date < = CURDATE() 这不是一个好的SQL实践,应该优化为: $curDate = date('Y-m-d'); $res = mysql_query
DISTINCT:将重复的行从vt8中去除产生vt9 10. ORDER BY:将vt9的行按order by子句中的列列表排序生成一个游标vc10 11. TOP:从vc10的开始处选择指定数量或比例的行生成vt11 并返回调用者 看到这里,那么用过Linq to SQL的语法有点相似啊? 只要我们在查询语句中没有强制指定索引,索引的选择和使用方法是SQLSERVER的优化器自动作的选择,而它选择的根据是查询语句的条件以及相关表的统计信息,这就要求我们在写SQL语句的时候尽量使得优化器可以使用索引 为了使得优化器能高效使用索引,写语句的时候应该注意: (1)不要对索引字段进行运算,而要想办法做变换,比如: SELECT ID FROM T WHERE NUM/2=100 应改为: SELECT ID AND 月=10 (3)不要对索引字段进行格式转换 日期字段的例子: WHERE CONVERT(VARCHAR(10), 日期字段,120)='2010-07-15' 应该改为 WHERE 日期字段
1.1.order by优化1.1.1.知识点回顾在讲解order by优化前,先回顾一下order by的语法知识。 asc , age desc;1.1.2.两种排序方式MySQL有两种排序方式Using filesort和Using index,Using index的性能高于Using filesort,我们在优化排序操作时 ,尽量要优化为 Using indexUsing filesort : 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 1.1.3.order by优化案例演示1.1.3.1.案例A在上面我们创建了字段age和phone的联合索引,而且没有指定索引的排序顺序,此时索引在表中默认是按照升序排列的。 :MySQL有两种排序方式Using filesort和Using index,在优化排序操作时,尽量要优化为 Using index根据排序字段建立合适的索引,多字段排序时,索引需要遵循最左前缀法则。
优化手段: ① SQL优化 避免 SELECT *,只查询需要的字段。 小表驱动大表,即小的数据集驱动大的数据集: 当B表的数据集比A表小时,用in优化 exist两表执行顺序是先查B表再查A表查询语句:SELECT * FROM tb_dept WHERE id in ( SELECT id FROM tb_dept) ; 当A表的数据集比B表小时,用exist优化in ,两表执行顺序是先查A表,再查B表,查询语句:SELECT * FROM A WHERE EXISTS ② 优化索引的使用 尽量使用主键查询,而非其他索引,因为主键查询不会触发回表查询。 = 或者 <> 操作符,查询引用会放弃索引而进行全表扫描 列表数据使用分页查询,每页数据量不要太大 避免在索引列上使用 is null 和 is not null ③ 表结构设计优化 使用可以存下数据最小的数据类型
MySQL常见的优化手段分为下面几个方面: SQL优化、设计优化,硬件优化等,其中每个大的方向中又包含多个小的优化点 SQL优化 此优化方案指的是通过优化 SQL 语句以及索引来提高 MySQL 数据库的运行效率 ,具体内容如下: 分页优化 例如: select * from table where type = 2 and level = 9 order by id asc limit 190289,10; 复制代码 id from table where type = 2 and level = 9 order by id asc limit 190289,10 ) b where a.id = b.id 复制代码 where id > (select * from table where type = 2 and level = 9 order by id asc limit 190289, 1) limit 10 ,代价很高 慢查询日志 出现慢查询通常的排查手段是先使用慢查询日志功能,查询出比较慢的 SQL 语句,然后再通过 Explain 来查询 SQL 语句的执行计划,最后分析并定位出问题的根源,再进行处理
SQL 优化 负向查询不能使用索引 select name from user where id not in (1,3,4); 应该修改为: select name from user where id user where create_time < FROM_UNIXTIME(CURDATE()); 最左前缀问题 如果给 user 表中的 username pwd 字段创建了复合索引那么使用以下SQL
性能问题 a.分析SQL的执行计划 : explain ,可以模拟SQL优化器执行SQL语句,从而让开发人员 知道自己编写的SQL状况 b.MySQL查询优化其会干扰我们的优化 优化方法,官网:https 在真正执行前 经过了SQL优化器的调整,结果与上条SQL是一致的。 explain select * from book where authorid = 1 and typeid =2 ; -- SQL优化,是一种概率层面的优化。 =2 ; 体验概率情况(< > =):原因是服务层中有SQL优化器,可能会影响我们的优化。 ,是一个大部分情况适用的结论,但由于SQL优化器等原因 该结论不是100%正确。
SQL书写习惯 SQL语句尽量使用大写。 Oracle解析SQL语句时,会把小写的字母转换成大写的再执行。 例:select *from tempagreement where rownum<10; SELECT * FROM TEMPAGREEMENT WHERE ROWNUM<10; 两句的查询相差0.5 T_ID=T2.T_ID 表连接语句 AND T1.T=’Y’ 条件语句 从下至上的顺序 相同查询要保持SQL 只有第一列被WHERE子句引用时,优化器才会选择使用该索引。当仅引用索引的第二列时,优化器使用全表扫描而忽略了索引。
开启从本地加载文件导入数据的开关 set global local_infile =1; #执行load指令将准备好的数据,加载到表结构中 load data local infile '/root/sql1 一个常见又非常头疼的问题就是liit2000000,10,此时需要MySQL排序前2000010记录,仅仅返回2000000-2000010的记录,其他记录丢弃,查询排序的代价非常大。 优化思路:一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化。 explain select from tb sku t,(select id from tb sku order by id limit 2000000,10)a where t.id = a.id; count() InoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。
Mysql查询优化方法 重点 思路:便面全表扫描 禁止用* 来查询,需要指定字段 in的个数在1000个以内 查询一条数据使用limit 1 尽量使用inner join 避免使用left join ! = 用 > or < 替换 between代替in exist 代替in 例如:优化前10s,优化后5s SELECT * from product WHERE title IN (SELECT title Master_UUID: Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting :No 两种解决办法_Lucky@Dong的博客-CSDN博客 (opens new window)MySQL主从同步故障:Slave_SQL_Running:No 两种解决办法_Lucky@Dong
SQL的编写尽量使用索引库查询。索引库查询是小表查询操作,耗费的查询数据性能时间较少。索引失效是由like模糊匹配所产生的查询性能问题。 SQL的编写过程涉及到的子查询不能嵌套太多,子查询会在运行内存中给数据输出对象分配内存空间。嵌套分配内存不利于内存空间的释放。表与表之间的关联关系建立通过外键和主表的主键进行关联。 SQL的数据输出数据区尽量使用简单的数据。聚集函数在SQL的输出数据区存在会生成数据输出集合,类似复杂数据对象不利于数据的检索。聚集函数输出数据会产生索引失效,需要重新对输出数据建立索引。 SQL的条件过滤is null 是不会扫描索引表。节省数据索引表的内存空间。条件or关键字尽量少用,也是不会和数据索引表产生关联。数据表的小表类似索引表,大表类似数据库记录表。
1.有哪些数据库优化方面的经验? 用PreparedStatement, 一般来说比Statement性能高:一个sql 发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存。 基于语句的复制: 在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。 一旦发现没法精确复制时,会自动选着基于行的复制。
一、SQL语句编写注意问题 下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。 在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。 1. 联接列 对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。 下面是一个采用联接查询的SQL语句,这条语句完全可以查询出是否有Bill Cliton这个员工,但是这里需要注意,系统优化器对基于last_name创建的索引没有使用。 二、写优良SQL的基本规则 1、对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
无论是OLTP业务高并发写入,还是OLAP场景的大规模查询分析,SQL优化都是工程师必须掌握的核心能力。本文从原理到实践,系统讲解SQL优化的关键方法,帮助你在实际项目中显著提升查询效率。 一、SQL优化的核心思路SQL优化的本质是:减少扫描、减少计算、减少数据量、减少等待。 优化方式:使用索引字段排序避免对大表直接排序使用覆盖索引减少回表必要时使用临时表提前过滤四、执行计划分析(EXPLAIN)SQL优化必须依赖执行计划。 常见选择:OLTP:READCOMMITTED金融类强一致:REPEATABLEREAD或SERIALIZABLE六、缓存与分库分表当SQL优化到极限后,需要从架构层面优化。 ,而是一套系统方法:索引设计→SQL写法→执行计划分析→架构优化。
作者从基础的数据库索引开始全面讲述了SQL Server数据库应用程序的性能优化,包括数据库设计和数据访问代码。 系列文章如下: Top 10 steps to optimize data access in SQL Server. Server, this article focuses on using indexing to optimize data access Top 10 steps to optimize data Top 10 steps to optimize data access in SQL Server. Top 10 steps to optimize data access in SQL Server.