MYSQL调优总结1

如果一台服务器出现长时间负载过高 /周期性负载过大,或偶尔卡住如何来处理?
答:大的思路--------
是周期性的变化还是偶尔问题?
是服务器整体性能的问题, 还是某单条语句的问题?
具体到单条语句, 这条语句是在等待上花的时间,还是查询上花的时间.
唯一的办法-----监测并观察服务器的状态.

1:观察服务器状态, 一般用如下2个命令
 Show processlist;
这个命令是显示当前所有连接的工作状态.

如果观察到以下状态,则需要注意
converting HEAP to MyISAM 查询结果太大时,把结果放在磁盘 (语句写的不好,取数据太多)
create tmp table             创建临时表(如group时储存中间结果,说明索引建的不好)
Copying to tmp table on disk   把内存临时表复制到磁盘 (索引不好,表字段选的不好)
locked         被其他查询锁住 (一般在使用事务时易发生,互联网应用不常发生)
logging slow query 记录慢查询

例: mysql> show status;

查看链接状态
mysql 5.5 以后加了一个profile设置,可以观察到具体语句的执行步骤.
0:查看profile是否开启
> Show  variables like ‘profiling’
1:> set profiling=on;
mysql> show profiles;
+----------+------------+----------------------------------------------------------+

| Query_ID | Duration   | Query                                                    |

+----------+------------+----------------------------------------------------------+

|        1 | 0.00034225 | select cat_id,avg(shop_price) from goods group by cat_id |

+----------+------------+----------------------------------------------------------+

1 row in set (0.00 sec)

mysql> show profile for query 1;

+----------------------+----------+

| Status               | Duration |

+----------------------+----------+

| starting             | 0.000058 |

| checking permissions | 0.000008 |

疑问; 如何定位到有问题的语句?
答:
1: 开启服务器慢查询
2: 了解临时表的使用规则
MySQL如何使用内部临时表
在处理请求的某些场景中,服务器创建内部临时表. 即表以MEMORY引擎在内存中处理,或以MyISAM引擎储存在磁盘上处理.如果表过大,服务器可能会把内存中的临时表转存在磁盘上.
用户不能直接控制服务器内部用内存还是磁盘存储临时表

临时表在如下几种情况被创建:
1.如果group by 的列没有索引,必产生内部临时表,
2.如果order by 与group by为不同列时,或多表联查时order by ,group by 包含的列不是第一张表的列,将会产生临时表
3.distinct 与order by 一起使用可能会产生临时表
4.如果使用SQL_SMALL_RESULT,MySQL会使用内存临时表,除非查询中有一些必须要把临时表建立在磁盘上.
5.union合并查询时会用到临时表,某些视图会用到临时表,如使用temptable方式建立,或使用union或聚合查询的视图

想确定查询是否需要临时表,可以用EXPLAIN查询计划,并查看Extra列,看是否有Using temporary.
如果一开始在内存中产生的临时表变大,会自动转化为磁盘临时表. 内存中临时表的最大值为tmp_table_size和max_heap_size中较小值
当服务器创建内部临时表(无论在内存还是在磁盘),create_tmp_tables变量都会增加.如果创建了在磁盘上内部临时表(无论是初始创建还是由in-memory转化),
使用了内部临时表的前提下) 语句中存在BLOB或TEXT列(实验3)
在GROUP BY 或 DISTINCT子句中有大于512字节的string列在UNION或UNION ALL时,SELECT语句里有大于512字节的string列.

建表: 表结构的拆分,如核心字段都用int,char,enum等定长结构 非核心字段,或用到text,超长的varchar,拆出来单放一张表.
建索引: 合理的索引可以减少内部临时表(索引优化策略里详解)
写语句: 不合理的语句将导致大量数据传输以及内部临时表的使用


你可能感兴趣的:(MYSQL调优总结1)