SQL优化

1.查看各种SQL执行的频率

mysql> show status like 'Com_select';--Com_insert,Com_delete,connections(试图连接mysql服务的次数),uptime(mysql工作时间),slow_queries(慢查询次数)等等

2.定位执行效率较低的SQL语句

通过慢查询日志,定位查询效率低下的SQL语句,然后分析语句进行优化

3.通过explain或desc分析SQL语句的执行计划,如要查看所访问的分区使用explain partitions

mysql> desc select email from users\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: users
type: index //扫描方式,效率由低到最好 all(全表)->index(索引全扫描)->range(索引范围扫描)->ref(非唯一索引)->eq_ref(唯一索引)->const/system->null
possible_keys: NULL
key: email
key_len: 153
ref: NULL
rows: 59
Extra: Using index
1 row in set (0.00 sec)

4.使用profile分析SQL,profile就是详细地列出SQL语句执行过程

查看是否开启/支持profile

mysql> show variables like 'profiling'; --使用select @@have_profiling也可以
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| profiling | OFF |
+---------------+-------+
mysql> set profiling=on --开启 OFF--关闭

查看所有查询分别执行的时间

mysql> show profiles;
+----------+------------+---------------------------------+
| Query_ID | Duration | Query |
+----------+------------+---------------------------------+
| 1 | 0.00079925 | show variables like 'profiling' |
| 2 | 0.00050700 | select * from users |
| 3 | 0.36104925 | select * from tb_5 |
+----------+------------+---------------------------------+

查看某个查询语句执行过程每个状态以及消耗的时间

mysql> show profile for query 3;
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.000059 |
| checking permissions | 0.000010 |
| Opening tables | 0.042742 |
| System lock | 0.000018 |
| init | 0.000017 |
| optimizing | 0.000004 |
| statistics | 0.000162 |
| preparing | 0.000010 |
| executing | 0.000003 |
| Sending data | 0.317929 | --主要时间花费在将数据发送到客户端
| end | 0.000011 |
| query end | 0.000007 |
| closing tables | 0.000013 |
| freeing items | 0.000058 |
| logging slow query | 0.000005 |
| cleaning up | 0.000004 |
+----------------------+----------+

5. 使用optimizer_trace分析优化器查看SQL语句执行计划(5.6版本以上)

mysql> show variables like 'optimizer_trace';
+-----------------+--------------------------+
| Variable_name | Value |
+-----------------+--------------------------+
| optimizer_trace | enabled=off,one_line=off |
+-----------------+--------------------------+

开启trace分析器,并调整最大可用内存

mysql> set optimizer_trace='enabled=on',end_markers_in_json=on; --以JSON格式显示
Query OK, 0 rows affected (0.05 sec) mysql> set optimizer_trace_max_mem_size=1000000;
Query OK, 0 rows affected (0.16 sec)

通过information_schema库的optimizer_trace视图查看trace信息

