【问题标题】:MySQL where or composite index : will it be faster when performing two separate search?MySQL where 或复合索引:执行两个单独的搜索时会更快吗?
【发布时间】:2022-01-08 22:24:50
【问题描述】:

我有下表:

CREATE TABLE `FooBar` (
  `id` int,
  `foo` int,
  `bar1` int,
  `bar2` int,
  PRIMARY KEY (`id`),
  KEY `foobar1` (`foo`, `bar1`),
  KEY `foobar2` (`foo`, `bar2`)
) ENGINE=InnoDB;

现在我有以下选择查询:

select * from FooBar where foo=1 and (bar1=2 or bar2=2);

另外两个连续的选择

select * from FooBar where foo=1 and bar1=2;
select * from FooBar where foo=1 and bar2=2;

与两次连续选择的总时间相比,带有“或”的单次选择的时间会明显更快、更慢或大致相同吗?

【问题讨论】:

  • 我可以建议你测试一下看看
  • 我目前没有设置测试环境来测试大量数据以发现差异,并且 MySQL 的行为对于小数据集非常随机。
  • 是的,测试这是要走的路。请记住,执行两个查询可能会导致大量重复项,然后您可能必须删除这些重复项。这在很大程度上取决于数据,因此最好使用一些真实数据而不是 'foo' 和 'bar'。
  • 问题是我没有足够的数据来获得合适的测试环境。在一个大约有 20 行的小数据集中,我得到的“解释”显示没有任何键用于“或”的情况,我很确定当有足够的数据时不会出现这种情况。
  • “解释”只能告诉你这么多,最后是执行时间和资源使用,你可以在实践中实现,这才是相关的。看到这两个选项就好了,以后有真实数据的时候可以试试。基本上我们无法回答这样的假设性问题。答案可能取决于很多很多因素。

标签: mysql select indexing query-optimization


【解决方案1】:

都没有。

  • OR 会降低性能 - 通常会导致忽略索引并扫描整个表。
  • 两个单独的查询——处理语句有很多开销;将两个语句结合起来通常会更好(除非这会导致其他效率低下)。

OR 通常的加速是UNION

( select * from FooBar where foo=1 and bar1=2 )
UNION ALL
( select * from FooBar where foo=1 and bar2=2 )
;

UNION ALLUNION DISTINCT 快,但ALL 可能导致重复行。相应地选择。

(如果有ORDER BY或分页,讨论会变长。)

如果bar1bar2 是跨列分布的“数组”示例,则这将成为以这种方式设计架构的论据。相反,这可能是一个更好的表格,它有一个“bar”列,并且每个foo 有(可能)多行。

一个简单的例子是您要在其中包含电话号码的人员表格。最好有一个带有 (person_id, phone_num) 的表格——数字可以是手机、固定电话、传真、工作、家庭等。它是开放式的,零个或多个等。

时间...确实,只有几行数据很难随着数据的增长而预测性能。这是一个技巧;它计算所涉及的行数,因此可以很容易地发现OR 触及表中的每一行:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#handler_counts -- 20 行应该没问题。如果 Handler 计数为 19 或 20,那么它会进行表扫描。大约 40 表示 2 次扫描。我预测

  • 20 用于您的 OR 查询;
  • 2 用于您的两个单独的 Select(但这并未考虑每个查询的开销)
  • 2 我的UNION ALL
  • 4 或 6 用于我的 UNION DISTINCT,外加 2 次写入(用于必要的临时表)。

20 显然不能很好地扩展到数百万行;其余的都会。

EXPLAIN 有很多计数问题。不过,在这种情况下,它可能几乎和我的 Handler 技术一样好。

没有工具可以告诉你“你应该做什么”。 (Stackoverflow 很接近,但它非常耗费人力。)

【讨论】:

    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2013-12-15
    • 2011-05-10
    • 2013-07-27
    相关资源
    最近更新 更多