MySQL InnoDB:索引锁 - 需要建议

时间:2011-07-18 19:56:17

标签: mysql database optimization locking innodb

我有一个将函数调用发送到mySQL数据库的应用程序。一旦发送,该函数就会执行它所需的功能(包括单行选择,按索引INSERT和UPDATE)。

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

我有12演出的RAM,所以我将InnoDB内存RAM从2演出增加到8演出,但似乎没有增加。接下来我想,如果1个线程得到那么多,添加线程会增加它。所以我这样做了,现在我看到了大量的Index Locks错误。

我知道MySQL只是重新发送请求,这有效,但我没有看到速度增加很多。当单线程大约是120,000时,无论线程如何,我基本上都在180,000“app函数调用”。这是因为一旦我有大约2-3个线程,它的常量线程锁定错误。

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

关于如何使其更有效的任何建议。现在,MySQL在某一天的处理速度约为我所需要的1/20。

我感谢任何反馈。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

你在运行什么MySQL版本?最新版本的MySQL改进了InnoDB并发性。您可能还想尝试Percona MySQL版本。

您是否还可以提供有关表格结构以及查询结果的详细信息?当你说INSERT和UPDATE是索引时,你的意思是主键还是辅助索引?

答案 2 :(得分:0)

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

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

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

4 - 尽可能为您的应用程序添加缓存级别