MySQL SQL优化教程
转自:https://www.cnblogs.com/duanxz/archive/2013/02/01/2889413.html
一,查询SQL执行效率
通过show status命令了解各种SQL的执行效率。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
mysql> show status like 'Com_%';+---------------------------+-------+| Variable_name | Value |+---------------------------+-------+| Com_admin_commands | 0 || Com_assign_to_keycache | 0 || Com_alter_db | 0 || Com_alter_db_upgrade | 0 || Com_alter_event | 0 || Com_alter_function | 0 || Com_alter_procedure | 0 || Com_alter_server | 0 || Com_alter_table | 0 || Com_alter_tablespace | 0 || Com_analyze | 0 || Com_begin | 0 || Com_binlog | 0 |... |
Com_xxx表示每个xxx语句执行的次数。
Com_select:执行select操作的次数,一次查询只累加1。
Com_inset:执行insert操作的次数,对于批量插入的insert操作,只累加一次。
Com_update:执行update操作的次数。
Com_delete:执行delete操作的次数。
通过查询,可以了解当前数据库的应用是以插入更新为主还是以查询操作为主,以及各种类型的SQL大致的执行比例是多少。
二,定位执行效率较低的SQL语句
通过慢查询日志定位那么执行效率较低的SQL语句,启用慢查询后,mysqld写一个包含所有执行时间超过long_query_time秒的SQL语句的日志文件。
慢查询日志在查询结束以后才记录,所以在应用放映执行效率出现问题的时候查询慢查询的日志并不能定位问题。
|
1
2
3
4
5
6
7
|
mysql> explain select * from employee_tbl where id = 3;+----+-------------+--------------+-------+---------------+---------+---------+-------+------+-------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+--------------+-------+---------------+---------+---------+-------+------+-------+| 1 | SIMPLE | employee_tbl | const | PRIMARY | PRIMARY | 4 | const | 1 | |+----+-------------+--------------+-------+---------------+---------+---------+-------+------+-------+1 row in set |
select_type:表示select的类型,常见的取值有SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个select)等。
table:输出结果集的表。
type:表示MySQL在表中找到所需行的方式,或者叫访问类型。
常见类型,从左至右,性能由最差到最好:
|
1
|
ALL < index < range < ref < eq_ref < const,system < NULL |
1,type=ALL,全表扫描,MySQL遍历全表来找到匹配的行。
2,type=index,索引全扫描,MySQL遍历整个索引来查询匹配的行。
3,type=range,索引范围扫描,常见于<,<=,>,>=,between等操作符。
4,type=ref,使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录行。
5,type=eq_ref,类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中有一条记录匹配,简单来说,就是多表连接中使用primary key或者unique index作为关联条件。
6,type=const/system,单表中最多有一个匹配行,查询起来非常迅速,所以这个匹配行中的其他列的值可以被优化器在当前查询中当做常量来处理,例如,根据主键primary key或者唯一索引unique index记性的查询。
7,type=NULL,MySQL不用访问表或者索引,直接就能够得到结果。
三,通过show profile分析SQL
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
//查看当前MySQL是否支持profilemysql> select @@have_profiling;+------------------+| @@have_profiling |+------------------+| YES |+------------------+1 row in set//默认profiling是关闭的,可以通过set语句在session级别开启profilingmysql> select @@profiling;+-------------+| @@profiling |+-------------+| 0 |+-------------+1 row in setmysql> set profiling=1;Query OK, 0 rows affectedmysql> show profiles;+----------+-----------+-----------------------------------------+| Query_ID | Duration | Query |+----------+-----------+-----------------------------------------+| 1 | 0.0001725 | select * from employee_tbl where id = 3 |+----------+-----------+-----------------------------------------+1 row in setmysql> show profile for query 1;+--------------------------------+----------+| Status | Duration |+--------------------------------+----------+| starting | 2.6E-5 || Waiting for query cache lock | 3E-6 || checking query cache for query | 6E-6 || checking privileges on cached | 3E-6 || checking permissions | 7E-6 || sending cached result to clien | 0.000123 || logging slow query | 4E-6 || cleaning up | 2E-6 |+--------------------------------+----------+8 rows in set |
Sending dat状态表示MySQL线程开始访问数据行并把结果返回给客户端,而不仅仅是返回结果给客户端。由于在Sending data状态下,MySQL线程往往需要做大量的磁盘读取操作,所以经常是整个查询中耗时最长的状态。
四,通过trace分析优化器如何选择执行计划
MySQL 5.6提供了对SQL的跟踪trace,通过trace文件能够进一步了解为什么优化器选择A执行计划而不选择B执行计划,帮助我们更好地理解优化器的行为。
MySQL SQL优化教程的更多相关文章
- Mysql 性能优化教程
Mysql 性能优化教程 目录 目录 1 背景及目标 2 Mysql 执行优化 2 认识数据索引 2 为什么使用数据索引能提高效率 2 如何理解数据索引的结构 2 优化实战范例 3 认识影响结果集 4 ...
- 转 Mysql性能优化教程
Mysql性能优化教程 背景及目标 厦门游家公司(4399.com)用于员工培训和分享. 针对用户群为已经使用过mysql环境,并有一定开发经验的工程师 针对高并发,海量数据的互联网环境. 本文语言为 ...
- mysql sql优化实例
mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...
- Mysql SQL优化&执行计划
SQL优化准则 禁用select * 使用select count(*) 统计行数 尽量少运算 尽量避免全表扫描,如果可以,在过滤列建立索引 尽量避免在where子句对字段进行null判断 尽量避免在 ...
- 18.Mysql SQL优化
18.SQL优化18.1 优化SQL语句的一般步骤 18.1.1 通过show status命令了解各种SQL的执行频率show [session|global] status; -- 查看服务器状态 ...
- mysql sql优化及注意事项
sql优化分析 通过slow_log等方式可以捕获慢查询sql,然后就是减少其对io和cpu的使用(不合理的索引.不必要的数据访问和排序)当我们面对具体的sql时,首先查看其执行计划A.看其是否使用索 ...
- MySQL sql优化(摘抄自文档)
前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. 优化目标 ...
- MySQL SQL优化
一.优化数据库的一般步骤: (A) 通过 show status 命令了解各种SQL的执行频率. (B) 定位执行效率较低的SQL语句,方法两种: 事后查询定位:慢查询日志:--log-slow-qu ...
- MySQL SQL优化之in与range查询【转】
本文来自:http://myrock.github.io/ 首先我们来说下in()这种方式的查询.在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效 ...
随机推荐
- java攻城师之路--复习java web之servlet
需要掌握的知识点:1.Servlet程序编写 ----- 生命周期2.ServletAPI Request Response 3.Cookie 和 Session Servlet 用来 动态web资源 ...
- json 新用
如果使用struts2的action,可以省去属性赋值的工夫. 但是假如你没有使用struts2,而且使用的是ajax请求,通过json来传递参数.那我下面所说的对你可能是一个很好的解脱,从此告别re ...
- Python语言之数据结构1(序列--列表,元组,字符串)
0.序列 列表,元组,字符串都是序列. 序列有两个特点:索引操作符和切片操作符.索引操作符让我们可以从序列中抓取一个特定项目.切片操作符让我们能够获取序列的一个切片,即一部分序列. 以字符串为例: 1 ...
- 利用 CSS animation 和 CSS sprite 制作动画
CSS3 大大强化了制作动画的能力,但是如果要做出图案比较复杂的动画,选择 GIF 依然是一个不错的选择.今天给大家介绍一个使用 CSS animation 配合雪碧图(CSS sprite)来制作动 ...
- SGU100
Read integers A and B from input file and write their sum in output file. Input Input file contains ...
- Ajax基本写法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- homework week 1
第一周的作业 首先来完成第二个作业, 编写登录接口, 因为视频上并没有相关的教程, 就在网上搜了一下读写文件的语句, 粗略了解. f1 = open("data.txt",&quo ...
- 第五节:DataFrame聚合函数
- 腾讯云&搭建微信小程序服务
准备域名和证书 任务时间:20min ~ 40min 小程序后台服务需要通过 HTTPS 访问,在实验开始之前,我们要准备域名和 SSL 证书. 域名注册 如果您还没有域名,可以在腾讯云上选购,过程可 ...
- BZOJ 1232 USACO 2008 Nov. 安慰奶牛Cheer
[题解] 对于每一条边,我们通过它需要花费的代价是边权的两倍加上这条边两个端点的点权. 我们把每条边的边权设为上述的值,然后跑一边最小生成树,再把答案加上最小的点权就好了. #include<c ...