MySQL 语法和“OR”性能

2024-04-12

这个 MySQL 查询工作得很好

SELECT o.id 
FROM descriptions_programs d, titles_programs t, programs o
WHERE (d.object_id=o.id 
        AND MATCH (d.text) AGAINST ('+china' IN BOOLEAN MODE) 
        AND d.current=1)
AND   (t.object_id=o.id 
        AND MATCH (t.text) AGAINST ('+china' IN BOOLEAN MODE) 
        AND t.current=1)

但如果我用 OR 替换 AND,则查询会运行很长时间。 (我必须杀掉它。):

SELECT o.id 
FROM descriptions_programs d, titles_programs t, programs o
WHERE (d.object_id=o.id 
        AND MATCH (d.text) AGAINST ('+china' IN BOOLEAN MODE) 
        AND d.current=1)
OR    (t.object_id=o.id 
        AND MATCH (t.text) AGAINST ('+china' IN BOOLEAN MODE) 
        AND t.current=1)

为什么是这样?不要沉迷于 +china 的简单性。我只是为了调试而简化了它。另外,如果我只运行 MATCH AGAINST 测试之一,它工作得很好,所以两者本身都没有问题。我感觉到我无意中通过使用 OR 造成了巨大的连接,但我就是不明白。我之前对两个子选择的 UNION 使用了 n IN 测试,该测试有效,但这也应该有效。正确的?

Update:根据鲍比斯的要求。它不是超级慢,但大约 500 毫秒,它几乎不如使用 UNION 快在这里讨论 https://stackoverflow.com/questions/668371/mysql-fulltext-search-across-1-table.

mysql> explain SELECT o.id
    -> FROM programs o
    -> JOIN titles_programs t ON t.object_id=o.id
    -> JOIN descriptions_programs d ON d.object_id=o.id
    -> WHERE MATCH (d.text) AGAINST ('+china' IN BOOLEAN MODE) AND d.current=1
    -> OR MATCH (t.text) AGAINST ('+china' IN BOOLEAN MODE) AND t.current=1
    -> ;
+----+-------------+-------+-------+

----------------+----------------+---------+----------------------+--------+-------------+
| id | select_type | table | type  | possible_keys  | key            | key_len | ref                  | rows   | Extra       |
+----+-------------+-------+-------+----------------+----------------+---------+----------------------+--------+-------------+
|  1 | SIMPLE      | o     | index | PRIMARY        | PRIMARY        | 4       | NULL                 | 148666 | Using index | 
|  1 | SIMPLE      | d     | ref   | object_current | object_current | 4       | haystack.o.id        |      1 |             | 
|  1 | SIMPLE      | t     | ref   | object_current | object_current | 4       | haystack.d.object_id |      1 | Using where | 
+----+-------------+-------+-------+----------------+----------------+---------+----------------------+--------+-------------+

杰森的回答很正确。此外,我会尝试使用更现代的 ANSI 连接语法来减轻 WHERE 子句的负担,从而缓解那里的混乱:

SELECT o.id
FROM programs o
JOIN titles_programs t ON t.object_id=o.id
JOIN descriptions_programs d ON d.object_id=o.id
WHERE MATCH (d.text) AGAINST ('+china' IN BOOLEAN MODE) AND d.current=1
OR MATCH (t.text) AGAINST ('+china' IN BOOLEAN MODE) AND t.current=1

这将阻止意外的交叉连接导致组合爆炸;我希望它能够在合理的时间内运行,除非数据库真的很大。

如果没有,您可以发布上述 EXPLAIN SELECT 的结果吗?据推测,一个或两个全文索引都没有被使用。我当然可以想象查询优化器无法使用第二个全文索引,通过尝试“填充”与第一个全文查询不匹配的行而不是直接进入索引之类的操作。

