1

出于某种原因,我需要在我的 sql 中使用日期范围作为“where”条件。
我需要在我的表中添加一个新字段 data_range,它应该是 varchar 或 integer,我想知道在 mysql 中使用 =integer 是否比 =varchar 快?它会很明显吗?

select * from table where date_range = '2013-10-01__2013-10-30' use varchar
select * from table where date_range = 2013100120131030 // use integer
4

2 回答 2

2

WHERE主要问题,“在一个子句中什么更快,int或者varchar?” 这不是你应该追求的。

首先,您的价值太大而不能成为一个int并且必须在一个bigint字段中;其次,您可能不想使用varchar任何一个,而是喜欢char(因为您知道字符串的长度将是恒定的)。现在,有了这些更改中的任何一个,除非您一次对数十万(或数百万)条记录执行数千个查询 - 您不会注意到性能影响(特别是如果您索引表正确。

现在,真正的重点。您有两个日期,并且要将它们合并到一个列中 - 您不应该这样做。在评论中,您提到您从 Google Analytics 收到了这样的价值;但是,您应该能够将该值拆分为两个单独的日期值并将它们存储到两个单独的列中(均为一种date类型)。

我不确定您收到的格式是什么,因为您的问题以两种不同的格式显示它们(一种以varchar分隔__,另一种为不带分隔符的整数)。当您使用 PHP 进行标记时,您可以通过以下方式将两种格式拆分为两个单独的变量:

带分隔符的字符串(也分隔 yyyy-mm-dd,使其非常容易):

// assuming a string with a __ delimiter
list($firstDate, $secondDate) = explode('__', $originalDate);

不带分隔符的字符串/整数,格式为 yyyymmdd:

// assuming a string that has no delimiters:
$firstDate = substr($originalDate, 0, 8);
$secondDate = substr($originalDate, 8);

不带分隔符的字符串/整数,强制采用 yyyy-mm-dd 格式:

// assuming an string that has no delimiters but adding them each in
$firstDate = sprintf("%s-%s-%s", substr($originalDate, 0, 4), substr($originalDate, 4, 2), substr($originalDate, 6, 2));
$secondDate = sprintf("%s-%s-%s", substr($originalDate, 8, 4), substr($originalDate, 12, 2), substr($originalDate, 14, 2));

以上三种方法可以codepad上查看。

如果您将两个日期放在两个单独的变量中,则可以将它们存储在数据库中的两个单独列中。如果您的数据库查询将始终使用“开始”和“结束”日期进行查询,则可以将两列索引到同一个索引中;否则,您可以分别索引它们。无论用例如何,由于您将使用它们,因此添加索引将是确保您追求的速度/优化的重要步骤 =]

于 2013-10-30T16:03:55.523 回答
-2

从逻辑上讲,整数比较使用更少的字节并且速度更快。

这是真的,但我从来没有注意到差异。除了需要您做出决定的时间外,这可能不会对您产生明显的影响。

于 2013-10-30T02:52:25.690 回答