强制 MySQL 在连接上使用两个索引

2024-04-13

我试图强制 MySQL 使用两个索引。我正在加入一个表,我想利用两个索引之间的交叉。具体术语是“Using intersect”,这里是 MySQL 文档的链接:

http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html

有什么办法可以强制执行此操作吗?我的查询正在使用它(并且它加快了速度),但现在由于某种原因它已经停止了。

这是我想要执行此操作的 JOIN。我希望查询使用的两个索引是 scs.CONSUMER_ID_1 和 scs_CONSUMER_ID_2

JOIN survey_customer_similarity AS scs
    ON cr.CONSUMER_ID=scs.CONSUMER_ID_2 
    AND cal.SENDER_CONSUMER_ID=scs.CONSUMER_ID_1 
    OR cr.CONSUMER_ID=scs.CONSUMER_ID_1 
    AND cal.SENDER_CONSUMER_ID=scs.CONSUMER_ID_2

请参阅 MySQL 文档FORCE INDEX http://dev.mysql.com/doc/refman/5.7/en/index-hints.html.

JOIN survey_customer_similarity AS scs 
FORCE INDEX (CONSUMER_ID_1,CONSUMER_ID_2)
ON
cr.CONSUMER_ID=scs.CONSUMER_ID_2 
AND cal.SENDER_CONSUMER_ID=scs.CONSUMER_ID_1 
OR cr.CONSUMER_ID=scs.CONSUMER_ID_1 
AND cal.SENDER_CONSUMER_ID=scs.CONSUMER_ID_2

正如 TheScrumMeister 在下面指出的那样,这取决于您的数据,两个索引是否实际上可以同时使用。


Here's an example where you need to force the table to appear twice to control the query execution and intersection.

使用它创建一个包含 >100K 记录的表,其中大约 1K 行与过滤器匹配i in (2,3)和 1K 行匹配j in (2,3):

drop table if exists t1;
create table t1 (id int auto_increment primary key, i int, j int);
create index ix_t1_on_i on t1(i);
create index ix_t1_on_j on t1(j);
insert into t1 (i,j) values (2,2),(2,3),(4,5),(6,6),(2,6),(2,7),(3,2);
insert into t1 (i,j) select i*2, j*2+i from t1;
insert into t1 (i,j) select i*2, j*2+i from t1;
insert into t1 (i,j) select i*2, j*2+i from t1;
insert into t1 (i,j) select i*2, j*2+i from t1;
insert into t1 (i,j) select i*2, j*2+i from t1;
insert into t1 (i,j) select i*2, j*2+i from t1;
insert into t1 (i,j) select i*2, j*2+i from t1;
insert into t1 (i,j) select i*2, j*2+i from t1;
insert into t1 (i,j) select i*2, j*2+i from t1;
insert into t1 (i,j) select i*2, j*2+i from t1;
insert into t1 (i,j) select i*2, j*2+i from t1;
insert into t1 (i,j) select i*2, j*2+i from t1;
insert into t1 (i,j) select i, j from t1;
insert into t1 (i,j) select i, j from t1;
insert into t1 (i,j) select 2, j from t1 where not j in (2,3) limit 1000;
insert into t1 (i,j) select i, 3 from t1 where not i in (2,3) limit 1000;

做时:

select t.* from t1 as t where t.i=2 and t.j=3 or t.i=3 and t.j=2

你得到了 8 个匹配项:

+-------+------+------+
| id    | i    | j    |
+-------+------+------+
|     7 |    3 |    2 |
| 28679 |    3 |    2 |
| 57351 |    3 |    2 |
| 86023 |    3 |    2 |
|     2 |    2 |    3 |
| 28674 |    2 |    3 |
| 57346 |    2 |    3 |
| 86018 |    2 |    3 |
+-------+------+------+

Use EXPLAIN在上面的查询中得到:

id | select_type | table | type  | possible_keys         | key        | key_len | ref  | rows | Extra
1  | SIMPLE      | t     | range | ix_t1_on_i,ix_t1_on_j | ix_t1_on_j | 5       | NULL | 1012 | Using where

