前言

数据库很重要!很重要!很重要! 重要的事情说三遍。所以单独用一篇来讲述SQL怎么优化。不过这里说到一点,不建议在业务代码里写很多复杂业务SQL,基本尽可能的减少 join,子查询 等,也就说尽量在应用层来解决问题,降低产生低效SQL的概率,数据库只是完成数据存储及最简单查询的组件。

SQL优化

主要4个方向,以下4个方向尽可能达到了,SQL的执行效率就提高了。

  1. 避免全表扫描
  2. SQL中尽可能不使用临时表
  3. 减小查询中间结果集大小
  4. 尽可能命中索引

发现慢SQL

DBA开启MySQL的慢查询日志,对每日数据库慢查询进行监控。慢查询后每日汇总提供开发进行处理。DBA给出指导意见。

分析执行计划
主要看对SQL的执行过程中

explain [extended] select … from … where …

得到结果是


其中 table 表示是哪个表的数据。

  • type比较重要。表示链接的类型。链接类型由好到坏的,依次是 system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL 一般情况,至少要达到 range 级别,最好是 ref 级别。否则可能会有性能问题。
  • possible_keys 是指可以应用到该表的索引,如果为NULL则没有。
  • key 是指用到的索引。
  • key_len 是索引的长度,在不影响查询精度的情况下,值越小越好。
  • ref 是指索引的那一列被使用了。一般会是个常数。
  • rows 是指有多少行。
  • extra 是指额外的信息。也是比较重要的。如果值为 distinct ,说明mysql 找到了域行联合匹配的行,就不再查找了。
  1. 如果值为 not exits : mysql优化了 left join ,一旦找到了 left join 匹配的行,便不再进行搜索了。
  2. 如果值为 rang checked for each : 没有找到理想的索引。
  3. 如果为 using filesort ,则需要改进sql了。这说明 mysql执行 需要 文件排序。这是比较影响效率的。
  4. 如果为 using temporary , 这是使用了 临时表。 这种情况也比较影响效率,sql需要改进。或者从应用层进行改进。
  5. 如果为 where used 说明使用了where语句。如果 type为 all 或者 index ,一般会出现这样的结果。这样的问题,一般是查询需要改进。

SQL优化实例

  • 分页查询
    第一种分页写法
select * from twhere thread_id = 771025and deleted = 0order by gmt_create asc limit 0, 15;

原理:
一次性根据过滤条件取出所有字段进行排序返回。
数据访问开销=索引IO + 索引全部记录结果对应的表数据IO
缺点:
该种写法越翻到后面执行效率越差,时间越长,尤其表数据量很大的时候。适用场景:当中间结果集很小(10000行以下)或者查询条件复杂(指涉及多个不同查询字段或者多表连接)时适用。

第二种分页写法:

select t.* from (select id from twhere thread_id = 771025 and deleted = 0 order by gmt_create asc limit 0, 15) a, t where a.id = t.id;

前提:
假设t表主键是id列,且有联合索引secondary key:(thread_id, deleted, gmt_create)
原理:
先根据过滤条件利用联合索引取出主键id进行排序,并内部的子查询只扫描了id字段,而非全表,再进行join操作取出其他字段。
数据访问开销=索引IO+索引分页后结果对应的表数据IO
优点:
每次翻页消耗的资源和时间都基本相同,就像翻第一页一样
适用场景:
当查询和排序字段(即where子句和order by子句涉及的字段)有对应覆盖索引时,且中间结果集很大的情况时适用

  • 批量SQL
    减少和数据库交互次数
 INSERT ... ON DUPLICATE KEY UPDATEREPLACE INTOINSERT IGNOREINSERT INTO VALUES()
  • 对同一个表的多次alter操作必须合并为一次操作。
    mysql对表的修改绝大部分操作都需要锁表并重建表,而锁表则会对线上业务造成影响。为减少这种影响,必须把对表的多次alter操作合并为一次操作。例如,要给表t增加一个字段b,同时给已有的字段aa建立索引, 通常的做法分为两步:
alter table t add column b varchar(10);

然后增加索引:

alter table t add index idx_aa(aa);

正确的做法是:

alter table t add column b varchar(10),add index idx_aa(aa);

总结
数据库是有状态的服务,变更复杂而且速度慢,如果把业务逻辑放到数据库中,将会限制业务的快速发展。建议把业务逻辑提前,放到前端或中间逻辑层,而把数据库作为存储层,实现逻辑与存储的分离。

