优化多个OR查询

2023-12-23

我有一个数据库表,我需要验证用户是否输入了相同或部分相同的信息。

这就是我的想法

数据库布局

rec_id (pk), user_id,
name, phone, address_1, address_2, zip, 
company, co_phone, co_address_1, co_address_2, co_zip, 
billing, bi_phone, bi_address_1, bi_address_2, bi_zip

查询

SELECT rec_id 
FROM tbl_name
WHERE user_id = '123456789'
OR '1112223333' IN (phone, co_phone, bi_phone)
OR 'John Doe' IN (name, business, billing)
OR '12345' IN (zip, co_zip, bi_zip)
OR '123 main street' IN (address_1, co_address_1, bi_address_1)
OR 'po box 123' IN (address_2, co_address_2, bi_address_2)

如果任何数据匹配(是的,这将是误报),我需要旧的 rec_id。

想知道是否有更好的方法来做到这一点?

Thanks


为了使该查询性能良好,您需要为正在测试的每个列建立单独的索引。所有列上的组合索引对于 OR 条件根本没有帮助(但如果有 AND 则会有所帮助)。

但是,我认为无论您添加哪些索引,您的查询都会导致全表扫描。您可能想尝试使用 UNION 而不是 OR 来看看是否有区别:

SELECT rec_id FROM tbl_name WHERE tax_id = '123456789'
UNION
SELECT rec_id FROM tbl_name WHERE phone = '1112223333'
UNION
SELECT rec_id FROM tbl_name WHERE co_phone = '1112223333'
UNION
SELECT rec_id FROM tbl_name WHERE bi_phone = '1112223333'
UNION
SELECT rec_id FROM tbl_name WHERE name = 'John Doe'
UNION
SELECT rec_id FROM tbl_name WHERE business = 'John Doe'
UNION
SELECT rec_id FROM tbl_name WHERE billing = 'John Doe'
UNION
-- etc...

像这样重写它的想法是,现在每个子查询都能够使用索引(当然假设您已经添加了必要的索引)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化多个OR查询 的相关文章

