1、查看Linux内存
free -m
如上图空闲内存总共为2998M,数据库占用内存过大,考虑是否存在数据取出过多
2、cpu使用情况
top
按1可以查看cpu核数,按t可以可以看到负载排名靠前的进程,列出几个重要的参数
- %CPU 上次更新到现在的CPU时间占用百分比
- TIME 进程使用的CPU时间总计,单位秒
- TIME+ 进程使用的CPU时间总计,单位1/100秒
- %MEM 进程使用的物理内存百分比
- VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
- SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
- RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
- CODE 可执行代码占用的物理内存大小,单位kb
3、查看数据库连接
netstat -anp|grep 3306|grep ESTABLISHED 可以大概查看所有连接
netstat -anp|grep 3306|grep ESTABLISHED|wc -l 查看当前大概连接数目
登录数据库后可以使用:show status like “%conn%”;
4、 看msyql状况
status
Questions: 查询总次数 Slow queries: 慢查询的语句,大于long_query_time
5、查看mysql进程情况,以下是几个个强大的指令,均可接like “%%”
show processlist;
show status
show variables
在使用processlist时,注意的问题:
command列,显示当前连接的执行的命令,一般就是休眠(sleep)一般数据库连接池会有这个状态,查询(query),连接(connect)。
state很重要,可以查看官网什么意思
6、查看mysql情况,请先行配置好慢日志
- 登录 mysql -u root -p123456
查看慢日志情况:show variables like “%slow%”;
开启慢日志:set global slow_query_log=’ON’;
set global log_slow_queries = ON;
set global long_query_time=2; #设置大于2s的sql语句记录下来
修改mysql配置文件my.conf,如下
[mysqld]
log-slow-queries = /var/logs/mysql_slow_query.log
long_query_time = 2 #单位是秒
log-queries-not-using-indexes
查看慢日志
tail -f /var/logs/mysql_slow_query.log
Query_time: 查询时间
Lock_time: 锁住时间
Rows_sent: 返回的数据行数
Rows_examined: 检查或者说查询的行数
分析工具:
mysqldumpslow
mysqlsla
myprofi
mysql-explain-slow-log
mysqllogfilter
优化:
查看执行计划:详情请查看官网
explain+sql语句
type=const表示通过索引一次就找到了
key=primary的话,表示使用了主键
type=all,表示为全表扫描;
key=null表示没用到索引
type=ref,因为这时认为是多个匹配行,在联合查询中,一般为REF。
磁盘I/O瓶颈:
sudo apt-get install sysstat
使用 iostat -x 指令查看
纵向扩展可做优化:磁盘raid10或替换固态硬盘
负载横向扩展
做mysql主从、分区表、缓存(redis、mangodb等)
优化采取方式:主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发访问与负载能力
主从同步:
MySQL binlog
原理:把数据库所有更新操作存储在专用的文件里日志(除了select语句,一般情况(insert,update,delete,create ,alter,drop)),然后主库根据该文件同步其他从库
高可用:
使用一些proxy,如MySQL-Proxy、Keeplive、Haproxy等
读写分离:
1、在代码级别控制,读写操作语句分离
2、可以使用一些中间件产品:
如Cobar、mycat、oneproxy、atlas等
查询表行数与空间大小
select table_schema, table_name,(index_length+data_length)/(1024*1024) assize_mb, table_rows from information_schema.tables where table_schema not in(“mysql”, “information_schema”) order by assize_mb desc limit 10;