通常,当您想要对两列组合进行全文索引时,您可以在两列上创建一个索引。无论如何,这会快得多。然而,这意味着您必须将标题和描述放在同一个表中。这可能不是那么困难:因为全文仅适用于 MyISAM 表(并且您通常不希望 MyISAM 表中的规范数据),您可以将数据的最终副本保留在正确规范化的 InnoDB 表中,并使用附加的 MyISAM 表只包含被剥离和阻止的搜索诱饵。

如果这些都没有什么好处......好吧,我想我会回到你提到的 UNIONing,再加上应用程序级过滤器来删除重复的 ID。

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

MySQL 语法和“OR”性能 的相关文章

  • 从表中选择行,其中另一个表中具有相同 id 的行在另一列中具有特定值

    在 MySQL 中 如果我们有两个表 comments key value 1 foo 2 bar 3 foobar 4 barfoo and meta comment key value 1 1 2 1 3 2 4 1 我想得到来自以下人
  • 奇怪的 MySQL Python mod_wsgi 无法连接到 'localhost' (49) 上的 MySQL 服务器问题

    StackOverflow上也有类似的问题 但我还没有发现完全相同的情况 这是在使用 MySQL 的 OS X Leopard 机器上 一些起始信息 MySQL Server version 5 1 30 Apache 2 2 13 Uni
  • 选择获取与 MySQL Group 中 max 对应的整行

    当我使用Max使用后查找特定 MySQL 组中字段的最大值GROUP BY 是否可以获取包含最大值的整行 我在处理一些论坛代码时偶然发现了这个线程 我想获取每个线程的最新帖子并将其显示在特定板的线程列表中 Quassnoi上面的回答对我非常
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 复杂的sql树行

    表结构 id message reply id 1 help me 0 434 love to 1 852 didn t work 434 0110 try this 852 2200 this wont 0 5465 done 0110
  • mysql 详细查询字符串,如通配符

    不知道如何标题我的问题 哈哈 下面是我需要的 我的数据库中的值如下所示 test example 1 test example 2 test example TD 1 这些值的长度可以不同 test example 只是一个示例 某些值将具
  • PHP 和 MySQL 的重音字符错误

    我的问题是 直接通过 PHP 编写的内容是正确重音的 但是当重音单词来自 MySQL 时 字母会像这样 我尝试使用html charset as ISO 8859 1它修复了 MySQL 字母 但破坏了其他字母 解决这一切的一种方法是设置我
  • 如何检查一个值是否已经存在以避免重复?

    我有一个 URL 表 但我不想要任何重复的 URL 如何使用 PHP MySQL 检查给定 URL 是否已在表中 如果您不想重复 可以执行以下操作 添加唯一性约束 use REPLACE http dev mysql com doc ref
  • 连接 3 三张表

    我有这个图表应该可以解释我的情况 我需要一些关于连接 3 个表的帮助 我不知道如何做这种事情 因此 我可以通过执行以下操作来经历一段检索记录的 while 循环 img src alt Album AlbumID 使用内部联接 http w
  • PHP:如何检查总数。 URL 中的参数?

    我正在使用 REQUEST 检索参数 有没有办法找到总数 URL 中的参数 而不是检索每个参数然后进行计数 这将为您提供总数 分隔的 URL 查询参数 count explode SERVER QUERY STRING 如果您只想要唯一的参
  • 您可以使用 MySQL 查询来完整创建数据库的副本吗

    我有一个包含 5 个表的 MySQL 数据库的实时版本和一个测试版本 我不断使用 phpMyAdmin 将实时版本中的每个表复制到测试版本 有谁有mysql查询语句来制作数据库的完整副本吗 查询字符串需要考虑结构 数据 自动增量值以及与需要
  • Mac OSX 10.6 上的 Python mysqldb 不工作

    我正在使用 Python 2 7 并尝试让 Django 项目在 MySQL 后端运行 我已经下载了 mysqldb 并按照此处的指南进行操作 http cd34 com blog programming python mysql pyth
  • mod_rewrite, .htaccess 连接mysql数据库

    我希望 htaccess 文件中的 mod rewrite 链接到 mysql 数据库以向我提供映射信息 具体来说 我使用单个代码库来托管多个站点 因此 如果用户请求图像 例如 http www example com images car
  • 从 CSV 到 MySQL 的换行问题

    我正在将 csv 文件导入 MySQL 除了文件中的换行符之外 一切正常 我的 csv 行之一如下所示 42 E A R Classic Earplugs ear images ear classic jpg 5 Proven size s
  • 用教义 2 DBAL 连接子查询

    我正在重构 Zend 框架2应用程序使用学说 2 5 DBAL 而不是 Zend DB ZF1 我有以下 Zend Db 查询 subSelect db gt select gt from user survey status entrie
  • 连接两个表而不返回不需要的行

    我的表结构如下所示 tbl users tbl issues userid real name issueid assignedid creatorid 1 test 1 1 1 1 2 test 2 2 1
  • 在内连接中重用 mysql 子查询

    我正在尝试优化查询 试图避免重复用 指示的查询 复杂查询 使用两次 结果相同 原始查询 SELECT news FROM news INNER JOIN SELECT myposter FROM SELECT COMPLEX QUERY U
  • 条件对列表的 In 子句

    有一个表 我需要通过在配对值列表中应用和条件来获取分页记录 下面是解释 假设我有一堂课Billoflading其中有各个领域 表中两个重要字段是 tenant billtype 我有一个包含值的对列表 tenant1 billtype1 t
  • 当我尝试计算 mysqli 结果时,为什么会收到警告?

    下面的代码会导致此警告 警告 count 参数必须是数组或实现 Countable 的对象 为什么要这样做 如何防止出现警告 if isset GET edit sonum GET edit update true result mysql
  • 在 Python 中,如果我有 unix 时间戳,如何将其插入 MySQL 日期时间字段?

    我正在使用 Python MySQLDB 我想将其插入 Mysql 中的 DATETIME 字段 我该如何使用cursor execute 来做到这一点 要将 UNIX 时间戳转换为 Python 日期时间对象 请使用datetime fr

