我阅读了mysql文档,发现
insert
有一个LOW_PRIORITY开关,而select有一个HIGH_PRIORITY。
我需要一个“LOW_PRIORITY”来处理一些缓慢的查询。例如,我的客户想要一些
like
前导通配符查询,就像DBA SO中的这个问题,如何在MySQL中对数字列进行全文搜索以满足用户要求,以查询搜索表单'%中的数字字段334%'.
在我的例子中,这是一列包含 11 个数字字符的客户手机号码,我的一个客户有一个查询中间 4 位数字的用例。
我最初想使用FTS,但正如那里的答案所说“当搜索中间的数字字符串时,FULLTEXT是错误的方法。LIKE是唯一的方法,它需要对车牌进行全面扫描。实时与它。”
因此,我必须忍受缓慢的查询,并让我的客户知道,如果这样做,结果会很慢。但我需要确保该查询不会使用我的所有 MySQL 服务器资源,以便我的其他客户可以在这段时间内执行他们的“正常”查询。
所以我需要 LOW_PRIORITY 的效果来作为前导通配符查询。有办法做到吗?
MySQL 没有您所描述的功能。
LOW_PRIORITY
和HIGH_PRIORITY
的选项仅适用于表锁定存储引擎,例如MyISAM或MEMORY。这些选项对 InnoDB 表没有影响。 InnoDB 是默认的存储引擎,InnoDB 的好处通常超过使用 MyISAM 的选择,因此您应该更喜欢 InnoDB 而不是 MyISAM。
即使对于 MyISAM,
LOW_PRIORITY
选项也不适用于 SELECT
查询。这仅适用于INSERT
/UPDATE
/DELETE
。
对于您的场景,更好的解决方案是创建副本数据库服务器,并在副本上运行长时间运行的查询(例如报告)。这消除了查询竞争资源并阻碍源服务器上其他重要查询的可能性。
MySQL 中的复制是异步的,这意味着即使您通过昂贵的查询降低副本服务器的速度,也不会对源服务器产生任何影响。它可能会稍微延迟复制,但这不会影响源。