Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос / 6 сообщений из 6, страница 1 из 1
22.09.2013, 23:37:12
    #38404204
Gfer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Добрый день.

Помогите, пожалуйста, с оптимизацией запроса.
Есть таблица с товарами. Товары можно объединить в модели по артикулу SUBSTRING(article,1,6).
Нужно сделать запрос с выводом всех моделей, при этом товары, входящие в данные модели должны иметь минимальную стоимость.

Вот мой запрос:
SELECT c.id as id, name, article, count, price, status FROM goods as c WHERE id = (SELECT id FROM goods as d WHERE SUBSTRING(d.article,1,6) = SUBSTRING(c.article,1,6) AND (count != 0) ORDER BY price ASC LIMIT 1) ORDER BY status LIMIT 0, 24;

Проблема в том, что такой запрос выполняется несколько секунд. Это очень долго. Добавление индексов не ускорило выполнение запроса.
Есть более оптимальны способ?

Заранее большое спасибо.
...
Рейтинг: 0 / 0
23.09.2013, 01:21:36
    #38404251
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
GferДобрый день.

Помогите, пожалуйста, с оптимизацией запроса.
Есть таблица с товарами. Товары можно объединить в модели по артикулу SUBSTRING(article,1,6).
Нужно сделать запрос с выводом всех моделей, при этом товары, входящие в данные модели должны иметь минимальную стоимость.

Вот мой запрос:
SELECT c.id as id, name, article, count, price, status FROM goods as c WHERE id = (SELECT id FROM goods as d WHERE SUBSTRING(d.article,1,6) = SUBSTRING(c.article,1,6) AND (count != 0) ORDER BY price ASC LIMIT 1) ORDER BY status LIMIT 0, 24;

Проблема в том, что такой запрос выполняется несколько секунд. Это очень долго. Добавление индексов не ускорило выполнение запроса.
Есть более оптимальны способ?

Заранее большое спасибо.

1. форматируйте запросы (например http://sqlformat.appspot.com/ ),
трудночитаемые запросы вызывают раздражение.

2. посмотрите здесь:
http://www.sql.ru/forum/687908/faq-vyborka-pervoy-posledney-zapisi-v-gruppah

3. SUBSTRING(d.article,1,6) = SUBSTRING(c.article,1,6)
скорее вего полностью убивает возможность использования индекса.
(ну и тормоза соответсвено).

Сделайте отдельно поле из первых 6 букв и тогда сравнения
будут идти по индексу.
...
Рейтинг: 0 / 0
23.09.2013, 11:30:44
    #38404468
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Gfer,

добавьте поля по нужным вырезкам, прооиндексируйте их и уберите подзапросы с SUBSTRING(). Если этого нельзя сделать - лучше врядли получится.
...
Рейтинг: 0 / 0
24.09.2013, 16:06:34
    #38406274
Gfer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
javajdbcGferДобрый день.

Помогите, пожалуйста, с оптимизацией запроса.
Есть таблица с товарами. Товары можно объединить в модели по артикулу SUBSTRING(article,1,6).
Нужно сделать запрос с выводом всех моделей, при этом товары, входящие в данные модели должны иметь минимальную стоимость.

Вот мой запрос:
SELECT c.id as id, name, article, count, price, status FROM goods as c WHERE id = (SELECT id FROM goods as d WHERE SUBSTRING(d.article,1,6) = SUBSTRING(c.article,1,6) AND (count != 0) ORDER BY price ASC LIMIT 1) ORDER BY status LIMIT 0, 24;

Проблема в том, что такой запрос выполняется несколько секунд. Это очень долго. Добавление индексов не ускорило выполнение запроса.
Есть более оптимальны способ?

Заранее большое спасибо.

1. форматируйте запросы (например http://sqlformat.appspot.com/ ),
трудночитаемые запросы вызывают раздражение.

2. посмотрите здесь:
http://www.sql.ru/forum/687908/faq-vyborka-pervoy-posledney-zapisi-v-gruppah

3. SUBSTRING(d.article,1,6) = SUBSTRING(c.article,1,6)
скорее вего полностью убивает возможность использования индекса.
(ну и тормоза соответсвено).

Сделайте отдельно поле из первых 6 букв и тогда сравнения
будут идти по индексу.

Спасибо! Попробую.

1. Прошу прощения, не знал о такой возможности. Добавлю к себе в инструменты.

2. Почитаю.

3. В документации написано, что можно сделать индекс по определенной длине поля. Сделал INDEX `index_article` (`article`(3)), но ускорения никакого.
...
Рейтинг: 0 / 0
24.09.2013, 16:07:42
    #38406275
Gfer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Arhat109Gfer,

добавьте поля по нужным вырезкам, прооиндексируйте их и уберите подзапросы с SUBSTRING(). Если этого нельзя сделать - лучше врядли получится.

Спасибо за идею.
...
Рейтинг: 0 / 0
24.09.2013, 18:50:23
    #38406496
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
GferВ документации написано, что можно сделать индекс по определенной длине поляЭто всего лишь уменьшит размер индекса, но никак не скажется на его использовании в запросах с субстрингами.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]