在mysql中使用= integer是否比= varchar更快?

时间:2013-10-30 02:50:09

标签: php mysql

出于某种原因,我需要在我的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

2 个答案:

答案 0 :(得分:2)

主要问题," WHERE条款,intvarchar中的速度更快?"不是你在这之后应该做的。

首先,您的值太大而不能成为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)

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

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