0

如果我有一个声明:

select .. from .. where 条件;

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

编辑:

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

select * from t where c3 > c2;

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

4

2 回答 2

1

简单的答案是你不能。

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

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

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

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

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

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

您应该尽量避免诸如 LIKE 之类的条件,因为无论您如何编写它们,它们都是缓慢而乏味的。

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

于 2012-09-24T21:14:24.153 回答
1

如果没有对手头的问题进行更详细的描述,我认为不可能说的比您对数据库工作原理的理解还不够多。

为简单起见,想象一个二叉搜索树。现在使用您的谓词(您的 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”。

I think this is about as far into this topic as I can go in a simple answer like this. Let me however state that the above is an oversimplification - there's alot more to be said about this - to start off with, the actual index type being used is typically not even a binary search tree, but a B-tree (or, more likely, a B+-tree). Wikipedia has some decent articles about this, and the actual manual for MySQL should cover this quite well as well.

于 2012-09-24T21:21:04.947 回答