• 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 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日

    祝好!

  • 相关阅读:
    0X01 OWASP WebGoat Splitting
    subprocess
    Python中getopt()函数的使用
    Python3_UDP客户端
    Python3编写TCP客户端
    Python3---pymysql库____操作数据库
    review——database (1)CH8-Relational Database Design
    删除的review——数据库 (1)CH6关系数据理论
    review——C# (15)转换
    review——C# (14)接口
  • 原文地址:https://www.cnblogs.com/wangke2017/p/9830685.html
Copyright © 2020-2023  润新知