即使我们添加FORCE INDEX对两个索引的查询EXPLAIN将返回完全相同的事情.

要使其收集两个索引,然后将它们相交,请使用以下命令:

select t.* from t1 as a force index(ix_t1_on_i)

join t1 as b force index(ix_t1_on_j) on a.id=b.id

where a.i=2 and b.j=3 or a.i=3 and b.j=2

使用该查询explain to get:

id | select_type | table | type  | possible_keys | key        | key_len | ref  | rows | Extra
1  | SIMPLE      | a     | range | ix_t1_on_i    | ix_t1_on_i | 5       | NULL | 1019 | Using where
1  | SIMPLE      | b     | range | ix_t1_on_j    | ix_t1_on_j | 5       | NULL | 1012 | Using where; Using index

这证明索引正在被使用。但这可能会更快,也可能不会更快,具体取决于许多其他因素。

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

强制 MySQL 在连接上使用两个索引 的相关文章

  • 计算 mysql 数据库行数的最佳方法

    在遇到 mysql 查询加载时间慢的问题后 我现在正在寻找计算行数的最佳方法 我曾经愚蠢地使用过mysql num rows 函数来做到这一点 现在意识到这是最糟糕的方法 我实际上正在制作一个分页来用 PHP 制作页面 我找到了几种计算行数
  • 将 MySQL 结果作为 PHP 数组

    mysql 表 config name config value allow autologin 1 allow md5 0 当前的 php 代码 sth mysql query SELECT rows array while r mysq
  • 分组和切换列和行

    我不知道这是否会被正式称为枢轴 但我想要的结果是这样的 Alex Charley Liza 213 345 1 23 111 5 42 52 2 323 5 23 1 324 5 我的输入数据采用这种形式 Apt Name
  • MySQL - 选择一行 - 然后相对于所选行的下一个和上一个

    我会尽力澄清这一点 我需要在不使用 id 的情况下选择特定行和该选定行的前一个相对行以及该选定行的下一个相对行 这可能吗 简而言之 上一篇和下一篇 我不能 也许我只是不知道如何 使用 id 的原因是因为它们不是按顺序排列的 正如您从这个相当
  • 以编程方式插入行(父行和子行)

    我正在使用 Spring 和 JDBCTemplate 该场景是 CUSTOMER 表和 ORDERS 表的父子关系 我想做一个插入 例如 1 个客户和 5 个订单 但我不确定如何以编程方式在 CUSTOMER 表中插入一行 如何获取 Or
  • 使用联接更新表?

    我正在尝试使用表 B 中的数据更新表 A 我以为我可以做这样的事情 update A set A DISCOUNT 3 from INVOICE ITEMS A join ITEM PRICE QUNTITY B on A ITEM PRI
  • 包含列和行总计的 SQL 数据透视表

    我正在尝试将行和列总计添加到该数据透视表中 create table test4 city nvarchar 10 race nvarchar 30 sex nvarchar 10 age int insert into test4 val
  • 在一个后台为MYSQL的网站上集成搜索

    我有一个位置搜索website http www jammulinks com对于一个城市 我们首先收集该城市所有可能类别的数据 如学校 学院 百货商店等 并将其信息存储在单独的表中 因为每个条目除了名称 地址和电话号码外都有不同的详细信息
  • Laravel 5.4 升级 - 违反完整性约束 - 列不能为空

    奇怪的是 所有这些都在 5 2 中工作 但我不知道可以改变什么来实现这一点 下面是错误和正在插入的数组 SQLSTATE 23000 Integrity constraint violation 1048 Column gender can
  • 如何将 MySQL 查询输出保存到 Excel 或 .txt 文件? [复制]

    这个问题在这里已经有答案了 如何将 MySQL 查询的输出保存到 MS Excel 工作表 即使只能将数据存储在 txt文件 就可以了 From 将 MySQL 查询结果保存到文本或 CSV 文件中 http www tech recipe
  • 无法在 .net core 2 中从 MySQL 构建“日期”类型列

    我已经开始了一个新的 net core 2 项目 我正在尝试将 MySQL 数据库导入实体框架 我使用此命令来搭建数据库 Scaffold DbContext server localhost port 3306 user id user
  • MySQL Python 关于重复键更新值

    我正在研究使用 python 将 JSON 数据上传到 MySQL 我需要在插入语句中包含 ON DUPLICATE KEY UPDATE VALUES 但在 Python 中遇到了问题 如果我运行以下代码 一切正常 import json
  • 猪的组连接等效吗?

    试图在 Pig 上完成这个任务 寻找 MySQL 的 group concat 等效项 例如 在我的表中 我有以下内容 3fields userid clickcount pagenumber 155 2 12 155 3 133 155
  • 如何用约束标记一大组“传递群”?

    在 NealB解决方案之后进行编辑 与以下解决方案相比 NealB的解决方案非常非常快任何另一个 https stackoverflow com q 18033115 answers and 提出了关于 添加约束以提高性能 的新问题 Nea
  • SQL - 需要查找重复记录但排除反向事务

    我有一张交易表 偶尔会有 重复条目 如果 当管理员发现这些重复条目时 他们将撤销交易 从而创建负值 但由于监管要求 原始重复条目仍然保留 我想创建一个 SQL 查询 并使用 Crystal Reports 来制作报告 以便管理员轻松查找重复
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • 获取mysql中逗号分隔行中不同值的计数

    一个表 Jobs 有 2 列 JobId 城市 当我们保存工作时 工作位置可能是多个城市 如下所示 JobId City 1 New York 2 New York Ohio Virginia 3 New York Virginia 我如何
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不
  • Oracle:按月分区表

    我的解决方案 德语几个月 PARTITION BY LIST to char GEBURTSDATUM Month PARTITION p1 VALUES JANUAR PARTITION p2 VALUES Februar PARTITI
  • 在同一查询中选择 Count of ip 和 Count of DISTINCT ip

    我有一个这样的表结构 TABLE NAME counter id datetime url ip 1 2013 04 12 13 27 09 url1 ip01 2 2013 04 13 10 55 43 url2 ip02 3 2013

