我正在处理一个生产数据库,其 4 个最大的表每个包含 400 万到 1000 万行,每个包含大约 15 个字段,具有不同字段类型(数字、varchar 和文本)的索引。总数index_length
是 2.2GB,data_length
是 6GB。所有这些表都使用 MyISAM,它们的读/写比率为 66/33。
这是空闲时间 /etc/init.d/mysql status 的输出:
Server version 5.1.37-1ubuntu5
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
...
Threads: 27 Questions: 5430994 Slow queries: 59 Opens: 298 Flush tables: 1 Open tables: 128 Queries per second avg: 182.695
高峰时段每秒查询数约为 300。
在过去的几周里,数据库变得非常慢,有时查询会锁定 2 分钟以上。所以,我增加到key_buffer_size
4GB(我的机器上有 8GB)。锁定时间减少了。然而,在高峰时段仍然难以忍受,尤其是当读写比接近50/50时。
服务器在虚拟环境中运行,因此 I/O 不是很好,并且大多数选择查询ORDER BY <some_indexed_field>
在平均 50k 行的结果集上执行。
我之前已经成功地调整了这个数据库,当时它还很小,但现在我被卡住了。
更新: 磁盘利用率在白天很容易达到 100%。
你必须使用 InnoDB。这是为什么:
InnoDB 相对于 MyISAM 的主要优势
MyISAM 在读取密集型环境中表现出色。虽然您可以在每个表的基础上配置私有缓存,但 MyISAM 从不缓存数据。
InnoDB 是您最好的选择!!!
警告
在 DB 服务器上获取足够的 RAM 以缓存 InnoDB 缓冲池中的所有内容(已安装 RAM 的 75%)。