У меня есть таблица, содержащая несколько тысяч строк, имеющая столбец Varchar, содержащий числа. Несмотря на обсуждение того, почему этот столбец не имеет числового типа, выбор строк из этой таблицы показал странное поведение.
Хотя в этом столбце есть индекс, использование числовых строк для поиска строки НАМНОГО быстрее (0,01 секунды), чем использование целых чисел (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 |
+----+-------------+---------+-------+---------------+-----------+---------+------+------+--------------------------+
varchar
, поиск по строке должен быть быстрее. - person hjpotter92   schedule 23.04.2012