Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Запрос:
Отредактированно vaspet (08.04.2009 16:30:31)
Неактивен
Оптимизация подразумевает обычно не тупое добавление индексов (благо, у Вас они
висят на каждом поле), но и подход к способу хранения данных (и пониманию, что хранится
в таблицах).
Возможно, на существующих данных можно переписать запрос так, чтобы он логически
был правилен, но при этом запрос бы выполнялся меньше. С текущими названиями таблиц, я могу
только гадать, что такое, например, mlp.
Конструкции вида «нет id в этой таблице или id есть, но поля не заполнены» почти всегда приводят
к тому, что индекс на этой таблице не используется.
Как первое приближение, попробуйте избавиться от mlm в этом запросе в плане «незаполненности
полей» (кусок в WHERE): нет смысла хранить пустые строки, если они не заполнены, а запрос это
усложняет.
Если переструктурировать данные тяжело, то можете вытаскивать не A.*, а необходимые A.ID
(тогда сортировка filesort будет происходить над меньшим количеством данных => будет происходить
быстрее), а потом к готовому результату присоединить данные для нужных ID:
SELECT A.* FROM A JOIN (SELECT A.ID FROM ... ) B USING (ID) ORDER BY JJMnr;
Неактивен
paulus написал:
Конструкции вида «нет id в этой таблице или id есть, но поля не заполнены» почти всегда приводят
к тому, что индекс на этой таблице не используется.
Смысл запроса как раз найти те А (Artikel), которые не привязаны к объектам (Molink) из mlm // == A.ID NOT IN (SELECT IDlink FROM mlm)
Но при этом лежашие в Контайнерах между 10100000000 и 10200000000
Таблицы
p2a (Artikel to Product n:n)
mlp (Product to Container n:n)
mlm (Artikel to Object n:n)
paulus написал:
Если переструктурировать данные тяжело, то можете вытаскивать не A.*, а необходимые A.ID
(тогда сортировка filesort будет происходить над меньшим количеством данных => будет происходить
быстрее), а потом к готовому результату присоединить данные для нужных ID:
SELECT A.* FROM A JOIN (SELECT A.ID FROM ... ) B USING (ID) ORDER BY JJMnr;
Насколько я понимаю сортировка произойдет после выборки?
А там уже 400 строк, которые надо отсортировать. Поправте меня, если я ошибаюсь.
П.С.
Интересный результат дало разбиение таблицы mlm:
Отредактированно vaspet (08.04.2009 17:29:30)
Неактивен
не совсем так:
сам и написал:
Время выполнения упало до 5 сек.
до 15 сек
и Таблицы были переделанны в MyISAM
Отредактированно vaspet (08.04.2009 17:50:14)
Неактивен
«Которые не привязаны к объектам» — там NULL на другом поле, вроде, должен быть — на поле связи.
Зачем другие поля при этом доставать?
Если такой прирост дало преобразование в MyISAM, то, может, у Вас в InnoDB просто мало памяти было?
Неактивен
paulus написал:
«Которые не привязаны к объектам» — там NULL на другом поле, вроде, должен быть — на поле связи.
Зачем другие поля при этом доставать?
это хорошее замечание, спасиба
paulus написал:
Если такой прирост дало преобразование в MyISAM, то, может, у Вас в InnoDB просто мало памяти было?
Мало памяти в InnoDB? ето какой параметр крутить надо? не совсем понял.
Неактивен
innodb_buffer_pool_size — это память, которую InnoDB использует для работы.
Чем больше — тем лучше. На 32битах больше 1.5Гигабайт лучше не ставить, иначе
можете вылезти из адресного пространства.
Неактивен
Всем спасибо за помощь.
Все вместе + танцы с бубном дало прирост производительности.
Теперь - 3,7сек.
Неактивен
Страниц: 1