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


29

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

我想知道实际配置文件的改进,表类型,硬件设置,复制等。除了查询结构和表结构(在网站和Stack Overflow上都很容易找到)以外的任何内容。诸如查询缓存设置之类的东西使您获得最快的速度吗?硬盘怎么样?在外部RAID或内部RAID上更好?复制是否给您带来更好的性能,尤其是在读取大型查询时?

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

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


并不完全相关,但是您应该将InnoDB用作主数据库。您可以复制到MyISAM从站,并使用其内置的全文本搜索功能,使文本查找比LIKE快得多
Neil McGuigan

Answers:


20

这是我的建议(您的米数可能会有所不同)

  • 使用硬件RAID。这与我在其他帖子中使用软件RAID的建议背道而驰,但是在特定情况下,您需要硬件RAID卡。特别是,您希望电池支持RAID卡上的NVRAM减少将日志文件fsync到磁盘的时间。
  • 仅使用RAID 1或RAID 10卷。RAID 5或6写入的成本太高,无法承受混合的读/写工作负载。
  • 为数据,日志和tmp卷使用单独的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,调查该日志中的每个查询,重构您的架构以避免可能的表扫描和tmp表。

11

戴夫·切尼(Dave Cheney)再次把它从这里的公园里撞了出来。我真的无法在他对您问题的回答中添加任何内容。但是,我想指出您没有问什么。正如杰里米·扎沃德尼(Jeremy Zawodny)和彼得·扎伊采夫(Peter Zaitsev)几年前教给我的那样,您用于跟踪和优化错误查询所花费时间的投资回报率将使您进行配置更改10倍所花费时间的投资回报率更高。当然,您不想配置错误,RAID设置错误或RAM不足。但是,在优秀的甚至微不足道的MySQL DBA错误查询(通常来自开发人员/框架,而不是DBA)中,长期查询是一种长期情况,错误的配置是可以持久的

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

我想再次强调一下,如果您的开发人员使用的是像Ruby on Rails和Django这样的框架中常见的ORM,则您实际上必须监视命中数据库的查询。当开发人员停止考虑SQL并让数据库抽象出来时,这真令人讨厌。我喜欢我刚才提到的两个框架。(不要因为我口口相传而对我投反对票。)这只是使查询侦听非常重要。(阅读:工作安全)


4

其他几件事(Dave Cheney的答案中未提及)

  • 尝试将innodb_flush_method设置为O_DIRECT以避免数据的双重缓冲。如果您的RAID卡没有电池备份的写缓存,或者您的数据在SAN上,请避免这种情况。

  • 也可以玩innodb_thread_concurrency。我相信默认值为8,但是值得对其进行调整以查看它是否可以提高性能

  • 确保查询缓存已打开,并检查统计信息以查看命中率。如果很好,请尝试增加它以查看是否提高了命中率。

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

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

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



1

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

您应该做的下一件事是查看表缓存。默认值为64,仅当表数不超过60个时才有用。您将需要很长的路要走。

您应该做的第三件事是查看线程和连接参数。对于大多数基于Web的应用程序,默认的wait_timeout相当长,可以减少到30秒左右。这也将提高内存使用率,因为MySQL会更快地获得连接,从而使处于“睡眠”状态的时间减少了很多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.