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 statusG
工具: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日
祝好!