MySQL SQL优化教程

news/2024/6/30 6:34:18

转自: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执行计划,帮助我们更好地理解优化器的行为。


http://www.niftyadmin.cn/n/2745324.html

相关文章

关于Flash的一些介绍(一)

一、flash介绍 Flash的前身是Future Wave公司的Future Splash&#xff0c;是世界上第一个商用的二维矢量动画软件&#xff0c;用于设计和编辑Flash文档。1996年美国Macromedia公司收购了Future Wave&#xff0c;并将其改名为Flash。在出到Flash 8以后&#xff0c;Macromedia又被…

P3311 [SDOI2014]数数

思路 看到多个子串并且不能包含的情况&#xff0c;想到了AC自动机 但是题目多了一个不能大于给出的n的限制条件&#xff0c;联想数位dp的过程&#xff0c;设f[i][j][0/1]表示在第i位&#xff0c;AC自动机的第j个节点&#xff0c;数位有/无限制的方案数 dp方程就是对应的转移到子…

内存管理之2:x86页式内存管理

2019独角兽企业重金招聘Python工程师标准>>> date: 2014-09-04 19:09 内存管理的目的是什么&#xff1f;内存管理本身就像一个外观模式&#xff0c;它隐藏底层细节而给应用程序提供一个统一易用的访问内存的接口。程序可以访问4G空间中的任意地址&#xff0c;但实际…

啊撒擦上去

/* 题目内容&#xff1a;在大学期间&#xff0c;经常需要租借教室。大到院系举办活动&#xff0c;小到学习小组自习讨论&#xff0c;都需要向学校申请借教室。教室的大小功能不 同&#xff0c;借教室人的身份不同&#xff0c;借教室的手续也不一样。面对海量租借教室的信息&…

产妇坐月子里可以吃哪些水果?

产妇坐月子里可以吃哪些水果? 众所周知&#xff0c;生果的营养丰厚&#xff0c;滋味鲜美&#xff0c;人人爱吃。但是生果是生冷的食物&#xff0c;产妇吃了会怕着凉吗?专业的月子中心提示&#xff0c;产妇恰当吃些生果&#xff0c;不仅能添加营养&#xff0c;协助消化&#x…

功能性组件和Classes有什么不同?

React函数组件与React类有何不同&#xff1f; 有一段时间&#xff0c;规范的答案是类可以访问更多功能&#xff08;如状态&#xff09;。但是自从有了Hook后&#xff0c;这个答案变得不唯一了。 也许你听说其中一个表现更好。哪一个&#xff1f;许多此类基准都存在缺陷&#xf…

PHP代码常用注释规范(PHP Doc)

PHP代码常用注释规范&#xff08;PHP Doc&#xff09; 介绍几个常用的PHP注释 在PHP文件中使用该注释格式开始进行文件注释&#xff1a; /*** author 作者* copyright 版权信息* version 版本* 等等*/ 复制代码 描述一个类的注释&#xff1a; /*** Class 类名* package 命名空间…

Ruby 2.6.3 发布,引入日本新年号“令和”

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; Ruby 2.6.3 已发布。新版本引入了新的日本年号&#xff1a;“令和”&#xff08;Reiwa&#xff09;。 主要更新内容&#xff1a; 升级支持的 Unicode 版本至 12.1 beta&#xff08;#15195&#…