学习处理大型 MySQL 数据库

学习处理大型 MySQL 数据库

在数据库/服务器管理方面完全是新手,但目前正在运行一个大型数据库:

  • LAMP 堆栈 Ubuntu
  • WordPress 平台(无法更改)
  • 超过 100,000 个数据库条目
  • 网站每天通过 API 添加 2 次新条目
  • 网站每天删除两次过期条目
  • 用户搜索符合关键字的条目
  • 每日用户数不足 100 人

服务器频繁给出 mysql-slow 错误,变得无响应或使用超过 200% 的服务器资源。(主要是 CPU,似乎源于 MySQLd 进程)。

我在 Linode 机器上运行 LAMP 堆栈:

4 GB RAM
4 CPU Cores
96 GB SSD Storage
19.72 GB swap

不知道从哪里开始了解这些类型的问题。如果有人能引导我朝着正确的方向学习大型数据库的常见问题,甚至理解 MySQLd 如何使用 CPU 内存以及如何更好地优化它,那就太好了——因为我认为在流量如此低的情况下,这一定是配置问题或脚本不好。

我不指望任何人能解决这个问题,我甚至不知道从哪里开始。

答案1

我首先会查看您的应用代码和您生成的查询。使用“SHOW PROCESSLIST”将显示 mysql 进程和状态。如果您看到包含全表扫描、文件排序或复制到 tmp 的查询,则需要使用“EXPLAIN [sql 语句] ..”并查看可以优化的地方。

由于您提供的信息有限,我只能猜测,由于未索引的查询或查询过大而超出了分配的内存量,导致 I/O 瓶颈。您不应该为 mysql 使用 swap,至少您应该拥有尽可能多的内存,以便您的数据库尽可能多地保留在内存中。

答案2

对于 mysql 调优你可以从http://mysqltuner.com/(您可以在此处发布输出)。

对于 wordpress,我建议使用一些缓存插件,例如带有 memcached 后端的 W3 Total Cache,并启用所有缓存。对象缓存应该有助于 mysql 加载。

使用 mysql 删除大量数据时,运行 mysqlcheck -Ao 可能也会有所帮助。此外,如果 mysql 查询遇到锁定问题,将一些表移至 InnoDB 可能会有所帮助,但就您的情况而言似乎并非如此。

相关内容