MySQL 操作系统缓存
Posted
技术标签:
【中文标题】MySQL 操作系统缓存【英文标题】:MySQL operating system cache 【发布时间】:2015-05-16 01:57:24 【问题描述】:我们有一个专用的数据库服务器 (MariaDB 5.5.31) 托管我们的 java 应用程序使用的数据库(通过休眠从另一台服务器访问数据库)。虽然我们的数据库本身使用了大约 12gb 的 RAM,但操作系统(CentOS 6.4)另外缓存了大约 25gb。
您能给我任何建议吗,我们可以如何影响这种行为?
虽然我们 100 个表中的大多数表的条目少于 1000 个,但我们也有一些表的条目数超过 1000 万。这些表会经历大量的读写操作。
这些是我们的数据库设置:
[server]
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
character-set-server = utf8
collation-server=utf8_general_ci
skip-external-locking
back_log = 50
max_connections = 100
max_connect_errors = 10
table_open_cache = 2048
max_allowed_packet = 16M
max_heap_table_size = 64M
read_buffer_size = 2M
read_rnd_buffer_size = 16M
sort_buffer_size = 8M
join_buffer_size = 16M
thread_cache_size = 8
thread_concurrency = 8
query_cache_size = 128M
query_cache_limit = 2M
thread_stack = 240K
transaction_isolation = REPEATABLE-READ
tmp_table_size = 64M
binlog_cache_size = 1M
log-bin=mysql-bin
binlog_format=mixed
expire_logs_days = 2
#*** MyISAM Specific options
key_buffer_size = 384M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
# *** INNODB Specific options ***
innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 10G
innodb_data_home_dir = /var/lib/mysql
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_thread_concurrency = 16
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 8M
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
[embedded]
[mysqld-5.5]
[mariadb]
[mariadb-5.5]
【问题讨论】:
您能分享一下存储超过百万条记录的表的信息吗?那些是 Innodb 还是 ISAM?什么是与时间相关的字段,其中包含哪些类型的数据?那里有索引吗?表格统计完成了吗? 【参考方案1】:如果具有数百万条记录的表是事务表,那么首先要做的事情如下:
-
列出这些表的子表。
与客户讨论并制定备份计划,即表中仅保留 1/1.5/2 年的数据。
如果有很多子表的数据可以一起备份,那么有两种选择:
a) 为备份数据准备一个非规范化表
b) 有一个表可以命名为 original_table_name_bk
应该有一个定期计划的备份过程,比如每 3 个月一次,最好是在精益时期,该过程将运行并将数据从事务表移动到备份表。
现在您的数据库中既有历史数据也有当前数据,而不会影响事务操作的性能。
【讨论】:
所有表都是 innodb 表,是的,数据是时间相关的,我们有索引。不幸的是,我们的大部分数据都在一年内,我们计划对旧数据实施备份策略。我很困惑操作系统正在缓存大约两倍的数据库大小。我是否遗漏了一些会导致操作系统缓存更少的关键设置? @tflu 听起来不错...由于 isam 表包含更多数据,您可以检查将备份列作为 ISAM 的可能性。在任何一种情况下,mysql 都不是为多亿条记录而设计的,因此您可能还需要从备份表中删除数据。届时您可以计划将这些数据保存在某个数据仓库或文档存储库中,并使用弹性搜索来检索它。 1000万条事务表记录在mysql数据库中太多了。请 DBA 运行统计数据并查看影响。 记住那些 _bk 表仍然在同一个数据库中,所以你可以对旧事务有一个单独的视图。就像您在银行中看到的那样,超过 6 个月您需要转到不同的链接。由于数据来自不同的表。以上是关于MySQL 操作系统缓存的主要内容,如果未能解决你的问题,请参考以下文章