gerasim
Новичок
Индекс по binary - непонятное поведение
Столкнулся с непонятным для меня поведением индексов, когда они то используются, то нет.
Таблица (может показаться надуманной, это сокращенный вариант):
В ней 9 строк данных.
Запрос:
тут нормально. Уберем джойн
уже другой тип связывания, хуже. И почему?
Вернемся к прежнему запросу, но добавим в WHERE еще один цыфирь:
И уже key не используется совсем.
Использование в WHERE вместо '0002' и тп. выражений типа 0x30303032, CONVERT('0002',BINARY) - ничего не дает
USE INDEX тоже ничего не меняет.
Если же делать выборку не по id64, а по id - такой проблемы нет.
Если у таблицы удалить столбец id_parent - проблема исчезает.
Проверял на MySQL версий 5.0.x (других под рукой у меня нет)
Хотелось бы понять причину такого поведения индекса. И как можно заставить нормально работать индекс по binary.
Столкнулся с непонятным для меня поведением индексов, когда они то используются, то нет.
Таблица (может показаться надуманной, это сокращенный вариант):
PHP:
CREATE TABLE `tututu` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`id64` binary(4) NOT NULL,
`id_parent` mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
UNIQUE KEY `id64` (`id64`),
KEY `id_parent` (`id_parent`)
) ENGINE=InnoDB ;
Запрос:
PHP:
EXPLAIN SELECT t1.id, t1.id64, t2.id AS parent
FROM tututu AS t1
LEFT JOIN tututu AS t2 ON t1.id_parent = t2.id
WHERE t1.id64 IN ('0002','0003')
+----+-------------+-------+--------+---------------+---------+---------+-------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+-------------------+------+-------------+
| 1 | SIMPLE | t1 | range | id64 | id64 | 4 | NULL | 2 | Using where |
| 1 | SIMPLE | t2 | eq_ref | PRIMARY | PRIMARY | 3 | test.t1.id_parent | 1 | Using index |
+----+-------------+-------+--------+---------------+---------+---------+-------------------+------+-------------+
PHP:
EXPLAIN SELECT t1.id, t1.id64
FROM tututu AS t1
WHERE t1.id64 IN ('0002','0003')
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
| 1 | SIMPLE | t1 | index | id64 | id64 | 4 | NULL | 9 | Using where; Using index |
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
Вернемся к прежнему запросу, но добавим в WHERE еще один цыфирь:
PHP:
EXPLAIN SELECT t1.id, t1.id64, t2.id AS parent
FROM tututu AS t1
LEFT JOIN tututu AS t2 ON t1.id_parent = t2.id
WHERE t1.id64 IN ('0002','0003','0004')
+----+-------------+-------+--------+---------------+---------+---------+-------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+-------------------+------+-------------+
| 1 | SIMPLE | t1 | ALL | id64 | NULL | NULL | NULL | 9 | Using where |
| 1 | SIMPLE | t2 | eq_ref | PRIMARY | PRIMARY | 3 | test.t1.id_parent | 1 | Using index |
+----+-------------+-------+--------+---------------+---------+---------+-------------------+------+-------------+
Использование в WHERE вместо '0002' и тп. выражений типа 0x30303032, CONVERT('0002',BINARY) - ничего не дает
USE INDEX тоже ничего не меняет.
Если же делать выборку не по id64, а по id - такой проблемы нет.
Если у таблицы удалить столбец id_parent - проблема исчезает.
Проверял на MySQL версий 5.0.x (других под рукой у меня нет)
Хотелось бы понять причину такого поведения индекса. И как можно заставить нормально работать индекс по binary.