我有大约 150 个 cron 作业,每 3 秒运行 6 到 10 次插入。每 3 秒还会执行大量 select 语句。
我的问题是,一开始一切运行良好,然后就开始出现问题,似乎没有响应。我有 16BG 内存,但只使用了 20%,而我的 CPU 使用率平均约为 2.0。这让我觉得我有一些可以调整的选项。
我试图摆弄我的其他 dedi 盒上的文件描述符,但由于某种原因最终失去了 root 访问权限,所以如果有人能给我提供一个非常好的教程,我只想再次这样做。
MySQL 的 Opened_tables 为 1560 万(那么多?)
我只想得到一些关于我应该调整的设置以及我应该做些什么来使服务器运行良好的一般建议。我显然有可用的资源,但我认为 MySQL / Apache 在某种程度上受到限制。
服务器规格:Linux CentOS 5,带有 Plesk 9.5.4 和 MySQL 5.0。
我非常感谢任何提前提供的帮助。
答案1
我建议你使用MySQL 调优器。此 perl 脚本为您提供了许多有关您可以设置或更改哪些配置变量的建议。如果不知道您的确切统计数据,我可能无法给您更好的答案。
我也建议您在 MySQL 网站上查看 MySQLtuner 推荐的每个变量的具体作用。然后您将了解您可以设置的许多新变量。此外,您应该在第一次更改变量后约 48 小时运行此工具。通常您会得到更多(更好的)建议。
您使用 innodb 表更多还是 myisam?升级到 MySQL 5.5 是一个选项吗?
更新:关于你关于好教程的问题。我强烈建议你阅读MySQL 性能博客。确实有很多好文章(其中一篇我已经链接了)。
答案2
请记住,myisam 表在插入或更新期间被锁定,因此选择查询将等待。
您可以使用并发插入选项来加速插入速度,但不要指望奇迹。http://dev.mysql.com/doc/refman/5.0/en/concurrent-inserts.html
我想说切换到 5.5.x 和 InnoDB 是一个明智之举......
答案3
我发现MySQL 调优入门脚本(页面上的第一个项目)比前面提到的 MySQL Tuner 脚本更有用。
假设任一脚本的检查结果均正常,那么您是否考虑过使用 EXPLAIN 功能来优化查询?
正如其他人提到的,InnoDB 提供行级锁定,而 MyISAM 的表锁定则不然。虽然 InnoDB 的速度在 MySQL 5.5 中得到了很大的提升,但实际上任何 5.x 版本都应该会有所提升。
LOAD DATA INFILE 功能比插入功能快得多。如果可以采用这种方式,那就这样做吧。如果您的表有很多索引,那么请确保您的 key_buffer_size 足够大。如果您只使用了 20% 的 RAM,并且这是一台专用的 MySQL 服务器,那么您当然可以改进您的一般配置以获得更好的性能。