为什么别人问你MySQL优化的知识 总是没有底气, 因为你只是回答一些大而化之的调优原则, 比如:
1、”建立合理索引”(什么样的索引合理?)
2、“分表分库”(用什么策略分表分库?)
3、“主从分离”(用什么中间件?)
并没有从细化到定量的层面去分析.
如qps提高了%N? 有没有减少文件排序?语句的扫描行数减少了多少?没有大量的数据供测试,一般在学习环境中,只是手工添加几百上万条数据,数据量小,看不出语句之间的明确区别.
如何提高MySQL的性能?
需要优化,则说明效率不够理想.,因此我们首先要做的,不是优化,而是---诊断.
治病的前提,是诊病,找出瓶颈所在. CPU,内存,IO? 峰值,单条语句?
辅助工具awk
awk脚本使用:awk ‘{printf("%s\n",$0)}’ score.txt
查看问题是否是周期性故障或波动------>一般由访问高峰或缓存崩溃引起,加缓存并更改缓存失效策略,使缓存失效时间分散或夜间定时失效。
mysql常用语句:
show processlist;
show status;
如果还有问题,那么可以通过show processlist命令或者开启慢查询获取有问题的sql,然后通过profiling分析语句或者explain语句分析问题。
什么情况下产生临时表
1、group by的列和order by的列不同时,两表查询时,取a表的内容,group/order by另外表的列
2、distinct和order by一起使用时
3、开启了sql_small_restult选项
什么情况下临时表写在磁盘上
1、取出的列含有text/blob类型时,内存表存储不了text/blob类型
2、在group by或distinct的列中存在>512字节的string列
3、select中含有>512字节的string列,同时又使用了union或union all语句。
mysql5.0以后新增了一个小功能,就是profiles功能
首先执行 set profiling=on; 以后你所执行的语句mysql都会给你记录下来,可以通过 show profiles 命令查看你所执行的命令。
然后可以根据 show profile for query 命令id 查看命令执行的过程。具体执行过程如下:
mysql> set profiling=on
-> ;
Query OK, 0 rows affected
mysql> show profiles;
Empty set
mysql> select * from ry;
+----+-------+-------+------+
| id | mz | gz | mcid |
+----+-------+-------+------+
| 1 | Joe | 70000 | 1 |
| 2 | Henry | 80000 | 2 |
| 3 | Sam | 60000 | 2 |
| 4 | Max | 90000 | 1 |
| 5 | Janet | 69000 | 1 |
| 6 | Randy | 85000 | 1 |
| 7 | JACK | 85000 | 1 |
+----+-------+-------+------+
7 rows in set
mysql> show profiles;
+----------+------------+------------------+
| Query_ID | Duration | Query |
+----------+------------+------------------+
| 1 | 0.00070325 | select * from ry |
+----------+------------+------------------+
1 row in set