|
|
|
| есть запрос, который делает выборку по товарам из прайс-листа с учётом морфологии
т.к. позиций в прайс-листе под милион, то и скорость запроса соответственная, но после выборки всех соответствующих позиций, а именно 20-ти мне нужно построить рядом дерево всех групп к которым относятся найденные товары.
Попробую объяснить попроще.
есть таблица из 2-х полей:
name и gr
делаем запрос вида:
SELECT
`product`.`name`
FROM
`product`
WHERE
`product`.`name` LIKE '%машина%'
ORDER BY
`product`.`name`
LIMIT 0, 20
|
а сл. шагом из найденного мне нужно вывести полный список поля
`product`.`gr`
исспользуя сл. метод
SELECT
`product`.`gr`
FROM
`product`
WHERE
`product`.`name` LIKE '%машина%'
GROUP BY
`product`.`gr`
|
но согласитесь, что если 1 запрос выполняется порядка 10с. и второй столько же, то это слишком круто.
можно ли это как-то оптимизировать? | |
|
|
|
|
|
|
|
для: Dobrynin
(20.04.2009 в 12:14)
| | SELECT product.id ..... LIMIT 20
SELECT DISTINCT product.gr ...... WHERE product.id IN ($id_list)
Хоть мне и непонятно, почему нельзя эти product.gr взять первым же запросом. Уж коль скоро строк только 20. | |
|
|
|
|
|
|
|
для: Trianon
(20.04.2009 в 12:57)
| | не совсем то.
т.к. записей может быть около 100 000, то IN будет работать крайне медленно, + все id я не выгребаю, а только 20.
вот хороший пример подобной логики с вычисление общего кол-ва найденых позиций, без составления второго сложного запроса
SELECT
SQL_CALC_FOUND_ROWS
`product`.`name`
FROM
`product`
WHERE
`product`.`name` LIKE '%машина%'
ORDER BY
`product`.`name`
LIMIT 0, 20
|
а затем
примерно таким же образом мне нужно получить все группы пользуясь результатом предыдущих вычислений. | |
|
|
|
|
|
|
|
для: Dobrynin
(20.04.2009 в 14:45)
| | > IN будет работать крайне медленно
Вы проверяли, или это Ваши измышления?
Вообще то выборка по первичному ключу не должна зависеть от размера таблицы.
Точнее - не должна зависеть линейно.
>SELECT FOUND_ROWS()
>примерно таким же образом мне нужно получить
этот инструмент не имеет ничего общего с поставленной задачей.
Еще раз.
Я не понимаю, почему (если выдергиваем всего 20 строк) не взять из таблицы все нужные поля сразу. | |
|
|
|
|
|
|
|
для: Trianon
(20.04.2009 в 16:40)
| | всё очень просто, дело в том, что мне нужно из таблици в 1.000.000 записей выбрать 100.000 из которых я только покажу 20, а кол-во групп которым пренадлежат товары равно примерно 1.000 и как вы собрараетесь из 20-ти записей получить 1000 групп? я пока такого не придумал. | |
|
|
|
|
|
|
|
для: Dobrynin
(20.04.2009 в 17:52)
| | >всё очень просто, дело в том, что мне нужно из таблици в 1.000.000 записей выбрать 100.000 из которых я только покажу 20, а кол-во групп которым пренадлежат товары равно примерно 1.000 и как вы собрараетесь из 20-ти записей получить 1000 групп? я пока такого не придумал.
В формулировке Вашего вопроса (20.04.2009 в 12:14) явным образом было указано, что первый запрос достает 20 строк. И что второй запрос должен получить данные из выборки первого.
Я - никак не собираюсь.
Я бы просто не стал хранить группы в таблице с товарами, а описал бы их отдельной таблицей. | |
|
|
|
|
|
|
|
для: Trianon
(20.04.2009 в 18:12)
| | база гораздо сложнее, чем представлена в моём примере, не буду сильно распинаться и говорить какая она, да в общем-то это и не интересно никому кроме меня =)
ладно, воспользуюсь временными таблицами из оперативки | |
|
|
|