[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите оптимизировать запрос
minok94
Здравствуйте. Запрос проходит очень медленно, не успевал выполняться за 30 сек, поэтому пришлось увеличить время до 90 сек. Как его лучше сделать чтобы увеличить скорость выполнения?

SELECT SQL_CALC_FOUND_ROWS * FROM `cpu`,`matherboard`,`ram`,`video`,`hdd`,`form` 
WHERE (`matherboard`.`socket`=`cpu`.`socket`)
AND (`matherboard`.`t_ram`=`ram`.`t_ram`)
AND (`matherboard`.`t_video`=`video`.`t_video`)
AND (`matherboard`.`t_rom`=`hdd`.`t_rom`)
AND (`matherboard`.`t_form`=`form`.`t_form`) limit 20

Запрос пришлось организовать таким образом, чтобы выборка происходила из нескольких таблиц одновременно.



Спустя 7 минут, 34 секунды (16.03.2011 - 18:43) sharki написал(а):
Ну во первых надо прописывать вручную каждое поле, которое нужно
SELECT SQL_CALC_FOUND_ROWS * FROM не так, а так SELECT SQL_CALC_FOUND_ROWS `id`.`ram`, `tag`.`vidio` FROM.... в этом духе

и наверное надо группировать запрос так, чтобы были как бы миниподзапросы одного запроса. Но с этим я не могу сейчас помочь..с написанием правильно кода =_

Спустя 6 минут, 16 секунд (16.03.2011 - 18:50) minok94 написал(а):
Исправил, теперь запрос выглядит так:
SELECT SQL_CALC_FOUND_ROWS `cpu`.`id`,`cpu`.`title`,`cpu`.`promo`,`cpu`.`man`,`cpu`.`socket`,`cpu`.`index`,`cpu`.`kernel`,`cpu` .`rec`,`cpu`.`money`,
`matherboard`.`id`,`matherboard`.`title`,`matherboard`.`promo`,`matherboard`.`man`,`matherboard`.`so cket`,`matherboard`.`t_form`,`matherboard`.`t_ram`,`matherboard`.`t_rom`,
`matherboard`.`t_video`,`matherboard`.`index`,`matherboard`.`rec`,`matherboard`.`money`,
`ram`.`id`,`ram`.`title`,`ram`.`promo`,`ram`.`man`,`ram`.`t_ram`,`ram`.`value`,`ram`.`index`,`ram`.` rec`,`ram`.`money`,
`video`.`id`,`video`.`title`,`video`.`promo`,`video`.`man`,`video`.`t_video`,`video`.`value`,`video` .`type`,`video`.`index`,`video`.`rec`,`video`.`money`,
`hdd`.`id`,`hdd`.`title`,`hdd`.`promo`,`hdd`.`man`,`hdd`.`t_rom`,`hdd`.`value`,`hdd`.`index`,`hdd`.` rec`,`hdd`.`money`,
`form`.`id`,`form`.`title`,`form`.`promo`,`form`.`man`,`form`.`t_form`,`form`.`size`,`form`.`index`, `form`.`rec`,`form`.`money`
FROM `cpu`,`matherboard`,`ram`,`video`,`hdd`,`form`
WHERE (`matherboard`.`socket`=`cpu`.`socket`)
AND (`matherboard`.`t_ram`=`ram`.`t_ram`)
AND (`matherboard`.`t_video`=`video`.`t_video`)
AND (`matherboard`.`t_rom`=`hdd`.`t_rom`)
AND (`matherboard`.`t_form`=`form`.`t_form`) limit 20

При выполнении комп повис и неотзывался около 10 мин...

Спустя 10 минут, 51 секунда (16.03.2011 - 19:00) sharki написал(а):
фига запрос...щас придут Гуру и помогут =) подожди малек

Спустя 7 секунд (16.03.2011 - 19:01) Семён написал(а):
SQL_CALC_FOUND_ROWS не используй это.
На больших таблицах будут жуткие тормоза! Быстрее сделать 2-ой SELECT. + какое у тебя кол-во данных? покажи EXPLAIN у запроса

Спустя 4 минуты, 55 секунд (16.03.2011 - 19:05) minok94 написал(а):
Спасибо, не буду SQL_CALC_FOUND_ROWS использовать, но при выполнении запроса комп виснет.

Спустя 1 минута, 13 секунд (16.03.2011 - 19:07) Семён написал(а):
Цитата (minok94 @ 16.03.2011 - 20:05)
Спасибо, не буду SQL_CALC_FOUND_ROWS использовать, но при выполнении запроса комп виснет.

У тебя какое кол-во данных? Расставлены индексы на колонках по которым проходит выборка (WHERE) поставь перед SELECT слово EXPLAIN и выведи то что тебе выдаст запрос.

Спустя 32 минуты, 26 секунд (16.03.2011 - 19:39) minok94 написал(а):
Запрос не прошел, по этому попробовал набрать в phpmyadmin, результат на скрине:

Спустя 2 часа, 24 минуты, 18 секунд (16.03.2011 - 22:03) Snus написал(а):
SELECT COUNT(*)
FROM `matherboard`
INNER JOIN `cpu` ON cpu.socket = matherboard.socket
INNER JOIN `ram` ON ram.t_ram = matherboard.t_ram
INNER JOIN `video` ON video.t_video = matherboard.t_video
INNER JOIN `rom` ON rom.t_rom = matherboard.t_rom
INNER JOIN `form` ON form.t_form = matherboard.t_form

Спустя 18 минут, 54 секунды (16.03.2011 - 22:22) Trianon написал(а):
Snus
Верно, так более красиво и понятно.
Но пока человек не начнет применять ключи для связи таблиц и строить индексы на ключевых полях, это всё мертвому припарки.

Спустя 3 минуты, 51 секунда (16.03.2011 - 22:26) Snus написал(а):
Вот так правильнее кагбэ :)
SELECT COUNT(*)
FROM `matherboard` AS `db`
INNER JOIN `cpu` ON cpu.id = db.socket
INNER JOIN `ram` ON ram.id = db.t_ram
INNER JOIN `video` ON video.id = db.t_video
INNER JOIN `rom` ON rom.id = db.t_rom
INNER JOIN `form` ON form.id = db.t_form

А на cpu, ram, video, rom и form ID должен иметь первичный ключ с автоинкрементом.

Спустя 6 минут, 10 секунд (16.03.2011 - 22:32) Trianon написал(а):
так наверняка ж в этих socket, t_ram и прочих t_* лежат человеческие названия, а не суррогатные ключи.
А значит все эти таблицы придется модифицировать.

Спустя 6 часов, 24 минуты, 57 секунд (17.03.2011 - 04:57) minok94 написал(а):
Всем спасибо, запрос действительно выглядит правильней и скорость выборки возросла в несколько раз.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.