考虑这种情况,我的数据库表有300000行,并有全文索引。每当搜索完成时,它都会锁定数据库,并且不允许其他任何人登录门户。
任何有关如何整理这里内容的建议都是非常可取的。
最佳答案
登录是否对表执行写操作?例如。 “最后一次访问”时间?
如果是这样,您可能会期望出现类似这样的行为,因为MyISAM写入会对整个表进行锁定。通常,可以通过不使用noMydy MyISAM而不是转到具有行级锁定(以及其他理想的数据库功能)的InnoDB来避免这种情况。
当然,问题在于您只能使用MyISAM进行全文搜索。
因此,您需要拆分表。如果您可以将需要大量阅读的内容和全文内容与需要编写的内容保持在不同的表中(但使用相同的主键链接),则可以做到这一点,从而使两个操作不会相互影响。
最好将表的大部分迁移到InnoDB,而在MyISAM中只保留一个全文字段。然后,除了全文搜索之外的所有内容都可以避开MyISAM表,而仅使用表现出更好的锁定性能的InnoDB表。就个人而言,我现在倾向于将所有内容(包括文本)存储在InnoDB表中,并且纯粹出于全文搜索的目的将文本的第二个副本存储在MyISAM表中。这简化了查询和代码,并为文本内容带来了InnoDB一致性的优点,而且我还使用它来处理searchbait以获取词干以及MySQL全文通常不支持的其他功能。但这确实意味着您必须在存储上花费更多的空间。
您还可以通过减少写入次数来改善事务。例如,如果您正在写的是“最后一次访问”时间戳,则可以避免这样写,除非,例如,从前一个时间到现在已经过了一分钟,因为没有人需要知道确切的第二个人上次访问该网站。
关于mysql - Mysql FULLTEXT索引,搜索锁表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1398480/