繁体   English   中英

有没有一种“最佳方法”来短路mysql查询

[英]is there a “best way” to short circuit a mysql query

我遇到一种情况,正在根据用户提供的条件来组合查询,并想找出最有效的方法是执行此操作。

如果我有一个看起来像这样的表:

int id | varchar phone | varchar email | varchar RFID

并且用户将传入一个数组,该数组定义了他们要查找用户的顺序(和项),该用户看起来可能像这样:

["id","email","phone"]

或者看起来像这样:

["email"]

或者看起来像这样:

["phone","rfid"]

或这4个字段的任何其他可能组合。

根据收到的信息,我需要按这些字段到达的顺序查找用户,如果找到匹配项,我就不想一直查找。

换句话说,如果输入是

["email","rfid","phone"]

并且我查看了数据库并找到了具有提供的电子邮件的用户,我不想一直寻找他们的rfid是否也匹配,我只想返回那个用户。 但是,如果找不到这样的电子邮件,那么我想转到rfid。

因此,在我完成的各种测试中(大部分是在where子句中使用case语句),我的结果确实非常糟糕。 通常,我花几乎一秒钟的时间来返回一个值,而不是在简化搜索单个字段的where时花费<50ms。

我应该注意,所有这些字段都已建立索引。

所以...我的问题是,我应该咬一下子句并进行与传入数组中的项目一样多的sql调用,还是有一些真正有效的方法来构建单个查询,而不会像我这样困扰系统有各种尝试。

我认识到这可能是一个抽象的问题,但我希望有某种机制可以让我完全忽略。

我认为没有任何一种好的方法可以在SQL中进行短路。 您可以构造一个WHERE子句,该子句使用OR来组合critiera,但是这样做通常会阻止它使用索引。 您可以这样使用UNION

SELECT * FROM
    (SELECT 1 precedence, table.*
     FROM table
     WHERE field1 = 'value'
     UNION
     SELECT 2 precedence, table.*
     FROM table
     WHERE field2 = 'value'
     ...
    ) x
ORDER BY precedence
LIMIT 1

使用输入数组中的字段名称替换field1field2等。 这将在一个查询中产生期望的结果,但是它将必须执行所有子查询,并且不会短路。

最好的解决方案可能是在应用程序代码中解决它。 循环浏览输入中的字段,然后仅查询该字段。 得到结果后,请跳出循环并返回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM