【发布时间】:2025-11-30 19:55:01
【问题描述】:
我在 MYSql 数据库上有一个非常简单的名为 Device 的表。
+-----------------------------------+--------------+------+-----+----------------+
| Field | Type | Null | Key | Extra |
+-----------------------------------+--------------+------+-----+----------------+
| DTYPE | varchar(31) | NO | | |
| id | bigint(20) | NO | PRI | auto_increment |
| dateCreated | datetime | NO | | |
| dateModified | datetime | NO | | |
| phoneNumber | varchar(255) | YES | MUL | |
| version | bigint(20) | NO | | |
| oldPhoneNumber | varchar(255) | YES | | |
+-----------------------------------+--------------+------+-----+----------------+
此表有超过 10 万条记录。我正在运行一个非常简单的查询
select * from AttDevice where phoneNumber = 5107357058;
这个查询大约需要 4-6 秒,但是当我稍微改变这个查询时,如下所示。
select * from AttDevice where phoneNumber = '5107357058';
执行几乎不需要时间。 请注意,phoneNumber 列是 varchar。我不明白为什么前一种情况需要更长的时间而后来不需要。这两个查询之间的区别在于单引号。 如果是这样,MYSQL 是否会以不同的方式处理这些查询,那为什么?
编辑 1
我使用了EXPLAIN 并得到了以下输出,但不知道如何解释这两个结果。
mysql> EXPLAIN select * from AttDevice where phoneNumber = 5107357058;
+----+-------------+-----------+------+---------------------------------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------------------------------+------+---------+------+---------+-------------+
| 1 | SIMPLE | Device | ALL | phoneNumber,idx_Device_phoneNumber | NULL | NULL | NULL | 6482116 | Using where |
+----+-------------+-----------+------+---------------------------------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN select * from AttDevice where phoneNumber = '5107357058';
+----+-------------+-----------+------+---------------------------------------+-------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------------------------------+-------------+---------+-------+------+-------------+
| 1 | SIMPLE | Device | ref | phoneNumber,idx_Device_phoneNumber | phoneNumber | 258 | const | 2 | Using where |
+----+-------------+-----------+------+---------------------------------------+-------------+---------+-------+------+-------------+
1 row in set (0.00 sec)
有人可以解释一下 EXPLAIN 查询输出中的键、key_len 和行吗?
【问题讨论】:
-
您是否尝试过
EXPLAIN查询?那应该回答你的问题。 -
是否有可能第二次执行速度更快,因为它在内存中缓存了部分结果?
-
问:你试过“解释”吗?它说了什么w.r.t。到可能的键、键、键长度等?请张贴两个“解释”。问:为什么是“sql-server”标签?
-
在我的拙见中,当与
phoneNumber比较的值是另一种数据类型(在您的示例中为无符号整数)时,该值首先转换为VARCHAR,这可能是原因这需要额外的时间。 -
如果这是mysql,为什么要标记为sql-server?