2

重写此查询的最佳方法是什么:

SELECT myField 
FROM myPrefix.myTable 
WHERE myField2 IN (?) AND 
    GET_LOCK(CONCAT('action:',myField3), 0) = 1 
LIMIT 1

myField2上面有索引。

现在,MySQLIN首先评估操作(因为它知道上面有一个索引),然后对GET_LOCK操作进行管道化。

我怎么能确定这将永远是这种情况,并且不会在 MySQL 升级/等之间切换。

AKA,我的问题是,我怎样才能确保GET_LOCK永远不会先被评估。我想将这一切都保留在一个查询中。

4

1 回答 1

0

这取决于正在使用的优化器数据库的类型。

SQL 中 where 子句的顺序是否重要

我不确定下面的解决方案是否经过优化,但如果您希望仅在检查“myField2”后才执行“GET_LOCK”,那么您可以试试这个:

SELECT t.myField 
FROM (SELECT * FROM myPrefix.myTable  WHERE myField2 IN (?) ) t
WHERE GET_LOCK(CONCAT('action:',t.myField3), 0) = 1 
LIMIT 1
于 2013-08-19T20:11:15.427 回答