我有一个Ubuntu 64位系统并运行Mysql版本5.5.32-0ubuntu0.12.04.1-log。该机器有64 GB内存。
我有一个非常庞大的数据库,几乎有90 GB的数据和一个250.000.000行的表。
我的问题是,mysqld进程没有占用太多内存。刚好在2-5 GB之间。但是系统的内存完全用于文件缓存。
我重启服务器,有63 GB内存空闲。一旦我开始执行更大的查询,可用内存量就会减少,而缓存的文件数量会增加。 所以mysql没有在其RAM中加载数据,但它使用文件缓存。 查询非常慢。当我查询大表时,根据解释 - 使用索引并且只考虑500.000行,这需要几分钟。
你对这个现象有什么解释吗?
这是我的my.cnf。 (这实际上是我的奴隶的配置,但它显示完全相同的行为)我的表都是InnoDB:
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address = 127.0.0.1
key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
myisam-recover = BACKUP
query_cache_limit = 1M
query_cache_size = 16M
log_error = /var/log/mysql/error.log
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
[innodb]
innodb_buffer_pool_size = 55G
innodb_log_file_size = 256M
innodb_log_buffer_size = 4M
innodb_flush_log_at_trx_commit=2
innodb_thread_concurrency=0
innodb_file_per_table = 1 # (this is not respected as I changed it after the first database was created). So my ibdata1 file is over 80GB in size
max_connections = 1000 # wenn gleichzeitig viele User zugreifen
table_cache = 10000 # abgeleitet von max_connections, könnte sogar höher sein
tmp_table_size = 5000M # wichtig wg. JOINs, zu kleiner Wert macht die extrem langsam
max_heap_table_size = 5000M
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[mysql]
[isamchk]
key_buffer = 16M
!includedir /etc/mysql/conf.d/
答案 0 :(得分:0)
将key_buffer大小增加到128M
,将max_allowed_packet增加到128M
,因为这会加快查询的执行速度
答案 1 :(得分:0)
我终于弄清楚问题是什么。
innodb_buffer_pool_size = 55G
不属于[innodb]部分,但属于[mysqld]部分。
所有的innodb配置都需要放在mysqld部分。