从Super Guru MySQL / PHP专家那里寻求一些帮助和建议,他们可以花一些时间。
我有一个使用PHP / MySQL的Web应用程序,该应用程序已经发展了很多年,并且在它上面获得了大量搜索。现在,当使用MySQL LOAD DATA INFILE处理新行的各种日常数据转储时,就会遇到瓶颈。
它具有约150万行的大型MyISAM表,并且所有SELECT查询都在其上进行。当这些操作在大约60万行的LOAD DATA INFILE期间发生(并删除过时的数据)时,它们将被备份并花费大约30分钟以上的时间来释放,从而使所有这些搜索均无效。
我需要想出一种方法来更新该表,同时保留在合理的时间内提供SELECT结果的功能。
我完全没有想法,自己无法提出解决方案,因为我第一次遇到这种问题。
我们将不胜感激,因为我很乐于学习解决此类问题,因此我们将不胜感激。
非常感谢大家的宝贵时间! Ĵ
最佳答案
MyISAM不支持行级锁定,因此诸如mysqldump之类的操作被迫锁定整个表以确保一致的转储。您唯一可行的选择是切换到另一个支持行级锁定的表(例如InnoDB),和/或将转储分成较小的块。小转储在转储/重装时仍将锁定表,但是锁定时间会更短。
一个比较麻烦的选择是拥有“实时”和“备份”表。在备份表上执行转储/加载操作。当它们被复制时,可以将其换成活动表(重命名表,或者让代码动态更改他们正在使用的表)。如果您可以使用一小段潜在的过时数据窗口,则可能会更好选项。
关于mysql - 当仍然需要实时SELECT查询时,MySQL锁定处理大型LOAD DATA INFILE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5072246/