MySQL学习笔记十四:优化(1)
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)的更多相关文章
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- (C/C++学习笔记) 十四. 动态分配
十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...
- MYSQL进阶学习笔记十四:MySQL 应用程序优化!(视频序号:进阶_32)
知识点十五:MySQL 的应用程序优化(32) 一.访问数据库采用连接池 把连接当做对象或设备,统一放在‘连接池’里.凡是需要访问数据库的地方都从连接池里取连接 二.采用缓存减少对于MySQL的访问: ...
- MySQL学习笔记十五:优化(2)
一.数据库性能评测关键指标 1.IOPS:每秒处理的IO请求次数,这跟磁盘硬件相关,DBA不能左右,但推荐使用SSD. 2.QPS:每秒查询次数,可以使用show status或mysqladmin ...
- Mysql学习笔记(四)字符串函数
PS:终于看完了字符串函数,心都快碎了...涉及的函数真是太多了...感觉这里的字符串函数和JAVA里的基本都差不多了...基本上算是掌握了,但是想全记住那是不太可能的... 学习内容: 字符串函数的 ...
- MYSQL学习笔记——sql语句优化之索引
上一篇博客讲了可以使用慢查询日志定位耗时sql,使用explain命令查看mysql的执行计划,以及使用profiling工具查看语句执行真正耗时的地方,当定位了耗时之后怎样优化呢?这篇博客会介绍my ...
- MySQL学习笔记十二:数据备份与恢复
数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql ...
- mysql学习笔记 第四天
mysql引擎: archive(档案)[数据插入以后不能被修改,只读] blackhole[这种写操作是删除数据,读操作是返回空白记录] CSV[在储存数据时以逗号作为数据项之间的分隔符] exam ...
- MYSQL学习笔记——sql语句优化工具
优化sql:思路: 使用explan->先查询type类型看看是all还是ref,然后判断 possible_keys (显示可能应用在这张表中的索引, 一个或多个.查询涉及到的字段是若存在索引 ...
随机推荐
- Linux下uniq命令的详解
-c 在输出行前面加上每行在输入文件中出现的次数. -d 仅显示重复行. -u 仅显示不重复的行. 示例 1.去重,有多行一样的只显示一行cat 4.txt |sort - ...
- winfrom自定义滚动条
panel或图片什么的跟着鼠标走,这里panel自己可以加背景图或直接搞个图就行了.为了演示清楚,有个滚动条控件做对比,与自定义的同步. using System; using System.Coll ...
- Devexpress
1.隐藏最上面的GroupPanel gridView1.OptionsView.ShowGroupPanel=false; 2.得到当前选定记录某字段的值 sValue=Table.Rows[gri ...
- java反射学习之二万能EXCEL导出
一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...
- Mac系统中配置Tomcat环境
第一步:下载Tomcat 下载地址:http://tomcat.apache.org/download-80.cgi 直接下载如图选中的即可 第二步: 下载完成后,解压,随意放入目录.如我就把它放在/ ...
- fft练习
数学相关一直都好弱啊>_< 窝这个月要补一补数学啦, 先从基础的fft补起吧! 现在做了 道. 窝的fft 模板 (bzoj 2179) #include <iostream> ...
- errno
关于errno有以下需要注意: 1 A common mistake is to do if (somecall() == -1) { printf("som ...
- Usaco*Monthly Expense
Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N<=100 ...
- 2016huasacm暑假集训训练五 C-Common Subsequence
题目链接:http://acm.hust.edu.cn/vjudge/contest/126708#problem/C 题意:这是一道求字符串的公共子串的最大长度的题目,用dp动态方程即可 if(a[ ...
- Android分享一款漂亮的折叠书架菜单
一个Android折叠书架菜单,效果极佳,给人的视觉感觉很好,便于使用. FoldingMenu