SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.03.2010 10:32:50

RizaR
Участник
Зарегистрирован: 26.03.2010
Сообщений: 5

оптимизация ORDER BY тратата DESC

Добрый день господа!

Имеется таблица вида:

Код:

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)

Неактивен

 

#2 26.03.2010 13:53:07

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: оптимизация ORDER BY тратата DESC

Какие-то у Вас жутко-странные индексы на таблице. Для первого
запроса будет неплохо работать индекс на (void, f_status), но сор-
тировка все равно будет не по индексу, а для второго — 
(void, from_id, c_id) — тут уже и сортировка будет нормально
работать.

Неактивен

 

#3 26.03.2010 14:13:12

RizaR
Участник
Зарегистрирован: 26.03.2010
Сообщений: 5

Re: оптимизация ORDER BY тратата DESC

Все бы хорошо, но в системе много различных фильтров и сортировок, не только по этим полям. Именно поэтому, составные индексы использовать не очень хочется.
Т.е:
Вместо 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`.


Мне на каждое условие отдельный  составной индекс создавать? Не скажется ли это на чем-нибудь другом?

Неактивен

 

#4 26.03.2010 14:23:10

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: оптимизация ORDER BY тратата DESC

Не хочется использовать индексы — не жалуйтесь на производительность smile
Посчитайте количество медленных запросов, оцените, какие индексы Вам
нужны, а без каких можете обойтись — и составляйте smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson