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是否支持profile mysql> select @@have_profiling; + ------------------+ | @@have_profiling | + ------------------+ | YES | + ------------------+ 1 row in set //默认profiling是关闭的,可以通过 set 语句在session级别开启profiling mysql> select @@profiling; + -------------+ | @@profiling | + -------------+ | 0 | + -------------+ 1 row in set mysql> set profiling=1; Query OK, 0 rows affected mysql> show profiles; + ----------+-----------+-----------------------------------------+ | Query_ID | Duration | Query | + ----------+-----------+-----------------------------------------+ | 1 | 0.0001725 | select * from employee_tbl where id = 3 | + ----------+-----------+-----------------------------------------+ 1 row in set mysql> 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查询,提升查询效 ...
随机推荐
- (转)postgis常用函数介绍(一)
http://blog.csdn.net/gisshixisheng/article/details/47701237 概述: 在进行地理信息系统开发的过程中,常用的空间数据库有esri的sde,po ...
- if判断,while循环,for循环
if判断 if判断其实就是让计算机模拟人的判断 if if 条件: 代码1 代码2 代码3 ... # 代码块(同一缩进级别的代码,例如代码1.代码2和代码3是相同缩进的代码,这三个代码组合在一起就是 ...
- Eclipse 使用前的配置
一,修改eclipse对jdk的依赖项 1.查看设置的编译器编译版本:设置成本地jdk一致的版本 点击窗口->首选项 找到java 选择编辑器,查看现在的编译jdk版本 改成本地jdk版本 jd ...
- 零基础学习Python培训,应该选择哪个培训班?
近几年中,Python一直是市场上最受欢迎的编程语言之一.它语法自然,入门简单,同时应用范围又极广,无论是大火的人工智能.大数据还是传统的web开发.自动化运维,Python都能够大展拳脚.根据职友集 ...
- 配置yum仓库和rpm包
作业一: 1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分 ...
- python第十二周:MySql
MySql数据库 MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司.MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不 ...
- PAT 1117 Eddington Number
British astronomer Eddington liked to ride a bike. It is said that in order to show off his skill, h ...
- BUPT2017 wintertraining(16) #9
龟速补题.目前基本弃坑.已暂时放弃 D.I 两题. 下面不再写题意了直接说解法注意事项之类,直接放contest链接. https://vjudge.net/contest/151537 A.The ...
- MySql数据库优化可以从哪几个方面进行?
1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽 ...
- [bzoj3694]最短路_树链剖分_线段树
最短路 bzoj-3694 题目大意:给你一个n个点m条边的无向图,源点为1,并且以点1为根给出最短路树.求对于2到n的每个点i,求最短路,要求不经过给出的最短路树上的1到i的路径上的最后一条边. 注 ...