这种情况需要使用InnoDB还是MyISAM?

4
我正在对一个表进行搜索(几个内部连接),最长运行时间为5秒(750万行)。该表是MyISAM类型,我没有使用全文索引,因为在这种情况下,我发现使用MATCH AGAINST和普通的“like”语句速度没有区别。现在,由于表被锁定,我的查询需要几分钟才能完成,这让我很烦恼。如果我尝试将引擎切换到InnoDB,会有好处吗?或者只有在插入或更新行时才有帮助,而不仅仅是选择它们?整个表锁定的问题正在折磨着我。

请提供一些例子 - 我很想看看当存在全文索引时,LIKE如何与FTS相媲美。 - OMG Ponies
1
是的,如果使用MATCH AGAINST比LIKE慢,那么我认为你必须有些操作阻止了索引的使用。 - bobince
谢谢,我会再试一次全文搜索...现在数据库非常庞大,正如我在之前的评论中提到的,我不会对文本/二进制数据进行搜索。将看看它是否能提高性能。我认为这与数据库结构以及硬盘性能有关。我已经将查询时间从200多秒降至6秒,但有时候它需要一些时间来处理,我想知道是否存在锁定表的情况。也许根本不是这个问题。 - AcidRaZor
2个回答

1

InnoDB支持行级锁定而不是表级锁定...这应该可以缓解您的问题(尽管我不确定它是否完全消除)。

您最好使用专用搜索系统(如Sphinx、Lucene或Solr)。


1
SolR是另一种选择,基于Lucene构建。 - OMG Ponies
感谢您的评论,我会研究一下其他选择。但是,就目前而言,我的问题已经被Mchl回答了。在您的意见帮助下,我可以再次投入更多时间进行全文索引,并进行一些基准测试,以比较有/无索引的情况。客户需要在几天内上线,而之前的开发人员没有考虑到数据增长的巨大。 - AcidRaZor

0

行级锁和表级锁的区别只在插入和更新查询时才重要。如果您主要进行选择操作(因此插入/更新不会太频繁地锁定表),则差异不会太大(尽管在最近的基准测试中,InnoDB似乎优于MyISAM)。

您可以考虑其他方法来重新组织数据结构,例如包括带有“标签”或“关键字”的附加查找表。按照webdestroya建议实现更有效的全文引擎。

最后但并非最不重要的是,我也很惊讶您使用FULL TEXT与LIKE获得了类似的结果。如果您搜索的字段不是真正宽广的话,这种情况可能会发生,在这种情况下,也许具有=搜索的标准B-TREE索引就足够了?


谢谢。你的“不是很宽”的意思是什么?目前我搜索的唯一字段是4个varchar(255)字段,全部包含出版商/书名/主题分类等信息。全文检索真的会帮助到这么多吗?它是否与复合索引(例如,按product_id+publication_date排序可以极大地提高速度)基本上相同?可能是数据库存在问题(我接手了另一个开发人员的工作),这就是为什么我使用LIKE而不是match against获得了类似(如果不是更好的)速度的原因。 - AcidRaZor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接