随机推荐

  • Excel VBA 检查插件是否已安装但未打开

    我有以下代码来检查所需的插件是否已安装 可用 然后再从当前上下文调用该插件中的脚本 Function IsAddinEnabled addinName as string As Boolean IsAddinEnabled True Dim
  • 资产目录与文件夹参考:何时使用其中之一?

    我可以将文件放入Assets xcassets或者我可以将文件放入文件夹引用 蓝色文件夹 中 我什么时候会选择其中之一而不是另一个 您可能应该使用资产目录 因为这就是 Apple 希望您今后使用的内容 工具将反映这一点 并且它们带来了许多优
  • 将 docker 根文件夹移动到新驱动器/分区

    我正在尝试将 var lib docker 文件夹从一个磁盘移动到另一个磁盘 因为它占用了太多空间 我不断遇到一些与权限相关的错误 根据这些问题 如何将 Docker 容器的映像移动到永久磁盘 https stackoverflow com
  • Spring-boot 启动 tomcat 上下文时出错。创建名称为“servletEndpointRegistrar”的 bean 时出错

    我是 spring boot 的新手 因此 在从 Spring Initializr 引导项目后 我尝试在 intellij 上运行它 但我在启动时遇到错误 以下是versions 爪哇 8春季启动 2 0 6我尝试过更改 spring b
  • 如何在字符串中用反斜杠美元替换美元字符

    我有一个像这样的字符串 String str aLnx5 bK C4EFg 我想换掉所有的美元 带有反斜杠美元的字符 为了得到 String expectedString aLnx5 bK C4EFg String str aLnx5 bK
  • 在ggplot2中绘制饼图

    我想绘制一个合适的饼图 然而 该网站之前的大部分问题都来自stat identity 如何绘制像图 2 这样的普通饼图 其角度与cut 我正在使用diamonds来自 ggplot2 的数据框 ggplot data diamonds ma
  • Go 中的 URL 生成器/查询生成器

    我感兴趣的是通过浏览器或 CLI 动态获取用户的参数作为输入 将这些参数传递给 REST API 调用 从而使用 Go 动态构建 URL 最终为我获取一些 JSON 数据 我想了解 Go 中的一些技术可以帮助我做到这一点 我认为一种理想的方
  • Ajax 调用提交处理程序 Jquery 验证

    我有一个具有多个选择下拉列表的表单name select 并且此表单是从 Jquery Validation 进行验证的 并且在成功验证后提交处理程序调用 Ajax 我想发送所有表单键和值也包括在数组表单中 这是我的代码 function
  • 如何删除核心数据持久存储

    我需要删除我的持久存储 逐个对象执行此操作并不实际 因为我有超过 100 000 个对象 我试过这个 IBAction resetDatabase id sender NSPersistentStore store persistentSt
  • 如何在C程序执行过程中显示自定义提示符?

    我正在尝试在 Linux 中使用 C 程序模拟终端 并且需要我的程序在程序执行时显示自定义提示 有没有办法使用我的 C 程序显示它 我总是可以尝试手动打印 My prompt 每一行 但我正在寻找更好的方法 另外 除了基本库之外 我无法使用
  • 那么为什么 i = ++i + 1 在 C++11 中定义良好呢?

    我见过other https stackoverflow com q 1860461 150634相似的问题 https stackoverflow com q 4336860 150634并阅读defect http www open s
  • JSON.parse 返回 [Object Object] 而不是值

    我的 API 返回 JSON 值 例如 UserName xxx Rolename yyy I need Username and RoleNamevalue seperatly 我尝试了 JSON parse 但它返回 Object Ob
  • 如何编辑表格数据 (ASP MVC)

    我需要能够在浏览器中编辑数据表 我在 MVCContrib 中看到有一个 HTML 帮助器来渲染表格 有用 但是如果我希望用户能够编辑该表怎么办 据我所知 这并没有帮助 解决这个问题的最佳方法是什么 传统的 FORM 里面有一个 TABLE
  • Azure IoT Hub设备消息结构和路由查询

    我使用了来自的 python 示例https learn microsoft com de de azure iot hub quickstart send telemetry python https learn microsoft co
  • 使用“VisualStudio.DTE.10.0”创建解决方案并添加项目

    我正在尝试创建 VS2010 解决方案并从独立应用程序 而不是加载项 添加项目 我可以创建 VS2010 的实例 但我无法确定如何正确创建项目 我只能找到如何使用 EnvDTE80 对象创建项目的示例 这稍后会导致异常 因为该项目文件的格式
  • Android Room 通用 DAO

    美好的一天 Stack 我正在开发一个使用 Android Room 1 0 0 Alpha 5 的 Android 项目 我面临的主要问题是每次我需要从 Room 调用其中一个 DAO 时 我都需要执行类似的操作这 活动 java App
  • 基本树概念:定义祖先

    祖先的定义是什么 更具体地说 E 会是 H 的祖先吗 或者更简单地说 F C A 是 H 的祖先 也许甚至是G 我只是想澄清这个简单的概念 E 不是 H 的祖先 它是uncle因为它是一个siblingF 的parent of H F C
  • R twitterR 包,尽管有限制但仍能获得关注者

    我一直在玩RtwitteR包 但还没有弄清楚如何实现一个系统来收集超过每小时最大数量的数据 Twitter 用户的关注者数量 我知道计划应该是收集最大数量 等待 X 时间 然后重复直到收集完所有内容 但是我该如何使用twitteR包裹 th
  • 使用 FFmpeg 在特定时间将一个视频叠加在另一个视频上

    我正在尝试将一个视频与另一个视频叠加 我按照OP发布的原始命令进行操作here https stackoverflow com questions 35269387 ffmpeg overlay one video onto another
  • MySQL 语法和“OR”性能

    这个 MySQL 查询工作得很好 SELECT o id FROM descriptions programs d titles programs t programs o WHERE d object id o id AND MATCH