mysql网站打开慢问题排查&数据库优化

1.访问慢问题

1.1 应用反应mysql网站打开慢

top查看CPU是否是mysql占得较多;

uptime查看负载情况;

进入到mysql库中,查看进程数:show (full) processlist;

1.2 开启慢查询日志

long_query_time=1

log-slow-queries = /data/3306/slow.log

1.3 explain某一条语句,看是否走索引

索引建议建在唯一值较多(即重复值少的)的列上,若三个列都很多,则可基于三个列建立联合索引。

对于数据库中像like‘%XXX%’这样的语句特别多,会导致数据库负载,但是没有太大的优化余地(如百度的搜索栏界面),这种情况下的优化方案思路:

1)从业务上实现用户登录后再搜索,可减少搜索次数,从而减轻数据库服务压力

2)如果有大量频繁的搜索,可能是爬虫在爬,这时需要分析web日志,封掉其IP

3)配置多个主从同步,程序上实现读写分离(最好让like这种查询去从库查),减轻主库读写压力

4)在数据库前端增加memcached缓存服务器

5)可以通过搜索服务Sphinx实现搜索

6)可以利用c,ruby开发程序,实现每日读库计算搜索索引,保存在服务器上提供搜索,然后每五分钟多一个从库做一次增量

2.mysql优化

2.1 硬件优化

CPU:一台服务器8-16颗

内存:96G-128G跑3-4个实例,32G-64G跑2个实例

硬盘:数量越多越好,性能:ssd(高并发) > sas(普通业务线上) > sata(线下) 

          raid 以4块盘为例:raid0>raid10>raid5>raid1

网卡:多块网卡bond

以及buffer、tcp优化

2.2 软件优化

操作系统:x86_64

软件:mysql编译优化

2.3 my.cnf里参数的优化

#优化的幅度很小,大部分要靠架构以及SQL语句优化

几个参数的解释:

innodb_buffer_pool_size建议设置为物理内存的1/3-1/2,不要超过50%

sort_buffer_size、read_buffer_size这种线程buffer不要给大了,一般2M即可

query_cache_size=64M 也不建议配置太大

key_buffer_size=32M 如果用于myisam引擎的话建议给大一点,用于索引

skip-name-resolve                                             #若没有此项,在show processlist 时会显示权限不足

max_allowed_packet 服务器和客户端之间最大能发送的可能信息包,设的大备份会快

wait_time 服务器在关闭它之前在一个连接上等待行动的秒数

interactive_timeout 服务器在关闭它之前在一个交互连接上等待行动的秒数

也可通过监控查看生产参数的状况:

show global status\G  

工具:MySQLreport     ----wget http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.604.tar.gz      wget http://cpan.uwinnipeg.ca/cpan/authors/id/T/TI/TIMB/DBI-1.605.tar.gz

tar zxvf DBI-1.605.tar.gz    cd DBI-1.605    more README   perl Makefile.PL    make   make test     make install

另外还有一个分析参数的工具:wget http://www.day32.com/MySQL/tuning-primer.sh

./mysqlreport --user=root --password=oldboy123 --socket=/data/3306/mysql.sock

2.4 SQL语句优化

索引优化:

1)抓出慢SQL,配置my.cnf   long_query_time=2   log-slow-queries=/data/3306/slow-log.log

2)慢查询日志分析工具-----mysqlsla

     mysqldumpslow,mysqlsla,myprofi,mysql-explain-slow-log,mysqllogfilter;

大的复杂的SQL语句拆分成多个小的SQL语句;

子查询,JOIN连表查询;

数据库是存储数据的地方,但不是计算数据的地方,把计算的部分拿到前端应用解决;

搜索功能一般不要用mysql数据库,可以用单独搜索的工具,或加memcached缓存等;

3.架构优化

业务拆分:如搜索功能的拆分

某些业务应用使用nosql持久化存储,如memcachedb,Redis,ttserver,粉丝关注、好友关系等

数据库前端必须加cache,如memcached,用户登录、商品查询等

动态的数据静态化,整个文件静态化,页面片段静态化

数据库集群与读写分离,一主多从等,通过程序或dbproxy进行集群读写分离

单表超过2000万,拆库拆表,人工拆表拆库(登录、商品、订单)

4.流程、制度、安全优化

任何一次人为数据库记录的更新,都要走相应的流程:

人:开发--->核心开发--->运维或DBA

测试:内网测试--->IDC测试--->线上执行

客户端管理:PHPMYADMIN

 

2018年11月7日

祝好!

 

posted @ 2018-10-24 09:27  时光浅夏wk  阅读(1959)  评论(1编辑  收藏  举报