在Mysql查询中引用整数的缺点?

时间:2011-02-07 06:11:07

标签: mysql performance

我很好奇在MYSQL查询中引用整数的缺点

例如

SELECT col1,col2,col3 FROM table WHERE col1='3';

VS

SELECT col1,col2,col3 FROM table WHERE col1= 3; 

如果有性能成本,它的大小是什么以及为什么会出现?除了表演还有其他任何不利之处吗?

由于 安德鲁

编辑:此问题的原因
因为我很好奇,因为我想了解其中的差异 2.我正在尝试一种在我的PHP代码中将复合键从我的数据库传递为psudo-Id-keys(PIK)的方法。这些PIK用于定位记录。 例如,给定主键(AreaCode,Category,RecordDtm)

我在网址中的PIK看起来像这样:

index.php?action=hello&Id=20001,trvl,2010:10:10 17:10:45

我会选择这样的记录:

$Id = $_POST['Id'];//equals 20001,trvl,2010:10:10 17:10:45
$sql = "SELECT AreaCode,Category,RecordDtm,OtherColumns.... FROM table WHERE (AreaCode,Category,RecordDtm) = ({$Id});
$mysqli->query($sql):
......and so on.

此时查询将无法工作,因为日期时间(必须引用)并且它对sql注入是开放的,因为我没有转义这些值。鉴于我不会总是知道我的PIK是如何构造的,我会写一个函数将Id PIK分成逗号,用real_escape_string清理每个部分并将它与引用的值一起放回去。例如:     $ Id =“'20001','trvl','2010:10:10 17:10:45'” 当然,在这个分解和清理Id的功能中,我可以检查值是否为数字。如果是数字,请不要引用它。如果它只是一个字符串,那么引用它。

5 个答案:

答案 0 :(得分:6)

性能成本是每当mysql需要进行类型转换时,无论你将它提供给列的数据类型。所以使用您的查询

  

SELECT col1,col2,col3 FROM table WHERE col1 ='3';

如果col1不是字符串类型,MySQL需要将'3'转换为该类型。这种类型的查询并不是什么大问题,因为转换的性能开销可以忽略不计。

然而,当你尝试做同样的事情,比如加入2个表,每个表有几百万行。如果ON子句中的列不是相同的数据类型,则MySQL必须每次转换数百万行运行查询, 是性能开销的来源。

答案 1 :(得分:2)

字符串与数字的排序顺序也不同。

比较

SELECT 312 < 41

(产生0,因为312 数字在41之后出现)

为:

SELECT '312' < '41'

(收益1,因为'312'按字典顺序出现在'41'之前)

根据使用引号构建查询的方式可能会给出错误的结果,或者根本不会。

数字应该这样使用,所以除非你有特殊的理由,否则不要使用引号。

答案 2 :(得分:1)

据我所知,我认为在你提到的情况下没有性能/尺寸成本。即使有,但它是非常微不足道的,不会影响你的申请。

答案 3 :(得分:0)

它给出了关于列的数据类型的错误印象。作为局外人,我认为有问题的专栏是CHAR / VARCHAR&amp;相应地选择操作。

否则,MySQL与大多数其他数据库一样,会隐式地将值转换为列数据类型。我知道这没有性能问题但是提供需要显式转换的值(使用CAST or CONVERT)的风险会触发错误。

答案 4 :(得分:-1)

Have a look at this.他们在不同的字段类型之间进行了一些性能评估。