zoukankan      html  css  js  c++  java
  • Mysql数据库操作系统及配置参数优化

    • 数据库结构优化

      表的水平拆分
      常用的水平拆分方法为:
      1.对 customer_id进行 hash运算,如果要拆分成5个表 则使用mod(customer_id,5)取出0-4个值
      2.针对不同的 hashID 把数据存到不同的表中。
      挑战:
      1.跨分区表进行数据查询
      2.统计及后台报表操作

    • 操作系统配置优化

      数据库是基于操作系统的,目前大多数MySQL都是安装在Linux系统之上,所以对于操作系统的一些参数配置也会影响到MySQL的性能,下面就列出一些常到的系统配置。
      网给方面的配置, 要修改/etc/sysctl.conf文件
      增加tcp支持的队列数
      net.ipv4.tcp_max_syn_backlog = 65535
      减少断开连接时 ,资源回收
      net.ipv4.tcp_max_tw_buckets = 8000
      net.ipv4.tcp_tw_reuse = 1
      net.ipv4.tcp_tw_recycle = 1
      net.ipv4.tcp_fin_timeout = 10

    • 打开文件的限制
      可以便用ulimit -a目录的刍各位限制,可以修改/etc/security/limits.conf文件 增加以下内容以修改打开文件数量的限制
      *soft nofile 65535
      *hard nofile 65535
      除此之外最好在MySQL服务器上关闭iptables,selinux 等防火墙软件。

    • MySQL配置文件

      Linux系统中MySQl配置文件一般位于/etc/my.cnf
      MySQL配置文件一常用参数说明
      innodb_buffer_pool_size
      非常重要的一个参数 ,用于配置Innodb的缓冲池,如果数据库中只有Innodb表,
      则推荐配置量为总内存的75%(这个前提是这个服务器只用做Mysql数据库服务器).
      SELECT ENGINE,
      ROUND(SUM(data_length + index_length)/1024/1024,1) AS 'Total MB",FROM INFORMATION_SCHEMA.TABLES WHERE table_schema not in
      ("information_schema", "performance schema")
      GROUP BY ENGINE;
      Innodb_buffer_pool_size>=Total MB
      innodb_buffer_pool_instances
      MySQL5.5中新增参数,可以控制缓冲池的个数,默认情况下只有一个缓冲池。
      innodb_log_buffer_size
      innodb log缓冲的大小,由于日志最长每秒钟就会刷新所以一般不用太大。
      innodb_flush_log_at_trx_commit
      关键参数,对innodb的IO影响很大。默认值为1,可以取0,1,2三个值,一般建议设为2,但如果数据安全性要求比较高则使用默认值1.
      innodb_read_io_threads
      innodb_write_io_threads
      以上两个参数决定了Innodb读写的IO进程数,默认为4.
      innodb_file_per_table
      关键参数控制Innodb每一个表使用独立的表空间,默认是OFF,也就是所有表都会建立在共享表空间里,建议为ON.
      innodb_stats_on_metadata
      决定了MySQL在什么情况下会刷新innodb表的统计信息。
      max_connections
      很多开发人员都会遇见”MySQL: ERROR 1040: Too many connections”的异常情况,造成这种情况的一种原因是访问量过高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力;另一种原因就是MySQL配置文件中max_connections值过小。
      首先,我们来查看mysql的最大连接数:
      mysql> show variables like '%max_connections%';
      +-----------------+-------+
      | Variable_name | Value |
      +-----------------+-------+
      | max_connections | 151 |
      +-----------------+-------+
      1 row in set (0.00 sec)

    其次,查看服务器响应的最大连接数:
    mysql> show global status like 'Max_used_connections';
    +----------------------+-------+
    | Variable_name | Value |
    +----------------------+-------+
    | Max_used_connections | 2 |
    +----------------------+-------+
    1 row in set (0.00 sec)

    可以看到服务器响应的最大连接数为2,远远低于mysql服务器允许的最大连接数值。
    对于mysql服务器最大连接数值的设置范围比较理想的是:服务器响应的最大连接数值占服务器上限连接数值的比例值在10%以上,如果在10%以下,说明mysql服务器最大连接上限值设置过高。
    Max_used_connections / max_connections 100% = 2/151 100% ≈ 1%

    我们可以看到占比远低于10%(因为这是本地测试服务器,结果值没有太大的参考意义,大家可以根据实际情况设置连接数的上限值)。
    再来看一下自己 linode VPS 现在(时间:2013-11-13 23:40:11)的结果值:
    mysql> show variables like '%max_connections%';
    +-----------------+-------+
    | Variable_name | Value |
    +-----------------+-------+
    | max_connections | 151 |
    +-----------------+-------+
    1 row in set (0.19 sec)
    mysql> show global status like 'Max_used_connections';
    +----------------------+-------+
    | Variable_name | Value |
    +----------------------+-------+
    | Max_used_connections | 44 |
    +----------------------+-------+
    1 row in set (0.17 sec)

    这里的最大连接数占上限连接数的30%左右。
    上面我们知道怎么查看mysql服务器的最大连接数值,并且知道了如何判断该值是否合理,下面我们就来介绍一下如何设置这个最大连接数值。
    方法1:
    mysql> set GLOBAL max_connections=256;
    Query OK, 0 rows affected (0.00 sec)
    mysql> show variables like '%max_connections%';
    +-----------------+-------+
    | Variable_name | Value |
    +-----------------+-------+
    | max_connections | 256 |
    +-----------------+-------+
    1 row in set (0.00 sec)

    方法2:
    修改mysql配置文件my.cnf,在[mysqld]段中添加或修改max_connections值:
    max_connections=128
    重启mysql服务即可。

    参考:
    mysql优化连接数防止访问量过高的方法
    性能优化之MySQL优化





  • 相关阅读:
    今日小结
    Delphi 框架Frames的使用
    Delphi窗体显示后弹出一个对话框的方法
    Structs2学习笔记1
    使用 LaravelExcel 进行 CSV/EXCEL 文件读写
    Mysql函数FIND_IN_SET()的使用方法
    Laravel数据库操作的三种方式
    Laravel5.5 支付宝手机网站支付的教程
    Python之路3【知识点】白话Python编码和文件操作
    艾伟_转载:利用jQuery实现的Ajax 验证用户名是否存在 狼人:
  • 原文地址:https://www.cnblogs.com/star91/p/5052206.html
Copyright © 2011-2022 走看看