Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день господа!
Имеется таблица вида:
CREATE TABLE `TABLE` ( `id` int(6) unsigned NOT NULL AUTO_INCREMENT, `c_id` int(10) unsigned DEFAULT NULL, `m_id` char(10) DEFAULT NULL, `places` int(3) unsigned NOT NULL DEFAULT '0', `weight` float(7,2) unsigned NOT NULL DEFAULT '0.00', `f_fin` tinyint(1) unsigned NOT NULL DEFAULT '0', `void` tinyint(1) NOT NULL DEFAULT '0', `c_void` int(3) DEFAULT NULL, `f_status` int(3) DEFAULT NULL, `from_id` int(3) DEFAULT NULL, `to_id` int(3) DEFAULT NULL, PRIMARY KEY (`id`), KEY `f_fin` (`f_fin`), KEY `void` (`void`), KEY `c_void` (`c_void`), KEY `from_id` (`from_id`), KEY `to_id` (`to_id`), KEY `c_id` (`c_id`), KEY `f_status` (`f_status`) KEY `m_id` (`m_id`) ) ENGINE=MyISAM AUTO_INCREMENT=380356 DEFAULT CHARSET=cp1251
Есть запросы вида:
SELECT `id`, `c_id`, `m_id`, `f_fin`, `void`, `c_void`, `f_status`, `from_id`, `to_id` FROM `TABLE` WHERE `void` = 0 AND f_status < 3 ORDER BY `c_id` DESC LIMIT {сколько-то там}, 20 - которые работают довольно шустро
А есть запросы вида
SELECT `id`, `c_id`, `m_id`, `f_fin`, `void`, `c_void`, `f_status`, `from_id`, `to_id` FROM `TABLE` WHERE `void` = 0 [b]AND `from_id` = 5[/b] ORDER BY `c_id` DESC LIMIT 0, 20
Которые работают очень долго. (0,7 сек)
Притом, чем больше данных имеется без LIMIT 0, 20 (в примере их 11860), тем дольше идет запрос в базу данных.
Кстати, есди выставить больше LIMIT (например 0, 2000), то таблица начинает использовать filesort и запрос выполняется в 10 раз быстрее... Но это ведь как-то неправильно.
EXPLAIN дает следующее:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE TABLE index void,from_id c_id 5 NULL 233 Using where
Помогите пожалуйста побороть этот неприятный казус.
Отредактированно RizaR (26.03.2010 14:07:54)
Неактивен
Какие-то у Вас жутко-странные индексы на таблице. Для первого
запроса будет неплохо работать индекс на (void, f_status), но сор-
тировка все равно будет не по индексу, а для второго —
(void, from_id, c_id) — тут уже и сортировка будет нормально
работать.
Неактивен
Все бы хорошо, но в системе много различных фильтров и сортировок, не только по этим полям. Именно поэтому, составные индексы использовать не очень хочется.
Т.е:
Вместо AND `from_id` = 5 может быть AND `to_id` = 5 или сразу вместе `from_id` = 5 AND `to_id` = 11
или так
`from_id` = 5 AND `to_id` = 11 AND f_status > 2
ORDER ORDER BY `c_id` может быть ORDER BY `m_id`.
Мне на каждое условие отдельный составной индекс создавать? Не скажется ли это на чем-нибудь другом?
Неактивен
Не хочется использовать индексы — не жалуйтесь на производительность
Посчитайте количество медленных запросов, оцените, какие индексы Вам
нужны, а без каких можете обойтись — и составляйте
Неактивен