【问题标题】:MySQL InnoDB: Index Locks - Advice NeededMySQL InnoDB:索引锁 - 需要建议
【发布时间】:2011-07-18 19:56:16
【问题描述】:

我有一个应用程序正在向我的 mySQL 数据库发送函数调用。发送后,该函数会执行所需的操作(包括单行选择、按索引插入和更新)。

现在我每天可以进行大约一百万次 mySQL 调用。这些 mySQL 函数调用被分解为我的应用程序的实际“调用”,可以是 1 到 20 个不同的 mySQL 函数调用。我的应用每天收到大约 120,000 次“应用函数调用”。

我有 12 gigs 的 RAM,所以我将我的 InnoDB 内存 RAM 从 2 gigs 提高到 8 gigs 并且似乎没有增加。接下来我想,如果 1 个线程越来越多,添加线程会增加它。所以我这样做了,现在我看到了大量的索引锁错误。

我知道 MySQL 说简单地重新发送请求,这是可行的,但我没有看到速度有很大提高。无论线程如何,当单线程大约为 120,000 时,我基本上最多可以在我的一端进行 180,000 个“应用程序函数调用”。这是因为一旦我有大约 2-3 个线程,它就会不断出现线程锁定错误。

现在我的每个表都有大量索引以提高搜索效率,因为我有数百万行。但是,我计划复制这个数据库,以便一个新实例在 SLAVE 上进行大部分搜索,而主要数据保存在我的 MASTER 上(这是所有更新/插入)。因此,我在想,除了主键和唯一键之外,删除 MASTER 上的所有索引可能会降低这一点吗?然后我可以在 SLAVE 上添加索引。但是,如果索引不同,我什至不确定这是否可以使用 mySQL 的基本 REPLICATION 功能,因为这是我第一次尝试使用它。

关于我应该做些什么以使其更有效的任何建议。目前,MySQL 正在处理大约 1/20 我每天需要它处理的内容。

感谢任何反馈。

【问题讨论】:

    标签: mysql database optimization locking innodb


    【解决方案1】:

    您需要分析您的查询,以确保它们尽可能高效。使用内置的执行计划描述过程(EXPLAIN,或 MySQL 管理控制台中的执行计划可视化工具)来帮助您找出查询陷入困境的位置。

    在硬件解决方案方面,如果您没有完全在内存中执行,请考虑将您的磁盘升级到 SSD;它们提供的吞吐量可能非常显着(例如,IOPS 比旋转生锈高 2 个数量级)。

    【讨论】:

      【解决方案2】:

      您正在运行哪个 MySQL 版本? MySQL 的最新版本大大提高了 InnoDB 的并发性。您可能还想尝试Percona MySQL 构建。

      您能否详细介绍一下您的表结构以及查询的具体情况?当你说 INSERT 和 UPDATE 是按索引时,你是指主键还是二级索引?

      【讨论】:

      • SELECT 通常在二级索引上,因为我需要唯一的长字符串,所以我正在执行字符串的 CHR(32) MD5。 UPDATE 总是按主键。基本上我所做的是创建一个创建 INT 变量的函数。然后将其设置为“SELECT id FROM tbl WHERE md5=oMD5 LIMIT 1”。此时如果 1 为 NULL 我插入,否则我更新该行中的一些统计信息更新 ID。
      • 明智地构建,我在 windows x64 上运行 5.5
      • 考虑将 MySQL 服务器迁移到 Linux。差异可能是巨大的。我的经验是使用 MySQL 5.0,虽然我听说最近的版本有所改进,但我确信 MySQL 仍然针对在 Linux 上运行进行了优化。 Windows 甚至不支持许多优化(例如 Percona 服务器)。
      • 另外,您可以将 MD5 以二进制形式存储在 CHAR(16) 列中,这样可以将索引大小减少一半并显着提高性能。
      • 切换了,但并没有真正提高性能。至于切换到unix,如果需要我会,但这并不理想。我不擅长管理 UNIX,也不喜欢依赖他人来管理机器。
      【解决方案3】:

      1 - 也许您应该尝试对表进行分区。这将减少需要锁定的索引部分的大小。

      2 - http://www.youtube.com/watch?v=Oon06s9dXrY

      3 - 尝试通过不同的工作场景来分离你的线程。一个线程用于一种操作(例如订单注册),一个线程用于其他类型的操作(用于授权检查)。这会显着降低您的并发级别。

      4 - 如果可能,将缓存级别添加到您的应用程序

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-12
        • 1970-01-01
        相关资源
        最近更新 更多