【问题标题】:MYSQL IN vs <> performanceMYSQL IN vs <> 性能
【发布时间】:2014-01-19 02:12:23
【问题描述】:

我有一个表,其中有一个状态字段,它的值可以是 1、2、3、4、5。我需要从表中选择状态为 != 1 的所有行。我有以下 2 个选项:

请注意,该表在状态字段上有 INDEX。

SELECT ... FROM my_tbl WHERE status <> 1;

SELECT ... FROM my_tbl WHERE status IN(2,3,4,5);

以上哪个是更好的选择? (my_tbl 预计会变得非常大)。

【问题讨论】:

  • 我想知道你是否设计了一个实验来回答这个棘手的谜题?
  • @Strawberry 我不明白这里有什么问题。我只想选择值为 2,3,4,5 的状态。
  • 如果您在 status 上没有索引,它们的性能将相同。
  • 我已经用状态索引更新了查询。希望查询不再是一个谜。

标签: mysql performance query-optimization


【解决方案1】:

您可以运行自己的测试来找出答案,因为它会因基础表而异。

除此之外,请不要担心“最快”,而无需先进行某种重要的测量。

与其担心最快,不如想想哪种方式最清晰。

尤其是在数据库中,考虑哪种方法可以保护您免受数据错误的影响。

如果你的程序有问题或给出错误的答案,那么它的速度并不重要。

【讨论】:

  • 是的,你是对的。我也考虑过,'1' 是安全且清晰的。但是,考虑到表格的大小,并且考虑到状态不会有任何其他值,我考虑进行性能评估。
  • 是的,进行绩效评估是一个绝妙的主意。与向一群随机的人询问有关未命名数据库上未定义表中的抽象示例的抽象示例相比,它会给您一个更明确的答案。
  • 我现在明白了查询的神秘之处。我添加了索引仅在状态字段上的注释。希望现在清楚了。
【解决方案2】:

有多少行的值为“1”?如果小于 ~20%,无论您如何制定 WHERE(IN、、BETWEEN),您都将获得表扫描。假设您有 INDEX(status)。

但是索引 ENUM、标志和其他基数较差的东西很少有用。

包含 50K 项的 IN 子句会导致内存问题(或至少过去曾经),但不会导致性能问题。它们被排序,并使用二进制搜索。

经验法则:表达式(IN、、函数等)的评估成本与性能几乎无关。主要成本是获取行,尤其是当它们需要从磁盘获取时。

索引可能有助于最小化获取的行数。

【讨论】:

【解决方案3】:

你可以使用BENCHMARK()自己测试一下。

http://sqlfiddle.com/#!2/d41d8/29606/2

第一个如果更快,这是有道理的,因为它只需要比较 1 个数字而不是 4 个数字。

【讨论】:

  • 这个链接太棒了!谢谢你给我看。是的, 1 在逻辑上也有意义。
  • 唯一意味着该死的测试是 youyour 机器上运行在 your 数据库使用的测试你的表填满了你的数据。
  • 您也可以使用@var BETWEEN 2 AND 5,这也取决于您的数据,也许未来的状态可能有其他值,在这种情况下,如果您不想包含它们,您可以使用 BETWEEN 如果你知道你想要所有大于 1 的状态,你也可以使用 > 1
  • 优化器是非常聪明的东西,它们会考虑索引中值的分布情况。
  • @TinTran 请参考此链接stackoverflow.com/questions/782915 进行一些性能评估。
猜你喜欢
  • 2016-03-16
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
相关资源
最近更新 更多