|
|
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Добрый день. Помогите, пожалуйста, с оптимизацией запроса. Есть таблица с товарами. Товары можно объединить в модели по артикулу 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; Проблема в том, что такой запрос выполняется несколько секунд. Это очень долго. Добавление индексов не ускорило выполнение запроса. Есть более оптимальны способ? Заранее большое спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2013, 23:37:12 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
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 букв и тогда сравнения будут идти по индексу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2013, 01:21:36 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Gfer, добавьте поля по нужным вырезкам, прооиндексируйте их и уберите подзапросы с SUBSTRING(). Если этого нельзя сделать - лучше врядли получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2013, 11:30:44 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
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)), но ускорения никакого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 16:06:34 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Arhat109Gfer, добавьте поля по нужным вырезкам, прооиндексируйте их и уберите подзапросы с SUBSTRING(). Если этого нельзя сделать - лучше врядли получится. Спасибо за идею. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 16:07:42 |
|
||
|
|

start [/forum/topic.php?fid=47&tid=1835988]: |
0ms |
get settings: |
4ms |
get forum list: |
9ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
52ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 349ms |

| 0 / 0 |
