MySQL的哪些configuration选项提供了最大的速度提升?
我想知道实际的configuration文件改进,表types,硬件设置,复制等查询结构和表结构(这些很容易find网站和堆栈溢出)以外的任何东西。 查询caching设置是什么给了你最快的速度? 驱动器如何? 在外部RAID或内部使用它会更好吗? 复制是否为您提供了更好的性能,特别是在读取大型查询时
你有什么其他设置/改变来改善MySQL的性能?
注意:我意识到这些依赖于使用(即小型网站vs数据仓库),但我认为我们大多数人可能在各种网站/系统上工作,所以了解适用于不同网站的各种技术的情况。 另外,我认为一些技巧可以在情况之间转移。
这里是我的build议(你的米尔可能会有所不同)
戴夫·切尼(Dave Cheney)再一次把这件事从公园里敲了出来。 我真的不能添加任何东西来解答你的问题。 不过,我想指出你没有问的。 正如Jeremy Zawodny和Peter Zaitsev几年前所教导的那样,您花在追踪和优化错误查询上的时间的投资回报率(ROI)将超出您的投资回报率(ROI),使configuration更改的时间缩短10倍。 当然,你不希望有一个糟糕的configuration,错误的RAID设置或RAM不足。 但是,在优秀的,甚至是边缘的MySQL DBA中,糟糕的查询(通常来自开发者/框架,而不是DBA)是一种慢性病 ,在这种情况下,糟糕的configuration是可以忍受的 。
(我为这些形容词挖了一段时间,仍然不满意我select的那些)。
我想再次强调一下,如果你的开发者正在使用象Ruby on Rails和Django这样的框架中常见的ORM,那么你真的必须监视你的数据库中的查询。 当开发人员停止思考SQL并让数据库被抽象出来的时候,真是令人讨厌。我喜欢刚刚提到的两个框架。 (不要因为糟糕的表情而投票给我)。这只会让Query Sleuthing变得非常重要。 (阅读:工作安全)
其他几件事(在Dave Cheney的答案中没有提到)
尝试将innodb_flush_method设置为O_DIRECT以避免数据的双缓冲。 如果您的RAID卡没有电池支持的写入caching或者您的数据位于SAN上,请避免这种情况。
也玩innodb_thread_concurrency。 我相信默认是8,但是这是值得调整的,看看它是否提高性能
确保查询caching已打开,并检查统计数据以查看命中率。 如果这是好的尝试增加它,看看它是否提高命中率。
根据应用程序的运行情况,您可能会更改默认的隔离级别。 缺省值是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的默认设置非常保守。 无论您使用哪种引擎,您都可能需要将内存参数数量提高10倍甚至100倍。
接下来你应该做的是看看表caching。 默认值是64,只有当你不超过60个表时才有用。 你会想提高很长一段路。
你应该做的第三件事是看线程和连接参数。 对于大多数基于Web的应用程序,默认的wait_timeout非常长,可以缩短到30秒。 这也将改善内存使用情况,因为MySQL将更快地获得连接,而在“睡眠”状态下则更less。