随机推荐

  • 在非托管 Chromebox 上开发 Chrome 自助服务终端应用

    tl dr 我想使用仅适用于 Chrome Kiosk 应用程序的 API 如何在本地将我的应用程序作为自助服务终端应用程序运行 以便可以访问这些 API Hey All 我正在尝试开发一个使用chrome 音频 API https dev
  • 将 UITable 中的 UITableViewCell 中的子视图中的对象的 CGRect 转换为相对于 self.view 的 CGRect

    我想转换一个CGRect子视图中对象的 eRect UITableViewCell in UITableView to CGRect关于self view 问题是 aRect 是相对于表格单元格中的子视图而言的 但我想让它相对于self v
  • string::at 和 string::operator[] 有什么区别?

    我被教导string at在学校 但通过探索字符串库我看到string operator 我之前从未展示过 我现在正在使用operator 并且没有使用过at因为 但是有什么区别呢 这是一些示例代码 std string foo my re
  • SurfaceHolder 回调与 Activity 生命周期有何关系?

    我一直在尝试实现一个需要在表面上进行相机预览的应用程序 据我所知 活动和表面生命周期都包含以下状态 当我第一次启动我的活动时 onResume gt onSurfaceCreated gt onSurfaceChanged 当我离开我的活动
  • Xcode 12:FIRAnalyticsConnector 上构建错误

    升级到 Xcode 12 后 我的项目不再为模拟器构建 我得到的错误是 ld in Pods FirebaseAnalytics Frameworks FIRAnalyticsConnector framework FIRAnalytics
  • Nginx 自动将 proxy_pass 重定向到根路径

    我有两个 nextjs 应用程序在端口 3000 和 3001 上运行 我的 Nginx 配置如下 events worker connections 1024 http server listen 8080 server name htt
  • 操作方法:使用 .NET 验证 FileStream 是否为有效的 PDF 文档 [重复]

    这个问题在这里已经有答案了 可能的重复 检测PDF文件是否正确 标题PDF https stackoverflow com questions 3108201 detect if pdf file is correct header pdf
  • 从同时具有私有 IP 和公有 IP 的虚拟机连接到私有 IP 上的 Google Cloud SQL 实例失败

    我正在尝试设置什么 具有私有 IP 的 Cloud SQL 实例 Postgresql 数据库 一台具有 1 个公有 IP 和 1 个私有 IP 且与 SQL 实例位于同一 VPC 网络的虚拟机 虚拟机 SQL 实例和 VPC 均位于同一区
  • ipod nano 开发有哪些选择?

    我的妻子最近买了一个 Nano 我想为它编写一个简单的程序 看来苹果只发布了适用于 iPhone iPod Touch 的 SDK 而没有针对 nano 的能力 创建针对 Nano 的应用程序并将其安装到她的应用程序上有哪些选项 您最好的选
  • 在 Linux 2.4 上以普通用户身份进行原始套接字访问

    在嵌入式系统 2 4 内核 中 我需要从进程对 eth0 接口进行原始套接字访问not以 root 身份运行 我尝试通过从命令行设置 CAP NET RAW 功能并以编程方式使用 cap set proc 来解决此问题 但均未成功 看来我没
  • toLowerCase(char) 方法?

    显然有一个方法接受一个 char 并返回一个 char http download oracle com javase 6 docs api java lang Character html toLowerCase char http do
  • AngularJS 使用 ng-upload 上传图像

    我正在尝试使用 ng upload 在 AngularJS 中上传文件 但遇到了问题 我的 html 看起来像这样 div class create article div
  • 绑定TextBox时如何调用方法

    我想在 EditItemTemplate 中 Bind 一个文本框 但我需要在显示文本框之前将其原始值传递给函数 我的目标是在显示值之前对其进行格式化 这是一个复杂的格式化规则 因此我无法使用任何内置格式化程序 使用 Eval 时很容易做到
  • Ansible 中的幂等性和随机变量

    有没有办法保证使用随机生成变量的剧本的幂等性 例如 我想设置 crontab 以在不同时间触发多个服务器上的电子邮件 因此我使用 ansible 的 set fact 模块创建随机整数 tasks set fact first run 30
  • 野牛转移而不是减少。减少/减少错误

    用我的语言我可以写 a 1 b 2 if true else if true Here is the problem else 我的语法不支持语句之间的换行符 else 只能与 if 一起使用 当我在规则中添加可选NL时 IfExpr IF
  • WPF 将文本从一个窗口传递到另一个窗口

    我有一个主窗口 它有一个按钮 当我按下主窗口按钮时 它将打开子窗口 在子窗口中 我有一个文本框 当我输入文本并单击子窗口中的添加按钮时 文本应显示在主窗口上 我该如何实现这一目标 提前致谢 您可以创建 MainWindow 类的参数化构造函
  • 调试 TestNG 配置失败

    我正在从 Ant 运行 TestNG 我正在使用我自己的测试监听器 我正在重构代码 有一段时间我得到了 testng Total tests run 7 Failures 0 Skips 7 testng Configuration Fai
  • 对重载函数的不明确调用

    我有两个功能 void DoSomething const tchar apsValue void DoSomething size t aiValue 现在我想将 0 作为 size t 传递 DoSomething 0 编译器抛出错误
  • Meteor:“=> 退出,代码:8”错误

    刚刚开始使用 Meteor 按照中提供的教程进行操作发现流星 https www discovermeteor com 实现第 3 章的代码后 我不断收到以下错误 W20150714 18 47 36 539 7 STDERR W20150
  • 优化多个OR查询

    我有一个数据库表 我需要验证用户是否输入了相同或部分相同的信息 这就是我的想法 数据库布局 rec id pk user id name phone address 1 address 2 zip company co phone co a