-2

我有一个有 510,085 行的表,这促使我寻求更高的性能。此表中的一个字段称为“照片状态”。

在“photoStatus”中,510,045 行包含单词“Active”,其余 40 行包含单词“Suspended”。

这两个查询中的哪一个可以更快地搜索“活动”照片,还是没关系?

WHERE photoStatus = 'Active'

Or

WHERE photoStatus <> 'Suspended'

显然,这是大规模查询的一部分,而不仅仅是一个 WHERE 条件。

数据库是 MySQL (MyISAM)

4

9 回答 9

2

为什么不将列转换为布尔值或数值,这比字符串比较快得多,那么您可以这样做:

  ....
  WHERE isActive;
于 2012-04-17T05:13:42.327 回答
0

如果你在该列上有一个索引WHERE photoStatus = 'Active'会更快,因为服务器可以只扫描索引匹配的范围Active

于 2012-04-17T05:13:01.350 回答
0

第二个会“稍微”快一些,因为它不需要比较整个字符串,只需第一个字符比较就足以包含根据数据库比较算法的结果

于 2012-04-17T05:13:17.033 回答
0

请务必在该字段上使用索引。并解释查询以查看查询的效率。

除此之外,您的查询只会过滤掉 40 个,因此查询的其余部分必须有效。

于 2012-04-17T05:15:59.590 回答
0

无论哪种方式,它都必须索引表和行。

就我个人而言,我总是会匹配。使用等于。

WHERE photoStatus = 'Active'

我总是使用 int 或 boolean,比匹配字符串更好。

于 2012-04-17T05:16:31.630 回答
0

在这种情况下,普通索引无济于事,因为实际返回的行的百分比很大。

所以数据库将不得不查看每一行。可能会有一些差异,具体取决于 equal 与 !equal 比较的速度,但这应该可以忽略不计。

所以我希望结果几乎是相同的速度。

于 2012-04-17T05:20:59.377 回答
0

您已经发布了一些详细信息以找到查询的快捷方式。

看来您需要全面扫描。在这种情况下,您可以尝试并行读取表格。不知道您使用什么 DBMS,但在 Oracle 中您可以使用提示select /*+parallel(yourtable 8)*/ from yourtable

你试图用这些数据做什么?哪些类型的查询很慢?你能举个例子吗?可以有很多技巧,你可以做很多错误。并非所有查询都应该快速运行。如果它们是用于 UI 的,则必须在 < 1s 的时间内响应。但如果是管理任务,可能需要 1 分钟 :)

于 2012-04-17T05:25:29.990 回答
0

WHERE photoStatus = 'Active' 如果您基于类似于您的示例的小型测试在该列上有索引,则更好。

我在 sql server 中添加了查询执行。短一属于平等比较。它报告了更好的性能。如果你没有索引,查询成本是相似的。

其中 statusname = '活动'

其中 statusname <> '暂停'

于 2012-04-17T05:39:36.653 回答
0

首先,0.5M 行不是一个大表——无论如何。

像“Active”/“Inactive”这样的列,作为索引本身可能没什么用,因为它没有足够的选择性来使索引扫描有益(事实上,如果它是 50% 的行)表,表扫描可能会更好)。

我怀疑实际上,“活动”与您的问题无关 - 毕竟,您并没有尝试将 .5M 行返回给客户端,是吗?

返回 0.5M 行的查询不会很快,因为仅返回行需要(相对)较长的时间。

无论如何,我的回答是:没关系,您需要检查查询的其他部分。发布带有完整查询、表结构和解释输出的问题。

于 2012-04-17T07:30:30.060 回答