MySQL的哪些configuration选项提供了最大的速度提升?

MySQL的哪些configuration选项提供了最大的速度提升?

我想知道实际的configuration文件改进,表types,硬件设置,复制等查询结构和表结构(这些很容易find网站和堆栈溢出)以外的任何东西。 查询caching设置是什么给了你最快的速度? 驱动器如何? 在外部RAID或内部使用它会更好吗? 复制是否为您提供了更好的性能,特别是在读取大型查询时

你有什么其他设置/改变来改善MySQL的性能?

注意:我意识到这些依赖于使用(即小型网站vs数据仓库),但我认为我们大多数人可能在各种网站/系统上工作,所以了解适用于不同网站的各种技术的情况。 另外,我认为一些技巧可以在情况之间转移。

    这里是我的build议(你的米尔可能会有所不同)

    • 使用硬件RAID。 这与我在其他post中使用软件RAID的build议背道而驰,但是这是您需要硬件RAID卡的特定情况。 具体而言,您希望RAID卡上的电池备份NVRAM减less将fsync日志文件logging到磁盘的时间。
    • 仅使用RAID 1或RAID 10卷。 RAID 5或6写入的成本太高,无法承受混合的读/写工作负载。
    • 为数据,日志和tmp卷使用单独的LUN。 这些应该都是独立于操作系统和交换卷。
    • 使用InnoDB 。
    • 使用innodb_file_per_table
    • 使用64位操作系统
    • 将InnoDB缓冲池设置为可用RAM的80%
    • 将您的日志文件设置为您的缓冲池大小的1/4,即2到4个日志文件。 较大的日志文件意味着更慢的关机和恢复时间,但允许您更快地恢复大型数据库转储。
    • log_schecking_queries,log-queries-not-using-indexes,set-variable = long_query_time = 1,调查该日志中的每个查询,重构模式以尽可能避免表扫描和tmp表。

    戴夫·切尼(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。