您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    SQL优化技巧总结,及案例剖析
    时间:2020-03-05 21:13 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    运用的日志出现超时等错误

    可以运用sar命令,top命令查看以后系统形状。

    也可以经过Prometheus、Grafana等监控工具察看系统形状。

    SQL优化技巧总结,及案例剖析

    SQL语句表象

    冗长

    执行时间过长

    从全表扫描获取数据

    执行方案中的rows、cost很大

    冗长的SQL都好了解,一段SQL太长阅读性一定会差,而且出现成绩的频率一定会更高。更进一步判别SQL成绩就得从执行方案入手,如下所示:

    SQL优化技巧总结,及案例剖析

    执行方案通知我们本次查询走了全表扫描Type=ALL,rows很大(9950400)基本可以判别这是一段"有滋味"的SQL。

    获取成绩SQL

    不同数据库有不同的获取办法,以下为目前主流数据库的慢查询SQL获取工具

    MySQL

    慢查询日志

    测试工具loadrunner

    Percona公司的ptquery等工具

    Oracle

    AWR报告

    测试工具loadrunner等

    相关外部视图如v$、$session_wait等

    GRID CONTROL监控工具

    达梦数据库

    AWR报告

    测试工具loadrunner等

    达梦功用监控工具(dem)

    相关外部视图如v$、$session_wait等 

    SQL编写技巧

    SQL编写有以下几个通用的技巧:

    • 合理运用索引

    索引少了查询慢;索引多了占用空间大,执行增删改语句的时分需求静态维护索引,影响功用 选择率高(重复值少)且被where频繁援用需求树立B树索引;

    普通join列需求树立索引;复杂文档类型查询采用全文索引效率更好;索引的树立要在查询和DML功用之间取得平衡;复合索引创立时要留意基于非前导列查询的状况

    • 运用UNION ALL替代UNION

    UNION ALL的执行效率比UNION高,UNION执行时需求排重;UNION需求对数据停止排序

    • 避免select * 写法

    执行SQL时优化器需求将 * 转成详细的列;每次查询都要回表,不能走掩盖索引。

    • JOIN字段建议树立索引

    普通JOIN字段都提早加上索引

    • 避免复杂SQL语句

    提升可阅读性;避免慢查询的概率;可以转换成多个短查询,用业务端处置

    • 避免where 1=1写法

    • 避免order by rand()相似写法

    RAND()招致数据列被屡次扫描

    SQL优化

    执行方案

    完成SQL优化一定要先读执行方案,执行方案会通知你哪些中央效率低,哪里可以需求优化。我们以MYSQL为例,看看执行方案是什么。(每个数据库的执行方案都不一样,需求自行了解)explain sql

    SQL优化技巧总结,及案例剖析

    接上去我们用一段实践优化案例来阐明SQL优化的进程及优化技巧。

    优化案例

    表结构

    CREATE TABLE `a`(    `id`          int(11) NOT NULLAUTO_INCREMENT,    `seller_id`   bigint(20)                                       DEFAULT NULL,    `seller_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,    `gmt_create`  varchar(30)                                      DEFAULT NULL,    PRIMARY KEY (`id`));CREATE TABLE `b`(    `id`          int(11) NOT NULLAUTO_INCREMENT,    `seller_name` varchar(100) DEFAULT NULL,    `user_id`     varchar(50)  DEFAULT NULL,    `user_name`   varchar(100) DEFAULT NULL,    `sales`       bigint(20)   DEFAULT NULL,    `gmt_create`  varchar(30)  DEFAULT NULL,    PRIMARY KEY (`id`));CREATE TABLE `c`(    `id`         int(11) NOT NULLAUTO_INCREMENT,    `user_id`    varchar(50)  DEFAULT NULL,    `order_id`   varchar(100) DEFAULT NULL,    `state`      bigint(20)   DEFAULT NULL,    `gmt_create` varchar(30)  DEFAULT NULL,    PRIMARY KEY (`id`)); 

    三张表关联,查询以后用户在以后时间前后10个小时的订单状况,并依据订单创立时间升序陈列,详细SQL如下

    (责任编辑:admin)