MySQL 的哪些配置选项提供了最大的速度改进?
我想知道实际的配置文件改进、表类型、硬件设置、复制等。除了查询结构和表结构(这些很容易在网站和 Stack Overflow 上找到)。查询缓存设置之类的东西是什么给了你最快的速度吗?驱动器怎么样?将它放在外部 RAID 上还是内部更好?复制是否为您提供了更好的性能,尤其是在读取大型查询时?
您还进行了哪些其他设置/更改来提高 MySQL 的性能?
注意:我意识到这些非常依赖于使用(即小型网站与数据仓库),但我认为我们中的大多数人可能在各种站点/系统上工作,因此很高兴了解可以应用于不同的各种技术情况。另外,我认为一些技术可以在不同情况之间转移。
这是我的建议(您的米数可能会有所不同)
再一次,戴夫切尼真的把它赶出了公园。我真的无法在他对您问题的回答中添加任何内容。但是,我想指出你没有问的问题。正如 Jeremy Zawodny 和 Peter Zaitsev 几年前告诉我的那样,您在跟踪和优化错误查询上所花费的时间的投资回报率将超过您在进行配置更改所花费的时间上的 ROI 10 倍。当然,您不希望配置不佳、RAID 设置错误或 RAM 不足。但是,在优秀的甚至是边缘的 MySQL DBA 错误查询(通常来自开发人员/框架,而不是 DBA)中是一种慢性病,其中错误的配置是可以忍受的。
(我为那些形容词挖掘了一段时间,但仍然对我选择的那些不满意。)
我想再次强调,如果您的开发人员正在使用像 Ruby on Rails 和 Django 等框架中常见的 ORM,那么您真的必须监控命中数据库的查询。当开发人员停止考虑 SQL 并让 DB 被抽象出来时,这真的很讨厌。我喜欢我刚才提到的两个框架。(不要因为我说他们的坏话而投票给我。)它只是让查询侦查非常重要。(阅读:工作保障)
其他几件事(戴夫切尼的回答中没有提到)
尝试将 innodb_flush_method 设置为 O_DIRECT 以避免数据的双重缓冲。如果您的 RAID 卡没有电池支持的写入缓存或您的数据位于 SAN 上,请避免这种情况。
还可以使用 innodb_thread_concurrency。我相信默认值为 8,但值得对其进行调整以查看它是否可以提高性能
确保查询缓存已打开并检查统计信息以查看命中率。如果它很好,请尝试增加它,看看它是否会提高命中率。
根据运行的应用程序,您可能能够更改默认隔离级别。默认值为 REPEATABLE_READ 但 READ_COMMITTED 可能会给您更好的性能
如果您的语句主要是 UPDATE 和 DELETE,那么您可以尝试通过执行 SELECT 查询来启动从属服务器上的缓存,该查询返回要修改的结果集。查看mk-slave-prefetch工具,它将为您执行此操作
看看除了 MyISAM 和 InnoDB 之外的其他存储引擎
不能说硬件,但你可以试试http://blog.mysqltuner.com 。这是一个分析 MySQL 设置的 Perl 脚本。
您可以在http://www.thomas-krenn.com/de/wiki/MySQL_Performance_Tuning#mysqltuner.pl看到示例输出
您应该做的第一件事是查看内存参数。MySQL 的默认设置非常非常保守。无论您使用什么引擎,您都可能需要将许多内存参数提高十倍甚至一百倍。
您应该做的下一件事是查看表缓存。默认值为 64,仅当您的表不超过 60 个时才有用。你会想提出很长的路要走。
您应该做的第三件事是查看线程和连接参数。对于大多数基于 Web 的应用程序来说,默认的 wait_timeout 非常长,可以减少到 30 秒左右。这也将提高内存使用率,因为 MySQL 将更快地获得连接,从而减少处于“睡眠”状态的情况。