我有一个包含数千行的表,其中有一个包含数字的 Varchar 列。尽管当时讨论了为什么该列不是数字类型,但从该表中选择行显示出一种奇怪的行为。
尽管该列上有索引,但使用数字字符串查找行(0.01 秒)比使用 Ints(0.54 秒)快得多。这是什么原因?它似乎无法转换和使用索引的值......
我忽略了什么吗?看起来它没有将 Int 用于索引?我是否必须提供有关索引使用的提示,或者是否有数据库切换来完成此操作?或者如果我误解了解释输出,那么为什么它会慢得多?
表格布局以显示示例:
CREATE TABLE `example` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`stuff` varchar(45) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_stuff` (`stuff`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这里它使用字符串作为索引:
explain select * from example where stuff='200';
----+-------------+---------+------+---------------+-----------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+-----------+---------+-------+------+--------------------------+
| 1 | SIMPLE | example | ref | idx_stuff | idx_stuff | 137 | const | 1 | Using where; Using index |
+----+-------------+---------+------+---------------+-----------+---------+-------+------+--------------------------+
这里看起来它没有将 Int 转换为用于查找索引的字符串:
explain select * from example where stuff=200;
+----+-------------+---------+-------+---------------+-----------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+-----------+---------+------+------+--------------------------+
| 1 | SIMPLE | example | index | idx_stuff | idx_stuff | 137 | NULL | 2 | Using where; Using index |
+----+-------------+---------+-------+---------------+-----------+---------+------+------+--------------------------+