mysql> select query,trace from optimizer_trace\G
*************************** 1. row ***************************
query: select * from test.stu
trace: {
"steps": [
{
"join_preparation": {
"select#": 1,
"steps": [
{
"expanded_query": "/* select#1 */ select `test`.`stu`.`sno` AS `sno`,`test`.`stu`.`sname` AS `sname`,`test`.`stu`.`sclass` AS `sclass` from `test`.`stu`"
-------------------只截取了部分信息,通过分析这些信息可用对SQL语句进行相应优化---------------------

6.使用索引优化查询性能

索引是数据库优化中最常用的最要种的手段,索引可以分为以下4中:

HASH索引:只有MEMORY引擎支持;  B-TREE索引:平衡树索引,最常用的索引  R-TREE索引:MyISAM引擎特殊索引  FULL-TREE全文索引:MyISAM特殊索引。

创建索引:

mysql> create index idx_name on stu(sname);
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0

查看某表的所有索引

mysql> show index from stu\G
*************************** 2. row ***************************
Table: stu
Non_unique: 1
Key_name: idx_name
Seq_in_index: 1
Column_name: sname
Collation: A
Cardinality: 4
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE

MySQL能够使用索引的一些情况:匹配索引全值,匹配值的范围查询,匹配最左前缀等等。

查看索引使用情况,如果handle_read_key值很高,说明查询效率很高,如Handler_read_rnd_next值很高,说明查询效率并不理想。

mysql> show status like 'Handler_read%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Handler_read_first | 1 |
| Handler_read_key | 1 |
| Handler_read_last | 0 |
| Handler_read_next | 0 |
| Handler_read_prev | 0 |
| Handler_read_rnd | 0 |
| Handler_read_rnd_next | 25 |
+-----------------------+-------+

7.定期检查表和分析表,以及优化表

检查表就是检查一个或多个表是否有错误

mysql> check table stu;
+--------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------+-------+----------+----------+
| zz.stu | check | status | OK |
+--------+-------+----------+----------+

分析表主要作用是让SQL生成正确的执行计划

mysql> analyze table stu;
+--------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------+---------+----------+----------+
| zz.stu | analyze | status | OK |
+--------+---------+----------+----------+

优化表的作用主要是对表空间的碎片进行合并以及回收删除或更新造成浪费的空间

mysql> optimize table t1; 
--对于InnoDB的表,会有Table does not support optimize, doing recreate + analyze instead提示,可以在启动mysql服务时,指定--skip-new或--safe-mode即可
+---------+----------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+----------+----------+----------+
| test.t1 | optimize | status | OK |
+---------+----------+----------+----------+
1 row in set (0.04 sec)

8.常用SQL优化

加载大量数据时,关闭非唯一索引,取消唯一性检查,以及取消自动提交以提高插入速度

set unique_checks=0
alter table stu disable keys
set autocommit=0
load load infile........
alter table stu enable keys
set unique_checks=1
set autocommit =1

insert语句优化,一次性插入多条记录

mysql> insert into stu values (4010409,'钟小兆','A1114',22,0),(4010408,'肖小杰','A1114',21,1).....;

order by语句排序优化,优化思路就是尽可能的减少额外的排序(filesort),通过索引直接返回有序数据,例如

mysql> explain select sno from stu order by sname desc;
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
| 1 | SIMPLE | stu | index | NULL | idx_name | 93 | NULL | 6 | Using index |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+

where条件和order by 字段使用相同的索引,并且order by的顺序和索引顺序相同,还有order by的字段都是降序或者升序。例如:

以下情况会使用索引,前提(key-part1,key_part2)为联合索引

select * from tbl_name order by key_part1,key_part2....;
select * from tbl_name where key_part1=xxx order by key_part1,key_part2....;
select * from tbl_name order by key_part1 asc,key_part2 asc....;

以下情况则不会使用索引,(key1,key2分别建立索引)

select * from tbl_name order by key1,key2....;
select * from tbl_name where key1=xxx order by key2;
select * from tbl_name order by key_part1 asc,key_part2 desc....;

SELECT查询时最好指定具体的字段名,SELECT * 会选择所有字段,会增加排序区的使用,降低SQL性能

group by语句优化

MySQL默认情况下对group by col1,col2..的字段进行排序,可以通过指定order by null来消除这种排序

or条件优化

用到OR的查询,如果要使用索引,那OR之间的每个条件必须是索引,并且要分别建立索引,不能使用联合索引。

MySQL学习笔记十四:优化(1)的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  3. MYSQL进阶学习笔记十四:MySQL 应用程序优化!(视频序号:进阶_32)

    知识点十五:MySQL 的应用程序优化(32) 一.访问数据库采用连接池 把连接当做对象或设备,统一放在‘连接池’里.凡是需要访问数据库的地方都从连接池里取连接 二.采用缓存减少对于MySQL的访问: ...

  4. MySQL学习笔记十五:优化(2)

    一.数据库性能评测关键指标 1.IOPS:每秒处理的IO请求次数,这跟磁盘硬件相关,DBA不能左右,但推荐使用SSD. 2.QPS:每秒查询次数,可以使用show status或mysqladmin ...

  5. Mysql学习笔记(四)字符串函数

    PS:终于看完了字符串函数,心都快碎了...涉及的函数真是太多了...感觉这里的字符串函数和JAVA里的基本都差不多了...基本上算是掌握了,但是想全记住那是不太可能的... 学习内容: 字符串函数的 ...

  6. MYSQL学习笔记——sql语句优化之索引

    上一篇博客讲了可以使用慢查询日志定位耗时sql,使用explain命令查看mysql的执行计划,以及使用profiling工具查看语句执行真正耗时的地方,当定位了耗时之后怎样优化呢?这篇博客会介绍my ...

  7. MySQL学习笔记十二:数据备份与恢复

    数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql ...

  8. mysql学习笔记 第四天

    mysql引擎: archive(档案)[数据插入以后不能被修改,只读] blackhole[这种写操作是删除数据,读操作是返回空白记录] CSV[在储存数据时以逗号作为数据项之间的分隔符] exam ...

  9. MYSQL学习笔记——sql语句优化工具

    优化sql:思路: 使用explan->先查询type类型看看是all还是ref,然后判断 possible_keys (显示可能应用在这张表中的索引, 一个或多个.查询涉及到的字段是若存在索引 ...

随机推荐

  1. 我对 Java 标识符的分类命名方法

    我对 Java 的各种标识符有一套固定的分类方法,以下分享一下我的命名方法以及进行一些说明. # 前缀: 方法 方法:f_doSomeThing().分类词是 f,采自 [f]unction 方法,也 ...

  2. 响应式web网站设计制作方法

    在研究响应式的时候,记录了一些感想,分享出来,抛砖引玉,希望可以和大家一起讨论.总结下来,响应式比之前想象的要复杂得多.1. ie9以下(不包括ie9)采用ie条件注释,为ie8以及一下单独开一个样式 ...

  3. java的值传递笔记

    1. 背景:开发小伙伴突然问我java是值传递还是引用传递,我说当然是值传递,只不过有时候传递一个对象时实际传递的是对象的地址值,所以让人容易产生一种引用传递的假象,貌似在李刚的疯狂java讲义有提到 ...

  4. 【hihoCoder】1288 : Font Size

    题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...

  5. EXT 下拉框事件

    1. <ext:ComboBox ID="cbline" FieldLabel="平台部门来源" runat="server" Dis ...

  6. 工作总结_js倒计时

    最近在弄一个倒计时抽奖的项目,由于是每天的某个时间段所以,网上也没有找到自己合适的.就自己写了一个留下来以供参考.其中最值得注意的一点是不同种类型的手机对自定义的时间支持方式是不一样的.苹果时间只能支 ...

  7. XMLHTTPRequest对象的创建与浏览器的兼容问题

    MLHttpRequest 对象是AJAX功能的核心,要开发AJAX程序必须从了解XMLHttpRequest 对象开始. 了解XMLHttpRequest 对象就先从创建XMLHttpRequest ...

  8. HaProxy配置

    安装 http://www.cnblogs.com/wang1988ming/archive/2012/10/24/2737507.html 配置 global log 127.0.0.1 local ...

  9. IDisposable的另类用法

    IDisposable是.Net中一个很重要的接口,一般用来释放非托管资源,我们知道在使用了IDisposable的对象之后一定要调用IDisposable.Dispose()方法,或者使用.Net提 ...

  10. SQL Server 使用全文索引进行页面搜索

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/全文索引 概述 全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询.全文索引将有关重要的词及其位置的信息存储 ...