随机推荐

  • 无法找到 XML 模式命名空间的 Spring NamespaceHandler [http://www.springframework.org/schema/batch]

    情况 我正在使用 Spring Batch 为我们的数据仓库构建累积快照 但我遇到了一个我无法弄清楚的配置障碍 我使用 STS SpringSource Tool Suite 2 8 1 创建了一个简单的 Spring Batch 项目春季
  • Keras 错误:调用 Predict_on_batch 时“优化循环失败:已取消:操作已取消”

    我有一些使用 keras 的旧工作代码 我最近把它掸掉并尝试使用它 但使用的是当前版本的 keras tensorflow 调用 Predict on batch 时收到警告 错误 W tensorflow core data root d
  • ValidateRequest = False 但实际上它仍然是 True 并且忽略了它?

    我想禁用请求验证特别是在ASP NET MVC 2 0 RTM 所以我添加了一些必要的查看页面指令部分 如下所示 but 请求验证不是残疾人 我还添加了请求验证属性控制器中的相关操作如下 System Web Mvc ValidateInp
  • ASP.NET MVC 中的 RouteLink 和 ActionLink 有什么区别?

    我认为标题已经概括了这一点 有什么区别RouteLink and ActionLink 在 ASP NET MVC 中 即你什么时候使用Html RouteLink 你什么时候使用Html ActionLink 在你看来 操作和路由不必具有
  • 如何诊断护照真伪?

    由于该函数没有返回值 我如何确定导致该函数失败的原因 我有以下代码 function test req IncomingMessage res ServerResponse next err any gt void passport aut
  • 在jquery中创建循环背景动画

    我想要的是 当页面加载时 背景颜色为红色 10 秒后 bgColor 变为绿色 并带有淡入淡出动画 再过 10 秒后 它会变成橙色 然后又变成红色 依此类推 有人可以帮忙吗 Use 设置间隔 http www w3schools com j
  • Firestore - 如何在数据库中自动减少整数值?

    Firestore 最近推出了一项新功能 可以自动递增和递减整数值 我可以使用增加整数值 例如 FieldValue increment 50 但如何减量呢 我尝试使用FieldValue decrement 50 但FieldValue中
  • 在 C++ 中旋转图像而不使用 OpenCV 函数

    描述 我正在尝试在不使用 C 中的 OpenCV 函数的情况下旋转图像 旋转中心不必是图像的中心 它可能是不同的点 偏离图像中心 到目前为止 我遵循各种来源进行图像插值 我知道source https stackoverflow com a
  • 检测节点的系统路径上是否存在可执行文件

    Question 有没有一种简单的方法可以使用节点判断系统可执行文件在系统路径上是否可用 例如 如果用户安装了 python usr bin python and usr bin is in PATH我如何在 Node 中检测到这一点 相反
  • 在 Filter 内执行并呈现 JSP

    我有一个包含页面顶部内容的 JSP 我们将其称为 header jsp 出于性能原因 我想在构建页面的其余部分之前呈现此 JSP 并将其刷新给用户 看here http developer yahoo com performance rul
  • 元素不可点击错误 Ruby / Watir

    在我的测试中 我尝试访问 etsy com 进行搜索 单击结果 然后将商品添加到我的购物车 我可以做所有事情 直到我尝试单击 添加到购物车 按钮 下面的代码实际上在 IRB 中工作 所以我知道我的定位器是可靠的 但是当我运行测试时 我得到一
  • 在 Elasticsearch 中过滤折叠结果

    我有一个弹性搜索索引 其中包含表示给定时间点实体的文档 当实体更改状态时 会创建带有时间戳的新文档 当我需要获取所有实体的当前状态时 我可以执行以下操作 GET https 127 0 0 1 9200 myindex search col
  • .NET RIA 服务与 MVC 风格存储库?

    我有一个包含多个项目的解决方案 包括两个共享位于外部程序集中 也在同一解决方案中 的存储库和模型的 asp net mvc 项目 本质上 Core 存储库 楷模 国内 Web 基本MVC站点 引用核心项目 国际网 基本MVC站点 引用核心项
  • 使用 NativeMessaging 进行边缘扩展

    我有一个具有本机消息传递支持的边缘扩展 它与系统中运行的 uwp 应用程序进行通信 是否必须将扩展打包到 uwp 应用程序的 appx 文件夹中 如果没有 那么我们如何将扩展上传到边缘扩展存储中 我遵循 secureInput 示例 htt
  • 快速向 SQL Server 插入 200 万行

    我必须从文本文件中插入大约 200 万行 通过插入 我必须创建一些主表 将如此大的数据集插入 SQL Server 的最佳且快速的方法是什么 我认为最好读取 DataSet 中文本文件的数据 试用SQL批量复制 从 C 应用程序批量插入 S
  • GSON反序列化:如何知道对象?

    我尝试使用 gson 库来反序列化发送给我的对象流 在我见过的所有示例中 当调用 fromJson 方法时 我们已经知道我们期望拥有什么类型的对象 就我而言 我收到不同对象的流 我想知道在反序列化对象之前了解对象类的最佳方法 A B B1
  • Android 自定义通知布局与 RemoteViews

    我正在尝试使用此为我的 Android 应用程序创建自定义通知post https stackoverflow com questions 18367631 change notification layout 我偶然发现了一个我在过去 2
  • 使用 LIMIT 时获取总行数? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 offset limit 查找 mySQL 查询中的结果总数 https stackoverflow com questions 5928611 find total number of res
  • JAX-RS自定义ExceptionMapper不拦截RuntimeException

    我想包裹底层RuntimeExceptions自定义 json 格式 使得 servlet 容器不会将堆栈跟踪转储到客户端 我关注这个问题 使用 XML 或 JSON 的 JAX RS Jersey 自定义异常 https stackove
  • 强制 MySQL 在连接上使用两个索引

    我试图强制 MySQL 使用两个索引 我正在加入一个表 我想利用两个索引之间的交叉 具体术语是 Using intersect 这里是 MySQL 文档的链接 http dev mysql com doc refman 5 0 en ind