系统优化怎么做-SQL优化相关推荐

  1. 系统优化怎么做-Tomcat优化

    系统优化怎么做-Tomcat优化 前言 Tomcat作为Web应用的服务器,目前绝大多数公司都是用其作为应用服务器的,应用服务器的执行效率会影响系统执行,这里会讲Tomcat怎样进行配置能提高处理性能 ...

  2. 系统优化怎么做-数据库优化

    前言 目前大部分公司的数据库都是MySQL,虽然现在NoSQL数据库比如mongo, hbase越来越流行了,但传统的MySQL依然是业界用得最多.本文是以MySQL为例. 数据库 数据库是唯一在应用 ...

  3. mysql5.6 临时表_MySQL5.6 运用临时表做SQL优化

    有一个系统从Oracle迁移到MySQL,在Oracle中运行很快,在MySQL基本运行不出来(等了10分钟都无法运行出来),该加的索引都加了,最后用临时表解决问题. SELECT COUNT(1) ...

  4. 超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎

    1. Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理 ...

  5. 【演讲实录】RWP团队谈SQL优化

    说到SQL优化,做为读者的您,头脑中第一反应是什么?索引?Hint?分区?参数?执行计划?哈哈哈有被言中吧 ,今天我们就来分享一下,在第七届数据技术嘉年华上,来自Oracle的曲卓分享的有关SQL优化 ...

  6. sql优化个人总结(全)

    sql优化总结--博客 第一次自己写博客,以后要坚持每掌握一个技能点,就要写一篇博客出来,做一个不满足于一个 只会写if...else的程序员. 最近三个月入职了一家新的公司,做的是CRM系统,将公司 ...

  7. MySQL高级-SQL优化步骤

    优化SQL步骤(explain等) 1 查看SQL执行频率 2 定位低效率执行SQL 3 explain分析执行计划 3.1 环境准备 3.2 explain 之 id 3.3 explain 之 s ...

  8. mysql存储过程更新数据后返回一个字段_史上最全存储引擎、索引使用及SQL优化的实践...

    整个MySQL Server由以下组成 : Connection Pool :连接池组件 Management Services & Utilities :管理服务和工具组件 SQL Inte ...

  9. SQL优化的详细步骤及工具的使用

    SQL优化 1.为什么要对SQL语句进行优化 在应用开发过程中,由于初期数据量小,开发人员在编写SQL时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多SQL语句开始逐渐显 ...

最新文章

  1. mysql主主复制、主从复制、半同步的实现
  2. 性能测试场景设计之用户模式设置
  3. boost::mp11::mp_transform相关用法的测试程序
  4. boost::gil::detail::homogeneous_color_base用法的测试程序
  5. 深度学习在自然语言处理的应用(Version 0.76)
  6. [html] websocket和socket有什么区别?
  7. VB.NET 中的 As New 以及型別指定
  8. 103_Power Pivot 透视表中空白标签处理及百分比
  9. Unity动画系统详解10:子状态机是什么?
  10. 20145209刘一阳《JAVA程序设计》第1周学习总结
  11. android之uniapp原生打包
  12. 201671010139 徐楠 关于学习继承
  13. 开源docker管理平台rancher 安装部署
  14. 如何获得Android手机的软件安装列表
  15. 人性的弱点【我要喜欢你】
  16. HelloWord你的第一个rainmeter皮肤
  17. 如何翻转视频,一键将多个视频垂直翻转播放
  18. 包装行业数智化采购管理系统提升企业采购效率,构筑智慧采购新生态
  19. 崩坏3服务器维护2月8号,崩坏3影骑士月轮将在2月8日更新后正式登场
  20. 服务器日志法网站分析的原理及优缺点

热门文章

  1. ssr pac_阴阳师新SSR千姬什么时候上线 ssr千姬活动上线时间一览
  2. Leetcode 剑指 Offer 40. 最小的k个数 (每日一题 20210825)
  3. Leetcode 剑指 Offer 03. 数组中重复的数字 (每日一题 20210614)
  4. 数据挖掘流程(二):数据预处理
  5. 万物之始正则表达式全解析三部曲(中篇)-正则表达式运算符优先级及匹配规则
  6. 深度学习核心技术精讲100篇(十七)-多标准中文分词( Multi-Criteria-CWS)
  7. android 二次点击退出,android返回二次退出
  8. 电压越低采集的ad值反而变大_80多条关于AD转换设计的经验总结
  9. tf.where() 详解
  10. Python编程基础:第四十一节 继承Inheritance