记录一下MySQL的一些知识:
常用的命令:
show processlist;和show full processlist; 可以查看mysql的当前执行进程,甚至可以通过kill命令杀死想要结束的进程;
show engine innodb status; 查询出的status复制到文本中,可以用于排查死锁的执行sql;
explain +sql;可以查看sql执行使用的索引,其中possible keys是可能用到的索引(基本不看这个),key是实际用到的索引(比较常用),rows是使用索引后筛选出的符合该索引条件的行数
注意:update、delete如果条件没有走索引会锁全表,这个会很严重,一定要避免
聚簇索引:和数据放在一起的索引。一个表可以有多个索引,但是只有一个聚簇索引(如果有主键是主键,如果没有主键是唯一键,如果没有唯一键是mysql自动分配的rowid),聚簇索引以外的索引存储的不是数据,而是该索引对应的值及聚簇索引值
联合索引:最左匹配原则。比如有个表(name,age,address) 那实际上只能使用name,name和age,nage、age和address ,不能单独使用age,但是如果一个表所有列都是索引列可能会出现违反最左匹配原则,全索引表这种情况很少见,但是要注意
索引覆盖:b+tree,
索引下推:
show global status; 列出MySQL服务器运行各种状态值
show variables; 查询MySQL服务器配置信息语句
mysql> show variables like '%slow%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| log_slow_queries | ON |
| slow_launch_time | 2 |
+------------------+-------+
mysql> show global status like '%slow%';
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| Slow_launch_threads | 0 |
| Slow_queries | 4148 |
+---------------------+-------+
配置中打开了记录慢查询,执行时间超过2秒的即为慢查询,系统显示有4148个慢查询,你可以分析慢查询日志,找出有问题的SQL语句,慢查询时间不宜设置过长,否则意义不大,最好在5秒以内。
打开慢查询日志可能会对系统性能有一点点影响,如果你的MySQL是主-从结构,可以考虑打开其中一台从服务器的慢查询日志,这样既可以监控慢查询,对系统性能影响又小。
show variables like '%quer%'; 查询出的slow_query_log(是否已开启慢查询sql)、slow_query_log_file(慢sql存储文件)
1、查询慢日志时间设置。
mysql> show variables like 'long_query_time';
2、设置慢查询日志时间。
mysql> set global long_query_time=5;
经常会遇见”MySQL: ERROR 1040: Too many connections”的情况,一种是访问量确实很高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力,另外一种情况是MySQL配置文件中max_connections值过小:
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 256 |
+-----------------+-------+
这台MySQL服务器最大连接数是256,然后查询一下服务器响应的最大连接数:
mysql> show global status like ‘Max_used_connections’;
MySQL服务器过去的最大连接数是245,没有达到服务器连接数上限256,应该没有出现1040错误,比较理想的设置是:
Max_used_connections / max_connections * 100% ≈ 85%
最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接数上限设置的过高了。
经常会遇见”MySQL: ERROR 1040: Too many connections”的情况,一种是访问量确实很高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力,另外一种情况是MySQL配置文件中
mysql> show global status like 'open%tables%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables | 919 |
| Opened_tables | 1951 |
+---------------+-------+
Open_tables表示打开表的数量,Opened_tables表示打开过的表数量,如果Opened_tables数量过大,说明配置中table_cache(5.1.3之后这个值叫做table_open_cache)值可能太小,我们查询一下服务器table_cache值:
mysql> show variables like 'table_cache';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| table_cache | 2048 |
+---------------+-------+
比较合适的值为:
Open_tables / Opened_tables * 100% >= 85%
Open_tables / table_cache * 100% <= 95%
mysql> show global status like 'table_locks%';
+-----------------------+-----------+
| Variable_name | Value |
+-----------------------+-----------+
| Table_locks_immediate | 490206328 |
| Table_locks_waited | 2084912 |
+-----------------------+-----------+
Table_locks_immediate表示立即释放表锁数,Table_locks_waited表示需要等待的表锁数,如果Table_locks_immediate / Table_locks_waited > 5000,最好采用InnoDB引擎,因为InnoDB是行锁而MyISAM是表锁,对于高并发写入的应用InnoDB效果会好些。示例中的服务器Table_locks_immediate / Table_locks_waited = 235,MyISAM就足够了。