MySQL 的哪些配置选项可以最大程度地提高速度?

MySQL 的哪些配置选项可以最大程度地提高速度?

MySQL 的哪些配置选项可以最大程度地提高速度?

我想知道实际的配置文件改进、表类型、硬件设置、复制等。除了查询结构和表结构之外的任何东西(这些在网站和 Stack Overflow 上很容易找到)。查询缓存设置之类的东西是否为您提供了最快的速度?驱动器怎么样;将它放在外部 RAID 还是内部 RAID 上更好?复制是否为您提供了更好的性能,尤其是在读取大量查询时?

您做了哪些其他设置/更改来提高 MySQL 的性能?

注意:我意识到这些非常依赖于用途(即小型网站与数据仓库),但我认为我们大多数人可能在各种网站/系统上工作,因此了解可应用于不同情况的各种技术是很好的。此外,我认为一些技术可以在不同情况之间转移。

答案1

以下是我的建议(您的建议可能会有所不同)

  • 使用硬件 RAID。这与我在其他帖子中建议使用软件 RAID 相悖,但这是您需要硬件 RAID 卡的特定情况。具体来说,您需要 RAID 卡上的电池供电 NVRAM 来减少将日志文件 fsync 到磁盘所需的时间。
  • 仅使用 RAID 1 或 RAID 10 卷。在混合读/写工作负载中,RAID 5 或 6 写入的成本太高,无法承受。
  • 对数据、日志和临时卷使用单独的 LUN。这些卷应与操作系统和交换卷分开。
  • 使用数据库引擎InnoDB
  • 使用 innodb_file_per_table
  • 使用 64 位操作系统
  • 将 InnoDB 缓冲池设置为可用 RAM 的约 80%
  • 将日志文件设置为缓冲池大小的 1/4,即 2 到 4 个日志文件。日志文件越大意味着关机和恢复时间越慢,但可以让你更快地恢复大型数据库转储。
  • log_slow_queries,log-queries-not-using-indexes,set-variable = long_query_time=1,调查该日志中的每个查询,重构您的模式以尽可能避免表扫描和临时表。

答案2

Dave Cheney 再次给出了完美的答案。我真的无法补充他对你问题的回答。但是,我想指出你没有问到的问题。正如 Jeremy Zawodny 和 Peter Zaitsev 多年前教给我的那样,你花在追踪和优化错误查询上的时间的投资回报率将比花在更改配置上的时间的投资回报率高出 10 倍。当然,你不希望出现糟糕的配置、错误的 RAID 设置或内存不足的情况。但是,对于优秀甚至边缘的 MySQL DBA 来说,错误查询(通常来自开发人员/框架,而不是 DBA)是慢性的条件,其中错误的配置是一个可忍受的一。

(我研究了这些形容词一段时间,但仍然对我选择的形容词不满意。)

我想再次强调,如果您的开发人员使用的是 Ruby on Rails 和 Django 等框架中常见的 ORM,那么您真的必须监控访问数据库的查询。当开发人员不再考虑 SQL 并让数据库抽象化时,这种情况就会非常严重。我喜欢我刚才提到的两个框架。(不要因为我说了它们的坏话而投票反对我。)这让查询侦查变得非常重要。(阅读:工作保障)

答案3

其他一些事情(Dave Cheney 的回答中没有提到)

  • 尝试将 innodb_flush_method 设置为 O_DIRECT 以避免数据双重缓冲。如果您的 RAID 卡没有电池支持的写入缓存或您的数据位于 SAN 上,请避免这样做。

  • 还可以尝试使用 innodb_thread_concurrency。我相信默认值是 8,但值得调整它以查看它是否能提高性能

  • 确保查询缓存已打开,并检查统计数据以查看命中率是多少。如果命中率不错,请尝试增加命中率以查看是否能提高命中率。

  • 根据运行的应用程序,您可能能够更改默认隔离级别。默认值为 REPEATABLE_READ,但 READ_COMMITTED 可能会为您提供更好的性能

  • 如果您的语句主要是 UPDATE 和 DELETE,那么您可以尝试通过执行 SELECT 查询来启动从属服务器上的缓存,该查询将返回要修改的结果集。请查看mk-从属-预取可以为你完成此操作的工具

  • 除了 MyISAM 和 InnoDB 之外,看看其他存储引擎

答案4

您应该做的第一件事是查看内存参数。MySQL 的默认设置非常保守。无论您使用哪种引擎,都可能需要将一些内存参数提高十倍甚至一百倍。

接下来你应该查看表缓存。默认值为 64,只有当你的表不超过 60 个时才有用。你会希望将其提高很多。

您应该做的第三件事是查看线程和连接参数。对于大多数基于 Web 的应用程序来说,默认的 wait_timeout 非常长,可以缩短到 30 秒左右。这也会改善内存使用率,因为 MySQL 将更快地收获连接,从而减少处于“睡眠”状态的连接。

相关内容