вторник, 11 марта 2008 г.

MySQL easter egg

Есть два запроса:
SELECT * FROM `entities_categories` WHERE category IN('16325') AND entity IN ('used') ORDER BY category;
и
SELECT * FROM `entities_categories` WHERE category IN (SELECT id FROM entity_core_category WHERE id IN('16325') ORDER BY path) AND `entity` IN ('used');

Первый выполняется за 1.47 секунды, второй за .... 0,81 секунды! Неожиданно, верно? Начинаем разбираться:
mysql> desc SELECT * FROM `entities_categories` WHERE category IN('16325') AND entity IN ('used') ORDER BY category;


id 1
select_type SIMPLE
table entities_categories
type ref
possible_keys PRIMARY,category
key category
key_len 70
rows 63300
Extra Using where; Using filesort


mysql> desc SELECT * FROM `entities_categories` WHERE category IN (SELECT id FROM entity_core_category WHERE id IN('16325') ORDER BY path) AND `entity` IN ('used');

id 1 2
select_type PRIMARY DEPENDENT SUBQUERY
table entities_categories entity_core_category
type ref const
possible_keys PRIMARY PRIMARY
key PRIMARY PRIMARY
key_len 66 4
ref const const
rows 287754 1
Extra Using where Using index


Я не хочу понять это. Я хочу знать: как с ЭТИМ работать?