Php 在SELECT语句中,在数字周围加引号有什么影响?
我的印象是,数字是否被引用并不重要,但当我注意到这个简单的查询:Php 在SELECT语句中,在数字周围加引号有什么影响?,php,mysql,pdo,Php,Mysql,Pdo,我的印象是,数字是否被引用并不重要,但当我注意到这个简单的查询: SELECT id FROM table t WHERE t.col = 1234 执行0.21s(其中id是BIGINT主键,col是带索引的varchar),我知道有些不对劲 在摆弄了一段时间后,我尝试在数字周围加上引号: SELECT id FROM table t WHERE t.col = "1234" 执行时间降至0.046s 这是侥幸,还是引用数字有关系 编辑:另外,这如何影响绑定参数的PDO查询 编辑2:显然,
SELECT id FROM table t WHERE t.col = 1234
执行0.21s
(其中id
是BIGINT
主键,col是带索引的varchar
),我知道有些不对劲
在摆弄了一段时间后,我尝试在数字周围加上引号:
SELECT id FROM table t WHERE t.col = "1234"
执行时间降至0.046s
这是侥幸,还是引用数字有关系
编辑:另外,这如何影响绑定参数的PDO查询
编辑2:显然,查询计划不同:
不加引号:
+----+-------------+-------+------+------------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+------------------+------+---------+------+-------+-------------+
| 1 | SIMPLE | t | ALL | ind_col | NULL | NULL | NULL | 99431 | Using where |
+----+-------------+-------+------+------------------+------+---------+------+-------+-------------+
加上引号:
+----+-------------+-------+------+------------------+------------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+------------------+------------------+---------+-------+------+-------------+
| 1 | SIMPLE | t | ref | ind_col | ind_col | 767 | const | 1 | Using where |
+----+-------------+-------+------+------------------+------------------+---------+-------+------+-------------+
就性能而言,它们对mysql并不重要。关于何时使用它们,您可以看到这个问题 您很可能正在经历预热的缓冲池或查询缓存。此外,当我在amazon上本地查询远程sql机器时,我可以根据自己的网络性能和远程机器负载来改变响应时间。如果您想真正测试它,请尝试分析查询
对于这种特殊情况,mysql的一个缺点是,在查询数值时不能使用字符串类型索引。反之亦然。当您给查询一个数字时,在进行比较之前需要时间将其转换为字符串。看起来它已经被回答了,是非数字列吗?@DanielWilliams
t.col
是一个带索引的varchar(255)。这是预期的行为。不能使用字符串类型索引来帮助搜索数字类型。mysql将不得不进行完整的表扫描。然而,在相反的情况下,它将起作用。