2011-10-12 129 views
1

我们对我们的mysql数据库使用InnoDB引擎,但由于数据集非常庞大,我们在flat myisam表中汇总数据。我们必须使用myisam,因为我们也使用全文搜索。MySQL - 如何避免查询锁定

一般查询对平表作为快很多,但问题是,我们现在有要运行的锁定长期所有搜索查询更新脚本....

我不知道是否有更好的方法保持搜索表或如何在不锁定其他搜索查询的情况下运行更新脚本。

回答

0

如果您可以承担额外的空间,最简单的选择将是在单独的名称下创建新表,然后使用重命名交换新表。然后你可以丢弃旧桌子。

或者,您可能会考虑类似Sphinx这会为您的表索引,并为大多数流行语言提供搜索API。

0

尽管我认为MySQL很棒,但全文搜索功能(恕我直言)只是一个坏主意。

我看到它应用的唯一地方是实现用户驱动的关键字搜索功能或绕过一个非常糟糕的设计和非规范化的模式。

它不允许雅虎,谷歌等提供的那种搜索功能所需的控制级别。 OTOH实施一种结构来支持这种控制/灵活性是微不足道的。

至于在其他地方犯的错误修复螺栓......真的,你应该修复这个错误。

但留下的是,除了暂时....

你不能理智地避免锁定在MyISAM引擎的大部分更新的表。但是,您可以以块的形式执行更新,以降低对其他需要更快访问数据的查询的影响。

但是,如果您只更新表中的一小部分行,并且所用的时间主要是使用非/很差索引列来查找行,那么您可能需要选择表的主键到临时表中,然后使用它来驱动更新。