出于某种原因,我需要在我的sql中使用日期范围作为“where”条件 我需要在我的表中添加一个新的字段data_range,它应该是varchar或整数,我想知道是在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
答案 0 :(得分: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上查看上述三种方法 in-action 。
如果在两个单独的变量中有两个日期,则可以将它们存储在两个单独的列中的数据库中。如果您的数据库查询始终同时使用" start"和"结束" date,您可以将两列都索引到同一个索引中;否则,您可以单独索引它们。无论用例如何,因为您将使用它们,添加索引将是确保您在=]之后的速度/优化的重要步骤
答案 1 :(得分:-2)
逻辑上,整数比较使用更少的字节并且更快。
这是真的,但我从未注意到差异。除了您决定的时间外,这可能不会对您产生明显的影响。