记一次SQL调优
insert优化
如果你在某一时刻有大量的insert操作,一条一条插入是非常耗时的。insert语句本身支持一次插入很多条记录,插入记录数上限受sql语句长度限制,一般一次插个几千条是没问题的。在我的 《如何手动实现Try Insert和Insert Or Update》 一文中对于各种情况都有具体的例子,这里就不赘述了。
explain语句结果分析
SQL本身是一种对机器来说抽象级别很高的语言,我们通过SQL告诉DBMS我们需要什么,而没有告诉它具体要怎么做。DBMS会猜测性地以最优的方法去完成我们给的任务,但是它往往做得不太好,毕竟不同业务最优做法各不相同,目前我们还没有办法让机器完全理解我们的业务。所以我们需要辅助机器,帮助它找到最好的查询逻辑。通常的做法是添加合适的索引,让所有的查询都走索引。在MySQL中,在任何一个select语句前加上explain,就可以知道MySQL对这条查询的理解和实际执行逻辑。
下面来分析explain语句返回的结果。explain会展示查询涉及到的每张表分析结果,里面有很多参数,我们一般只需要关注以下几个参数:
type
type描述表是怎么
join的,按从最好到最坏一共有以下几个值:值 解释 system 表只有一行,是一种特殊的 consttypeconst 表里只有一行匹配的记录, join时可以认为是常量eq_ref 使用的索引为 primary key或unique not null indexref join只使用最左前缀匹配原则的普通索引fulltext 使用全文检索索引 ref_or_null 与 ref差不多,主要是多了NULL值的查询index_merge 使用了MySQL的索引合并优化 unique_subquery 类似 eq_ref,主要用于包含IN子查询的查询range 走索引的范围查询 index 索引树被整个扫了,速度比扫表好一点 ALL 整个表被扫,非常糟糕的情况,一般要避免 一般做SQL优化,通常出现
index和ALL都是需要优化的。Extra
MySQL查询的附件信息,有时候代表着查询的额外代价,出现
Using filesort、Using temperary都表示查询速度不行。Using filesort表示order by子句不走索引,使用文件排序,需要对order by进行优化。Using temperary表示查询过程中创建了临时表,通常发生在包含group by和order by的查询中。
rows和filtered
rows表示MySQL预估的查询需要的行数,filtered表示根据条件过滤之后的行所占的百分比。值为100表示没有行被过滤掉。所以rows*filtered查询需要的总的行数。这个值自然是越小越好。
查询优化实践
查询优化的策略就是加索引,primary key 和 unique key在根据具体业务定,我们做优化,一般都是添加普通索引。普通索引分为两种,单个字段的索引和多个字段的联合索引。联合索引的应用场景相对窄一点,如果你要查的数据可以被联合索引全部囊括,直接从索引拿数据,可以考虑使用联合索引。读多写少重复值少散列分布的字段最适合建索引。你可以把你的程序使用到的所有SQL都列出来,一条一条explain,没有走索引的,就酌情给某个或某几个字段(join里的字段、where里的字段都是重点考虑对象)加上索引,直到所有的查询走索引为止。这么做以后,你的查询type正常都可以到达比较好的情况,但是对于包含order by子句的查询,可能你的Extra信息就不太理想了。Using filesort和Using temperary有时候阴魂不散,很难搞。这时候最佳的策略就是变着花样选择排序的字段。比如你的表有一个自增主键,你可以考虑用它作为插入时间来做排序。MySQL本身在这方面的优化非常糟糕,需要耐心地多尝试。
Reference
记一次SQL调优的更多相关文章
- 记一次SQL调优/优化(SQL tuning)——性能大幅提升千倍以上
好久不写东西了,一直忙于各种杂事儿,恰巧昨天有个用户研发问到我一个SQL调优的问题,说性能太差,希望我能给调优下,最近有些懒,可能和最近太忙有关系,本来打算问问现在的情况,如果差不多就不调了,那哥们儿 ...
- 记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?)
记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?) 前几天帮客户优化一个数据库,那个数据库的大小是6G 这麽小的数据库按道理不会有太大的性能问题的, ...
- SQL调优常用方法
在使用DBMS时经常对系统的性能有非常高的要求:不能占用过多的系统内存和 CPU资源.要尽可能快的完成的数据库操作.要有尽可能高的系统吞吐量.如果系统开发出来不能满足要求的所有性能指标,则必须对系统进 ...
- SQL调优
# 问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...
- 读《程序员的SQL金典》[4]--SQL调优
一.SQL注入 如果程序中采用sql拼接的方式书写代码,那么很可能存在SQL注入漏洞.避免的方式有两种: 1. 对于用户输入过滤敏感字母: 2. 参数化SQL(推荐). 二.索引 ①索引分类 聚簇索引 ...
- [SQL SERVER系列]读书笔记之SQL注入漏洞和SQL调优
最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“'1'='1'”这个表达式永远返回 true, ...
- SQL调优日志--内存问题
SQL调优日志--内存问题排查入门篇 概述 很多系统的性能问题,是由内存导致的.内存不够会导致页面频繁换入换出,IO队列高,进而影响数据库整体性能. 排查 内存对数据库性能非常重要.那么我当出现问 ...
- 读书笔记之SQL注入漏洞和SQL调优
原文:读书笔记之SQL注入漏洞和SQL调优 最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“' ...
- Oracle SQL 调优健康检查脚本
Oracle SQL 调优健康检查脚本 我们关注数据库系统的性能,进行数据库调优的主要工作就是进行SQL的优化.良好的数据架构设计.配合应用系统中间件和写一手漂亮的SQL,是未来系统上线后不出现致命性 ...
随机推荐
- Java实现Mysql的 substring_index 函数功能
Java实现Mysql数据库中 substring_index函数 前言: 由于hive中没有这个 substring_index函数,所以就自定义一个udf函数来调用使用.(不通过hive使用时可以 ...
- python TKinter的主窗口运行程序完毕后,怎么让其自动关闭
如题: 在pycharm 调试Tkinter程序的时候,关闭右上角的X 实际上并未退出进程,长期以往 再大的内存也会被耗尽. 一般就是下面的代码: """ from tk ...
- npm install 安装依赖报错
npm ERR! Unexpected end of JSON input while parsing near '...2.4.8","karma":"~0. ...
- Oracle基础教程(一)
本文链接:https://blog.csdn.net/GoldenKitten/article/details/84947386 以下内容为转载以上博客,自己做了略微的补充,如需查看原文,请点击上面的 ...
- C++ delete 和 delete []的区别
转载自https://blog.csdn.net/cbNotes/article/details/38900799 1.我们通常从教科书上看到这样的说明:delete 释放new分配的单个对象指针指向 ...
- SonarLint各种提示的意思
1.Refactor this method to reduce its Cognitive Complexity from 29 to the 15 allowed. 2.Method has 15 ...
- Java开发桌面程序学习(四)——常用应用布局模板和简单分析
布局 前言 刚开始的时候,不知道使用什么布局,发现SceneBuilder其实有8.5版本的,里面就是有提供一个简单的桌面程序模板,8.5可以去官网下载,不过网速好像有点慢,慢慢等吧,官网下载地址 布 ...
- 【LeetCode】2. 两数相加
题目 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- JAVA笔记 -- this关键字
this关键字 一. 基本作用 在当前方法内部,获得当前对象的引用.在引用中,调用方法不必使用this.method()这样的形式来说明,因为编译器会自动的添加. 必要情况: 为了将对象本身返回 ja ...
- git零基础快速入门实战,重点讲解,在实际生产中整合idea对版本、分支的管理等
1.什么是版本管理 (多人协作)项目中常见的问题: 代码放在什么地方 ?? 同步(到服务器),代码的冲突问题 ?? 服务器访问权限问题 ?? (代码)服务器内容修改的细节 ?? 项目版本的发布 ?? ...