【问题标题】:Telling MySQL the limit of a where condition being false告诉 MySQL where 条件为 false 的限制
【发布时间】:2023-03-19 06:50:01
【问题描述】:

如果我有一个声明:

select .. from .. where 条件;

而且我事先知道条件可以为假的最大次数。我如何告诉 MySQL 这个数字以提高性能?因此,在条件多次为假之后(在选择记录时),MYSQL 将假定其余记录的条件为真。

编辑:

我不知道我的问题中缺少什么。我来填空:

select * from t where c3 > c2;

这里我事先知道,在 50 条记录中,只有 5 条记录的条件“c3 > c2”为假。我可以并且应该告诉 MySQL 这个数字“5”来提高这个 select 语句的性能吗?这样在执行这个 select 语句时,在这个条件 (c3 > c2) 被错误 5 次之后,MySQL 将忽略这个条件,对其余的记录进行选择,然后选择所有的记录。

【问题讨论】:

  • 你能再具体一点吗?数据示例?
  • 您可以设置一个限制,但它可能对性能没有任何影响,而且这种在 RDBMS 中进行优化的整个方法存在根本缺陷。将您的查询添加到您的问题中,然后对其进行解释,有人会告诉您更好的方法。
  • @TonyHopkinson 我现在举了一个小例子。
  • @David 我现在举了一个小例子。
  • 请告诉我您不知道 WERE 5 和 50 的数字,因为您在执行此操作之前已经运行过计数查询。

标签: mysql


【解决方案1】:

简单的答案是你不能。

但在追求性能的过程中,您可以做的就是智能的数据库设计和良好的索引。

MySQL “预格式化”索引列,以便它可以非常快速地检查您对这些列的位置约束。

MySQL 网站 (http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html) 列出了您应该使用下面列出的前两个索引的几个原因,但您应该通读该页面的所有内容:

  • 快速找到匹配 WHERE 子句的行。

  • 从考虑中排除行。如果有选择 在多个索引之间,MySQL 通常使用找到 最少的行数

还有一个关于如何构建更智能的表的简单示例,您可以将其存储在两列中,而不是将名称“John Doe”存储在两列中,这样您就可以搜索姓氏为“Doe”的任何人而无需拆分或进行 LIKE 搜索。

你应该尽量避免像 LIKE 这样的条件,因为无论你怎么写它们都是缓慢而乏味的。

执行逻辑最快的列是整数列和浮点列。

【讨论】:

    【解决方案2】:

    如果没有对手头的问题进行更详细的描述,我认为只能说你对数据库如何工作的理解不够深入。

    为简单起见,想象一个二叉搜索树。现在使用您的谓词(您的 where 条件)并考虑一种构建二叉搜索树的方法,该树可以帮助您获取查询结果。作为一个简单的示例 - 考虑以下查询:

    SELECT * FROM myTable WHERE some_value = 10
    

    “some_value”上的简单二叉搜索树(即 - 二叉搜索树 - 对于树中的每个节点,“some_value”低于当前行的其他行将移至左侧,而具有更高- 或相等 - 值向右) - 在这种情况下可以提供帮助。利用这种二叉搜索树,现在可以简单地从树的根开始,根据当前节点的值沿着树的左或右路径向下 - 直到达到值“10” - 然后继续遵循正确的路径,直到找到更高的值。

    您可以想象这对于诸如

    之类的查询是如何工作的
    SELECT * FROM myTable WHERE some_value BETWEEN 10 AND 20
    

    同样,同样的简单二叉搜索树也可以轻松回答此查询。当然,人们可以轻松地深入研究更复杂的示例——但此时我猜你在想:这很好,但我该如何创建这个二叉搜索树呢?

    答案是索引 - 在这种情况下:

    CREATE INDEX idx_myTable__some_value ON myTable(some_value);
    

    这将告诉 MySQL 在表“myTable”上在列(按指定顺序)“some_value”上创建索引 - 索引将命名为“idx_myTable__some_value”。

    我认为这是我可以在这样一个简单的答案中深入探讨的主题。然而,让我声明以上内容过于简单化了 - 关于这一点还有很多要说的 - 首先,实际使用的索引类型通常甚至不是二叉搜索树,而是 B -tree(或者,更有可能是 B+-tree)。维基百科有一些关于这方面的不错的文章,MySQL 的实际手册也应该很好地涵盖这一点。

    【讨论】:

      猜你喜欢
      • 2011-02-15
      • 2010-11-07
      • 2014-04-16
      • 1970-01-01
      • 2015-04-29
      • 2011-05-15
      • 2019-11-22
      • 2016-10-14
      • 1970-01-01
      相关资源
      最近更新 更多