我有一个named_scope中使用了LIKE和NOT LIKE两个条件。与使用REGEXP相比,这种方法在执行上是否更快?
named_scope :order_search, :order => "name LIKE '%urgent%' AND name NOT LIKE '%not urgent%' DESC, created_at DESC"
我有一个named_scope中使用了LIKE和NOT LIKE两个条件。与使用REGEXP相比,这种方法在执行上是否更快?
named_scope :order_search, :order => "name LIKE '%urgent%' AND name NOT LIKE '%not urgent%' DESC, created_at DESC"
这只是毫秒的差别,几乎不会被注意到。除非您需要处理大量的流量,否则它并不重要。
如果您的方法遇到性能问题,那很可能是因为您的表格有大量的行。瓶颈不在于 LIKE (MySQL 也支持 REGEXP),而在于您的表结构。
无论如何,您应该学习一下 MySQL 索引 和 MySQL 全文搜索。
LIKE
在这种情况下会使用Boyer-Moore算法,因此与使用触发器将整个表达式存储在is_urgent
字段中相比,可能会有轻微优势。然后,您可以在(is_urgent, created_at)
上添加索引。您的查询不是最左边的查询,因此无法使用索引,所以like和regexp是相同的。
RLIKE
或REGEXP
。 - xkeshav