MySQL的优化

数据是企业的命脉:

  • 优化数据库是非常重要的工作;数据库的操作要谨慎,必须做好备份
  • MySQL的优化定律:
    • 1分靠配置文件以及硬件资源优化
    • 9分都是靠SQL语句的优化

MySQLS数据库的优化方向:

  • 配置文件优化,就是上面指定的配置文件的选项优化
    • 系统内核优化
    • MySQL本身配置文件的优化
      • 内存中为MySQL保留部分的缓冲区;缓冲区可以提高MySQL的速度
      • 在配置文件中配置缓冲区的大小key_buffer = 4096M
  • SQL语句优化:这个占据重要地位
    • 表结构的优化
    • 索引的优化
    • 引擎的优化等等
  • 硬件资源的优化
    • 硬件资源优化
      • 存储多块磁盘来存储数据,提高数据的读取速度
    • 内存、CPU优化
      • 增加内存、提高读写磁盘的速度
    • 可以靠买买买来实现优化,那么我们存在就没有什么必要了,可能要丢饭碗了;

企业级别MySQL百万量级真实环境的my.cnf文件:

[client]#指定用户端的登陆配置port = 3306#默认端口3306socket = /tmp/mysql.sock#指定socket的文件位置[mysqld]#MySQL服务的配置信息user = mysql#MySQL启动的用户server_id = 10#指定MySQL服务的ID号port = 3306#默认端口还是3306socket = /tmp/mysql.sock#socket的位置还是一样datadir = /data/mysql/#数据目录存放的位置old_passwords = 1#old-passwords选项的目的是当服务器生成长密码哈希值时,允许你维持同4.1之前的客户端的向后兼容性lower_case_table_names = 1#表示表名和字段名是否区分大小写。值为 1 时表示不区分大小写,值为 0 或不设置则表示区分大小写。character-set-server = utf8#设置默认的字符级别为UTF8default-storage-engine = MYISAM#指定默认的存储引擎log-bin = bin.log#指定日志格式log-error = error.log#指定错误日志pid-file = mysql.pid#指定pid位置,如果没有接上路径,默认是存放在Mysql的安装目录中long_query_time = 2#它指定了一个查询执行时间的阈值,单位为秒slow_query_log#用于记录执行时间超过一定阈值的 SQL 查询语句。slow_query_log_file = slow.log#指定记录的文件binlog_cache_size = 4M#用于设置在写入二进制日志时使用的缓存大小,默认是32kbinlog_format = mixed#指定日志格式max_binlog_cache_size = 16M#最大的缓存记录为16Mmax_binlog_size = 1G#用于控制二进制日志文件的最大大小。expire_logs_days = 30#用于设置二进制日志文件(binary log files)的过期时间ft_min_word_len = 4#定义了全文检索时索引的最小词长。默认值为4back_log = 512#参数就是用来设置这个连接请求队列的大小,也就是可以排队等待处理的连接请求的最大数量。max_allowed_packet = 64M#用于控制单个数据包的最大大小。max_connections = 4096#是指数据库服务器最大连接数的限制max_connect_errors = 100#是指数据库最大的错误连接数join_buffer_size = 2M#用于指定在执行多表连接时,存储中间结果的缓冲区大小read_buffer_size = 2M#用于指定在读取数据时使用的缓冲区大小read_rnd_buffer_size = 2M#用于控制在执行随机读取操作时,每个线程使用的缓冲区大小sort_buffer_size = 2M#用于排序操作的缓存区大小,它决定了每个排序操作的最大大小query_cache_size = 64M#用于设置查询缓存大小的参数table_open_cache = 10000#table_open_cache 参数用于控制表缓存的大小。thread_cache_size = 256#MySQL 中一个用于优化线程池性能的参数max_heap_table_size = 64M#用于设置在一个 HEAP 存储引擎的表中允许的最大堆大小tmp_table_size = 64M#用于指定在执行SQL语句时,临时表所占用的最大内存大小。thread_stack = 192K#表示每个连接线程的堆栈大小。thread_concurrency = 24#用于限制在执行查询时可以使用的线程数。local-infile = 0#它控制是否允许客户端通过 LOAD DATA LOCAL INFILE 语句将本地文件加载到服务器上skip-show-database#用于跳过当前数据库并显示其他可用数据库。它不会显示当前选定数据库中的表或数据。skip-name-resolve#它可以用来禁止 MySQL 对客户端的连接进行 DNS 反解析。skip-external-locking#它可以用来跳过外部锁定。connect_timeout = 600#用于超时链接interactive_timeout = 600#它指定了MySQL在等待客户端交互式连接的时间wait_timeout = 600#用于设置一个连接在没有任何活动发生的情况下可以保持打开状态的时间# MyISAM#SYISAM的存储配置key_buffer_size = 512M#用于设置MyISAM存储引擎的索引缓存区大小bulk_insert_buffer_size = 64M#用于控制批量插入操作的缓冲区大小。myisam_sort_buffer_size = 64M#用于指定排序操作中的缓冲区大小myisam_max_sort_file_size = 1G#用于控制MyISAM在执行ORDER BY操作时的最大临时文件大小。myisam_repair_threads = 1#用于指定在执行MyISAM表维护操作时使用的线程数。concurrent_insert = 2#指在多线程环境下进行插入操作时,为了避免线程安全问题,需要使用并发插入技术。myisam_recover#用于修复 MyISAM 表的损坏。#INNODB#INNODB存储配置innodb_buffer_pool_size = 64G#它定义了 InnoDB 存储引擎使用的内存缓冲池的大小innodb_additional_mem_pool_size = 32M#是 MySQL 中 InnoDB 存储引擎用于分配额外内存池的参数。innodb_data_file_path = ibdata1:1G;ibdata2:1G:autoextend#用于指定 InnoDB 数据文件的存储路径和文件名。innodb_read_io_threads = 8#用于设置InnoDB存储引擎读取数据时所使用的I/O线程数量innodb_write_io_threads = 8#用于设置InnoDB写入操作使用的I/O线程数。innodb_file_per_table = 1#用于控制InnoDB存储引擎是否为每个表创建单独的表空间文件。innodb_flush_log_at_trx_commit = 2#用于控制数据的持久化。innodb_lock_wait_timeout = 120#innodb_lock_wait_timeout innodb_log_buffer_size = 8M#innodb_log_buffer_sizeinnodb_log_file_size = 256M#用于设置 InnoDB redo log 文件的大小innodb_log_files_in_group = 3#它用于指定 InnoDB redo log 文件组中包含的 redo log 文件数量。innodb_max_dirty_pages_pct = 90#用于控制InnoDB存储引擎脏页(即已经被修改但还未被写回磁盘的页)的最大百分比innodb_thread_concurrency = 16#用于控制InnoDB存储引擎中的并发线程数。innodb_open_files = 10000#用于指定InnoDB在打开表空间时允许打开的最大文件数。#innodb_force_recovery = 4#*** Replication Slaveread-only#MySQL中的read-only模式是一种状态,在该状态下,数据库只允许进行读操作,而不允许进行写操作。#skip-slave-startrelay-log = relay.loglog-slave-updates