我正在对一个表进行搜索(几个内部连接),最长运行时间为5秒(750万行)。该表是MyISAM类型,我没有使用全文索引,因为在这种情况下,我发现使用MATCH AGAINST和普通的“like”语句速度没有区别。现在,由于表被锁定,我的查询需要几分钟才能完成,这让我很烦恼。如果我尝试将引擎切换到InnoDB,会有好处吗?或者只有在插入或更新行时才有帮助,而不仅仅是选择它们?整个表锁定的问题正在折磨着我。
InnoDB支持行级锁定而不是表级锁定...这应该可以缓解您的问题(尽管我不确定它是否完全消除)。
您最好使用专用搜索系统(如Sphinx、Lucene或Solr)。
行级锁和表级锁的区别只在插入和更新查询时才重要。如果您主要进行选择操作(因此插入/更新不会太频繁地锁定表),则差异不会太大(尽管在最近的基准测试中,InnoDB似乎优于MyISAM)。
您可以考虑其他方法来重新组织数据结构,例如包括带有“标签”或“关键字”的附加查找表。按照webdestroya建议实现更有效的全文引擎。
最后但并非最不重要的是,我也很惊讶您使用FULL TEXT与LIKE获得了类似的结果。如果您搜索的字段不是真正宽广的话,这种情况可能会发生,在这种情况下,也许具有=搜索的标准B-TREE索引就足够了?