考虑这种情况,我的数据库表有300000行并具有全文索引。每当搜索完成时,它都会锁定数据库,并且不允许其他任何人登录门户网站。
关于如何在这里整理东西的任何建议都会非常明显。
答案 0 :(得分:2)
登录是否执行对表的写入?例如。 “最后一次访问”时间?
如果是这样,你可能会发生类似这样的行为,因为MyISAM写入对整个表进行锁定。通常这可以通过不使用noddy MyISAM并转而使用InnoDB来避免,它具有行级锁定(以及其他理想的数据库功能)。
问题当然是你只能使用MyISAM进行全文搜索。
所以你需要拆分你的桌子。如果你可以将read-heavy和fulltext的东西保存在需要编写的东西(但使用相同的主键链接)的不同表中,你可以做到这一点,这样两个操作不会相互影响。
更好的是,将表的大部分迁移到InnoDB,在MyISAM中只留下一个全文字段。除了全文搜索之外的所有内容都可以避开MyISAM表,并且只使用表现出更好锁定性能的InnoDB表。就个人而言,我现在倾向于将所有内容存储在InnoDB表中,包括文本,并将文本的第二个副本存储在MyISAM表中,纯粹用于全文搜索目的;这简化了查询和代码,并将InnoDB的一致性带给了文本内容,我还使用它来处理searchbait,以获得MySQL的全文通常不支持的词干和其他功能。但这确实意味着你必须在存储上花费更多的空间。
您还可以通过减少写入次数来改善问题。例如,如果 是你正在写的“最后一次访问”时间戳,你可以避免写这个,除非比如前一次和现在之间已经过了一分钟,因为没有人需要知道有人最后一次访问该网站。
答案 1 :(得分:0)
如果您使用外部搜索引擎或MySQL搜索插件Lucene或Sphinx,他们应该能够在不锁定表的情况下读取和索引。它们存储索引记录的本地版本,因此它们不必经常读取表,也不需要写入它。