重写此查询的最佳方法是:
SELECT myField
FROM myPrefix.myTable
WHERE myField2 IN (?) AND
GET_LOCK(CONCAT('action:',myField3), 0) = 1
LIMIT 1
myField2
有一个索引。
现在,MySQL首先评估IN
操作(因为它知道它上面有索引),然后管道GET_LOCK
操作。
我如何确保始终如此,并且不会在MySQL升级/等之间切换相反的方式。
AKA,我的问题是,我怎样才能确保GET_LOCK
永远不会被评估。我想将这一切保留在一个查询中。
答案 0 :(得分:0)
这取决于正在使用的优化器类型。
Does order of where clauses matter in SQL
我不确定以下解决方案是否已经过优化,但如果您只想在检查'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