我的网站在结帐时遇到问题。我正在使用Magento Enterprise 1.8,我的结账模块是Idev的Onestepcheckout。
我们看到的问题是eav_entity_store表花费了很长的时间(最多51秒)才能将订单号返回到Mage_Eav_Model_Entity_Type。
我所知道的是运行查询以获取这是一个以“FOR UPDATE”运行的事务,因此被访问的行将被锁定,直到事务完成。我已经查看了代码的其他部分以及整个事务中的代码,其中行被锁定(我们正在使用InnoDB,因此一旦事务提交就应该释放锁)并且我只是没有看到那里(或在慢查询日志中)应该导致锁定等待51秒附近的任何东西。
我已经考虑过请求可能会堆积起来并且在等待时慢慢爬上来,但我看到查询时间从6ms到20k ms到50k ms 1,2,3。这不是100-200个请求的问题,因为每天只有几十个请求。
我知道MySql使用父锁定,但是没有与此表相关的FK。有两个BTREE指数一度是FK,但后来被改变(多年前发生过)。对于那些非Magento savy的人来说,eav_entity_store表少于50行,只有5列宽(4个smallint和一个varchar)。我严重怀疑表格化或不正确的索引是罪魁祸首。但是,根据TLDR的精神,我会说两个BTREE索引是我们从该表中选择的两列。
一种可能性是我可能需要用复合索引替换这两个索引,因为此表的唯一读取来自读取的查询(FROM [带索引A的列]和[带索引B的列]) 。我根本不知道行级锁定是否会阻止此查询使用当前表中的索引访问表中的另一行。
此时,我已经确信底层问题严格与数据库相关,但任何有关此问题的Magento或MySql建议都将非常感激。任何人仍然真正阅读这个可以希望我已经用尽了许多选项,并在这里严重困扰。您认为可能有用的任何信息都是受欢迎的。感谢。
修改我们看到的确切错误是: 错误消息:SQLSTATE [HY000]:常规错误:1205超出锁定等待超时;尝试重新启动交易
答案 0 :(得分:0)
问题解决了。 MySql不是问题。出于某种原因,发票号码的生成花费了大量的时间。公司不使用Magento的发票。关掉它们。问题解决了。关于发票生成的具体问题,没有完整的RCA。