AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 4303
Accepted
RPK
RPK
Asked: 2011-08-05 04:15:17 +0800 CST2011-08-05 04:15:17 +0800 CST 2011-08-05 04:15:17 +0800 CST

优化 InnoDB 默认设置

  • 772

我查看了 my.ini 并看到了各种默认设置。我的数据库在一台独立的 PC 上运行。我想总体上优化 InnoDB 和 MySQL 的性能以提高性能。没有磁盘空间的限制。我应该更改哪些默认设置以优化以获得更好的性能、可靠性和可能的​​时间点备份 [高可用性]。

已编辑

目前,每当我通过 MySQL Administrator 上的维护运行“优化表”时,它都会显示:

表不支持优化,改为重新创建+分析

在所有桌子上。我所有的表都是 InnoDB,但为什么它们不支持 Optimize?

mysql performance
  • 3 3 个回答
  • 14164 Views

3 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-08-05T08:18:57+08:002011-08-05T08:18:57+08:00

    调优 InnoDB 的方法是围绕

    • InnoDB 缓冲池:缓存数据页和索引页。您可以缓存的数据量和索引量不是磁盘空间限制的函数,而是 InnoDB 当前使用的可用内存和磁盘空间的函数。
    • InnoDB MetaData:默认情况下,文件 ibdata1 通常包含 InnoDB 的所有内容。这将包括数据页、索引页、表元数据、MVCC数据。

    这是我在过去 5 年中使用的一个公式,用于根据 InnoDB 数据和索引页面使用的磁盘空间计算 InnoDB 缓冲池:

    SELECT CONCAT(ROUND(KBS/POWER(1024,IF(Power1024<0,0,
    IF(Power1024>3,0,Power1024)))+0.49999),SUBSTR(' KMG',IF(Power1024<0,0,
    IF(Power1024>3,0,Power1024))+1,1)) recommended_innodb_buffer_pool_size
    FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
    WHERE engine='InnoDB') A,(SELECT 2 Power1024) B;
    
    • 使用 (SELECT 0 Power1024) 作为字节
    • 对 KB 使用 (SELECT 1 Power1024)
    • 对 MB 使用 (SELECT 2 Power1024)
    • 对 GB 使用 (SELECT 3 Power1024)
    • 为 TB 使用 (SELECT 4 Power1024)(如果您有 TerraBytes 的 RAM,请给我发电子邮件)

    当然,我说的是InnoDB当前使用的可用内存和磁盘空间的功能。从这里开始,只需使用常识。上述查询中推荐的数量不应超过 INSTALLED RAM 的 75% !!!这是调整 InnoDB 缓冲池大小的最简单的经验法则。

    您还应该将innodb_flush_method 设置为 O_DIRECT,因为它将提供 InnoDB 的稳定同步写入。我还写了一篇关于如何优化 InnoDB 的磁盘存储的文章。

    关于消息Table does not support optimize, doing recreate + analyze instead,您收到该错误消息的原因是存储引擎是 InnoDB 的事实。机械地, OPTIMIZE TABLE 只是将表复制到临时表并执行ANALYZE TABLE。

    实际上,针对 InnoDB 的 ANALYZE TABLE 完全没用。即使您在 InnoDB 表上运行 ANALYZE TABLE,InnoDB 存储引擎也会一遍又一遍地深入索引以获取基数近似值,从而破坏您刚刚编译的统计信息。事实上,Percona 对 ANALYZE TABLE 进行了一些测试,也得出了相同的结论。

    这是我一年来发表的关于 InnoDB Tuning 的其他帖子

    • https://stackoverflow.com/questions/3927690/howto-clean-a-mysql-innodb-storage-engine/4056261#4056261
    • https://stackoverflow.com/questions/5248420/at-what-point-does-mysql-innodb-fine-tuning-become-a-requirement/5250306#5250306
    • https://serverfault.com/questions/155455/how-do-myisam-and-innodb-utilize-hd-space/246111#246111
    • https://serverfault.com/questions/230551/mysql-innodb-innodb-file-per-table-cons/231400#231400
    • https://serverfault.com/questions/253059/mysql-innodb-optimisation/253233#253233
    • 您如何针对繁重的 InnoDB 工作负载调整 MySQL?
    • 13
  2. Derek Downey
    2011-08-05T05:49:55+08:002011-08-05T05:49:55+08:00

    这是一篇关于“粗调”重要变量的旧文章。最重要的可能是innodb_buffer_pool_size

    我强烈建议升级到 MySQL 5.5(如果您还没有运行它)。他们对 InnoDB 的性能做了很多改变。他们甚至提供了一个关于如何优化 InnoDB 的主流部分,因为它是默认引擎:http ://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb.html

    至于时间点备份,您需要查看二进制日志。启用此功能的基础是log-bin在 my.cnf 中设置变量

    • 3
  3. Mike Sherrill 'Cat Recall'
    2011-08-05T07:42:07+08:002011-08-05T07:42:07+08:00

    优化有很多颜色。

    我认为您的第一步应该是决定“优化”对您意味着什么。对于某些人来说,这意味着“最快的 SELECT 查询”。对于其他人来说,这意味着“SELECT 性能和 INSERT 性能之间的最佳平衡”。对于其他人来说,“最快的 INSERT 性能”。

    在开始调整之前,您需要确定您的标准是什么以及如何判断您的更改是否有帮助。

    然后将您的配置文件和启动选项置于版本控制之下,并开始试验。记录你遵循谁的建议,以及你在哪里找到的。(随着代码库和硬件的变化,建议随着时间的推移而变化。)也将这些文档置于版本控制之下。

    • 2

相关问题

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve