Автор Тема: Оптимизация запроса  (Прочитано 5853 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Nicki

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 107
  • +0/-0
  • 0
    • Просмотр профиля
    • http://cprazdnikom.ru
Оптимизация запроса
« : 09 Декабря 2003, 18:58:43 »
Нужен совет знающего человека!
Вопрос связан с оптимизацией запросов к MySQL.

Таблица состоит, к примеру, из некоторого числа столбцов:

CREATE TABLE table
(
idPicture varchar(25) NOT NULL,
weightDesign enum(\'text\',\'grpL\',\'grpH\') NOT NULL,
sectionPicture tinyint NOT NULL,
discriptPicture varchar(255) NOT NULL,
UNIQUE idPic (sectionPicture,idPicture)
);

Предположим в таблице есть 500 записей по изображениям:
- 100 из них имеют weightDesign \'text\'
- 100 из них имеют weightDesign \'grpH\'
- 300 из них имеют weightDesign \'grpL\'
- из 300-от последних, 150 имеют sectionPicture равный $x, а остальные 150, $y

Мне нужно выбрать из всей этой кучи только некоторые из них. Допустим, 70 штук, со
следующими условиями отбора: weightDesign=grpL, sectionPicture=$X. Причем,
я знаю idPicture всех мне необходимых записей, т.е. всех 70-ти.

Как будет быстрее?
1. "SELECT * FROM table WHERE weightDesign=\'grpL\' AND sectionPicture=$X", при этом,
weightDesign из 500 оставит 300, а sectionPicture из 300 оставит 150. После чего средствами
PHP отбираются 70 из 150-и.

2. "SELECT * FROM table WHERE idPicture IN (\'pic1\',\'pic2\',\'...\',\'pic70\') AND sectionPicture=$X". Здесь sectionPicture
необходим, т.к. он в паре с idPicture образует многостолбцовый UNIQUE индекс. Думаю, вы уже и так поняли. В итоге,
я получаю необходимый список не прибегая к PHP.

Вот как будет лучше??? Первый вариант делает большую нагрузку на PHP, т.к. приходится проверять
каждую из 150-и записей на предмет "соответствия" одной из 70-и нужных. А во втором используется аж 70 эллементов в условии IN(),
честно говоря, даже не знаю какой максимальный предел кол-ва элементов у этой функции. Если кто знает, подскажите.
Да и вообще, на сколько сильно будет загружать сервер такая конструкция?
Поздравления с днем Святого Валентина

Оффлайн FreeSpace

  • Штатный лодырь
  • Ветеран
  • *****
  • Сообщений: 613
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.infinity.com.ua
Оптимизация запроса
« Ответ #1 : 09 Декабря 2003, 21:10:18 »
ИМХО, второй вариант значительно правильнее по следующим причинам:
1. Код php в любом случае будет работать медленнее мускуля.
2. По сокетному соединению между пхп и мускулем будет передаваться ощутимо меньше данных.
3. Ограничений на кол-во элементов в функции IN(), насколько я знаю, нет.
4. Единственный чисто психологический минус этого подхода - "слишком длинный"  mysql-запрос, но по сравнению с количеством данных, которые бы возвращал запрос в первом варианте, второй выглядит намного привлекательнее.
Программирование - это единственное искусство, которое способно воплотить столь уникальное сочетание эстетики и функциональности.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Оптимизация запроса
« Ответ #2 : 09 Декабря 2003, 21:29:12 »
обоим читать про волшебный оператор LIMIT.

Оффлайн FreeSpace

  • Штатный лодырь
  • Ветеран
  • *****
  • Сообщений: 613
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.infinity.com.ua
Оптимизация запроса
« Ответ #3 : 09 Декабря 2003, 21:39:50 »
RomikChef
Но ведь ни слова не было сказано про критерий отбора!
Я исходил из того, что записи выбераются случайным образом (или по какому-то иному закону) и ORDER BY + LIMIT в данном случае не работают.
Программирование - это единственное искусство, которое способно воплотить столь уникальное сочетание эстетики и функциональности.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Оптимизация запроса
« Ответ #4 : 09 Декабря 2003, 22:39:42 »
Тьфу ты! перепутал, блин, ответчика с истецом.

Ну. И чего?
Во-первых, именно потому, что он НЕ СКАЗАЛ, я и написал про лимит. Безо всяких критериев (как спрошено) лимит прекрасно работает. Надо отобрать 70 из 150 - лимит в руки. ответ дан. Ответ не устраивает - формулируйте критерии лучше.

Во-вторых, с любым законом лимит прекрасно работает.
Учи матчасть, студент.

Оффлайн FreeSpace

  • Штатный лодырь
  • Ветеран
  • *****
  • Сообщений: 613
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.infinity.com.ua
Оптимизация запроса
« Ответ #5 : 09 Декабря 2003, 23:04:50 »
Под иным законом я понимал те критерии, которые являются внешними относительно СУБД (например, если критерии формирует скрипт или программа, совершающая запрос). Поэтому их лимитом и не задашь.
Но в общем случае я с тобой согласен - можно обойтись LIMIT\'ом.
А если нельзя, то это либо не общий случай :), либо ошибка проектирования.
Программирование - это единственное искусство, которое способно воплотить столь уникальное сочетание эстетики и функциональности.

Оффлайн Nicki

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 107
  • +0/-0
  • 0
    • Просмотр профиля
    • http://cprazdnikom.ru
Оптимизация запроса
« Ответ #6 : 10 Декабря 2003, 11:20:08 »
Цитировать
FreeSpace:
Но ведь ни слова не было сказано про критерий отбора!

Все правильно. Мне не нужно лимитировать вывод, мне нужно отобрать ВСЕ что удовлетворяет критериям и ВСЕ (сколько бы ни было) вывести из БД, а не конкретно, допустим 10 записей из 70 отобранных. Так что ты правильно меня понял.

Цитировать
RomikChef:
Во-первых, именно потому, что он НЕ СКАЗАЛ, я и написал про лимит.


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

Цитировать
RomikChef:
Безо всяких критериев (как спрошено) лимит прекрасно работает. Надо отобрать 70 из 150 - лимит в руки. ответ дан. Ответ не устраивает - формулируйте критерии лучше.


Критерии есть, и формулировать лучше их уже нельзя, т.к. они ВСЕ упомянуты в примерах запросов. 70 из 150 удовлетворяющих условию, а не просто что попадет.

В общем, всем спасибо. Но RomikChef не внимательно прочел сам вопрос и пример, а обосрал хорошо. Обидно, честно говоря.
Поздравления с днем Святого Валентина

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Оптимизация запроса
« Ответ #7 : 10 Декабря 2003, 11:42:12 »
Цитировать
Nicki:
они ВСЕ упомянуты в примерах

ой, праааавда штооолииии?
Ну, ткните меня носом, покажите - по каким критериям
Цитировать
средствами PHP отбираются 70 из 150-и.

Ась?

Цитировать
мне нужно отобрать ВСЕ что удовлетворяет критериям и ВСЕ (сколько бы ни было) вывести из БД,

Милый, ты уж определись, сколько будет это ВСЕ -
Цитировать
150

или
Цитировать
70 эллементов


Ты сначала с критериями своими определись, перестань в собственных штанах путаться, а потом уже обижайся.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Оптимизация запроса
« Ответ #8 : 10 Декабря 2003, 11:46:26 »
Цитировать
Все, что нужно я сказал

Все, что нужно - будешь говорить у прокурора.
А здесь - форум. Ответ нужен - тебе. Не надо держать здесь людей за быдло. Хочешь, чтобы ответили? Ну так и относись по-хорошему.
Выглядит твой вопрос так:  "ответьте мне на мой гениально сформулированный вопрос и не смейте сомневаться в предоставленных условиях." Такие претензии ты маме своей предъявляй.
А я имею основания не верить в мифические "условия", пока не увижу их собственными глазами.

Если тебя спросили - а что за условия такие? - тебе впадлу ответить?
« Последнее редактирование: 10 Декабря 2003, 11:54:12 от RomikChef »

Оффлайн Nicki

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 107
  • +0/-0
  • 0
    • Просмотр профиля
    • http://cprazdnikom.ru
Оптимизация запроса
« Ответ #9 : 10 Декабря 2003, 16:35:50 »
OK!
Значит, все по полочкам раставляю.
RomikChef, я мягкий, добрый и пушистый, я не люблю ссорится ни в реале ни в инете. Но, когда мне, на простой вопрос, в котором я буквально на коленях прошу ответить мне, помочь чем то, посылают кудато учиться (типа иди сначало вытери молоко с губ, а потом и спрашивай) или указывают на "криворукость" или "кривомозговость", то я естественно начинаю защищаться.
Ладно, ты мне не указывал на криворукость, правда послал молоко вытирать. Поэтому, я и включил рога, по отношению к тебе. Сорри.

Цитировать
RomikChef:
Все, что нужно - будешь говорить у прокурора.

С этим, я соглашусь.

Цитировать
RomikChef:
А здесь - форум. Ответ нужен - тебе. Не надо держать здесь людей за быдло. Хочешь, чтобы ответили? Ну так и относись по-хорошему.

Я всегда хорошо отношусь ко всем. Но, только до того момента, пока на меня не насрут (в любом смысле), даже намеком.
 
Цитировать
RomikChef:
Выглядит твой вопрос так: "ответьте мне на мой гениально сформулированный вопрос и не смейте сомневаться в предоставленных условиях." Такие претензии ты маме своей предъявляй.

По моему, это тебе он таким кажется, т.к. мы с тобой обменялись парой красивых фраз. Но, если это действительно так, то прошу прощения. Хоть и не знаю в чем виноват. Видимо в том, что не знаю того, что спрашиваю на форуме. Знал бы ответ, и не был бы виноват.

Цитировать
RomikChef:
А я имею основания не верить в мифические "условия", пока не увижу их собственными глазами.
Если тебя спросили - а что за условия такие? - тебе впадлу ответить?

Нет, мне не в падлу ответить.
Цитировать
Nicki:
Мне нужно выбрать из всей этой кучи только некоторые из них. Допустим, 70 штук, со
следующими условиями отбора: weightDesign=grpL, sectionPicture=$X. Причем, я знаю idPicture всех мне необходимых записей, т.е. всех 70-ти.

Т.е. мне нужно 70 записей и их все ID мне известны. Поэтому я написал в примере такой вот запрос

Цитировать
Nicki:
2. "SELECT * FROM table WHERE idPicture IN (\'pic1\',\'pic2\',\'...\',\'pic70\') AND sectionPicture=$X".

Т.е. мне возвращается готовый к обработке список записей. А по первому варианту, получаю 150 записей, из которых средствами ПХП я должен отобрать 70 нужных (а их ID мне известны).

Мне просто нужно было узнать, как будет быстрее:
1. загрузить 150 записей и ПХП с ними разделается, выделив 70 нужных
2. использовать 70!!!!!!! эллементов в функции IN(), и вообще, лимит на кол-во элементов в этой функции.
« Последнее редактирование: 10 Декабря 2003, 20:14:52 от Nicki »
Поздравления с днем Святого Валентина

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Оптимизация запроса
« Ответ #10 : 10 Декабря 2003, 17:17:49 »
Быстрее будет указать сразу в запросе все условия, и получить нужные 70 записей, безо всяких инов.

Цитировать
Нет, мне не в падлу  ответить.

Однако ж, не ответил. Ты размазал соплей тут на два экрана. Но толком, единственное - что от тебя добиваются уже сутки - что это за критерий, по которому "средствами ПХП" отбираются 70 запсей - не написал.

И я знаю, почему.
Стыдно тебе. наверняка эти 70 ид получаются из другого запроса. А как объединить запросы - ты не знаешь. Так?

что ты мне пихаешь свои
Цитировать
со следующими условиями отбора: weightDesign=grpL, sectionPicture=$X. Причем, я знаю idPicture всех мне необходимых записей, т.е. всех 70-ти.

?
я одного не пойму - ты действительно такой дурак, или издеваешься?
Эти, приведенные тобой условия - не равнозначны! по ид выбирается одно количество записей, по "weightDesign=grpL, sectionPicture=$X" - ДРУГОЕ!!!
КАК можно сравнивать их? может быть ты родишь, все-таки, недостающее условие?

Ты можешь описать свою задачу словами? Челвоеческими словами, а не идиотскими запросами вида
Цитировать
WHERE idPicture IN (\'pic1\',\'pic2\',\'...\',\'pic70\') AND sectionPicture=$X

Ты можешь объяснить смысл выделенного жирным куска?

Глядя на такое, я справедливо делаю вывод, что ты совершенно не понимаешь, что делаешь. И пытаюсь вытрясти из тебя очень простую вещь - чтобы ты словами описал, что тебе надо.

И тебе ответят - как это сделать по-человечески.
А ты уперся как баран и талдычишь "вот у меня два запроса - како из них лучше". ОБА КРИВЫЕ!

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Оптимизация запроса
« Ответ #11 : 10 Декабря 2003, 17:20:42 »
интересно, сколько времени придется вытрясать из тебя, откуда берутся эти 70 ид, которые ты "знаешь".
Честное слово - такое впечатление слкдывается, что ты партизан на допросе, а я гестаповец.
что нормальный запрос нужен мне, а не тебе.

Оффлайн Nicki

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 107
  • +0/-0
  • 0
    • Просмотр профиля
    • http://cprazdnikom.ru
Оптимизация запроса
« Ответ #12 : 10 Декабря 2003, 20:04:38 »
RomikChef, козел ты в натуре. Я надеялся, что ты хоть чуть поймешь мою ... да, че я парюсь с тобой. Я тебе, как тупому барану, уже два дня пытаюсь объяснить на пальцах, что не важно где и как я буду использовать запрос. Мне нужнео знать, какой из предложенных вариантов быстрее. А ты, как придурок прискипался к этим "левым" примерам, которые мне пришлось накатать за пять минут, да так, чтобы было видно САМОЕ ГЛАВНОЕ КАК БУДЕТ БЫСТРЕЕ, И С МЕНЬШЕЙ НАГРУЗКОЙ НА СЕРВАК, КАКОЙ ИЗ ВАРИАНТОВ

1. Все необходимые записи (значения однозначно идентифицирующие записи) перечисленны в функции IN() - их всегда много, от 50 и до 120. Дальше объясняю для тебя, тупого барана откуда я их беру. До этого запроса посылается еще один. Он возвращает "строку" символов разделенных запятыми. Эту строку символов я разбиваю в массив и собираю снова в другую строку, но с другим разделителем. Примерно, это выглядит так:

$list = implode ("\',\'", explode (",", mysql_result($result, 0, \'needPic\')));

т.е. я разбиваю строку запятыми, а собираю строку с апостровами и запятой \',\'. ... хммм, правда можно применить и функцию str_replace() может даже быстрее получится, ну да ладно это не важно. Важно то, что именно получившуюся строку я могу использовать в запросе:

"SELECT * FROM table WHERE idPicture IN (\'$list\') AND sectionPicture=$X"

Цитировать
RomikChef:
Ты можешь объяснить смысл выделенного жирным куска?

Для особо тупых и, самое главное, СЛЕПЫХ. Ты смотрел на пример таблицы, ну хотябы одним глазом?? Или они у тебя совсем заплыли от синьки??????????? Еще раз посмотри.
Цитировать
Nicki:
CREATE TABLE table
(
idPicture varchar(25) NOT NULL,
weightDesign enum(\'text\',\'grpL\',\'grpH\') NOT NULL,
sectionPicture tinyint NOT NULL,
discriptPicture varchar(255) NOT NULL,
UNIQUE idPic (sectionPicture,idPicture)
);


Специально для тебя дебила выделил жирным. ЭТО называется уникальный, многостолбцовый индекс. ... Самое интересное, что в самом вопросе, я не стал расталковывать что это такое
Цитировать
Nicki:
Здесь sectionPicture необходим, т.к. он в паре с idPicture образует многостолбцовый UNIQUE индекс. Думаю, вы уже и так поняли.

Видимо, поняли только нормальные люди, вроде FreeSpace. А такой идиот, как ты, просто не в состоянии этого понять. Разжевываю, а ты глотай, милый, только не подавись, а то снова я буду виноват. В таблице может быть две, три, двадцать записей с dPicture=penis, и каждая из этих записей мне нужна, НО, ... НО, в разных разделах, т.е. в разных sectionPicture. Они - sectionPicture и idPicture образуют многостолбцовый уникальный индекс. ЗНАЧИТ, чтобы отобрать только ЗАПРОШЕННЫЙ idPicture, который равен penis нужно указать в WHERE оба критерия отбора - список idPicture и раздел sectionPicture.

Но, самое интересное, что из такого паршивого вопроса, некоторые могут делать ОГРОМНУЮ дискуссию "не о чем". Ну какая тебе разница откуда я "знаю" эти 70 ид. Ну, и че!!!!!!! Вот я тебя носом ткнул в эту кучу дерьма с 70-ю ид, и что???

Ладно. Дальше разбираю твой, а не мой бред.
Цитировать
RomikChef:
Эти, приведенные тобой условия - не равнозначны! по ид выбирается одно количество записей, по "weightDesign=grpL, sectionPicture=$X" - ДРУГОЕ!!!
КАК можно сравнивать их? может быть ты родишь, все-таки, недостающее условие?

Ты вообще не читаешь текст, а просто глотаешь куски отдельных фраз!!!!! ВОТ, ВОЗЬМИ ЛУПУ И СМОТРИ
Цитировать
Nicki:
Предположим в таблице есть 500 записей по изображениям:
- 100 из них имеют weightDesign \'text\'
- 100 из них имеют weightDesign \'grpH\'
- 300 из них имеют weightDesign \'grpL\'
- из 300-от последних, 150 имеют sectionPicture равный $x, а остальные 150, $y

Всего 500. Это хоть понятно??? weightDesign=grpL отбирает из 500, только 300, т.к. 300 из 500 имеют weightDesign=grpL. А sectionPicture=$x, из 300 отобранных отбирает 150 и вот из этих 150-и нужно отобрать 70 нужных. Я не стал заострять внимание читающих топ на weightDesign=grpL во втором примере, потому что, думал, что меня поймут. Главное это то, КАК ПОЛУЧИТЬ БЫСТРЕЕ ЭТИ ДОЛБАННЫЕ 70 ЗАПИСЕЙ - ТОЛЬКО НА МАЭСКУЭЛЕ ИЛИ С ИСПОЛЬЗОВАНИЕМ ПХП. Все!!!!!!! Мне больше нифига не надо было. Но, ты, как мазоль на жопе. Ну на фига тебе где я беру эти идишки и куда я дел недостающее условие.  Еще раз повторяю - я упростил второй пример запроса, указав в нем самое важное условие отбора, т.к. они образуют уникальный индекс. Ну ладно, не указал, мой касяк, но ведь из описания первого примера и так все понятно, как происходит отбор, а во втором я толко пояснил смысл двух условий образующих индекс.

Кароче, незнаю о чем мы базарим, какая та лажа блин, фигня, идиотизм. Тема была закрыта еще после первого ответа FreeSpace.
В следующий раз потрачу не пять минут на составление вопроса, а часа полтора, чтобы ВСЁЁЁЁЁ изложить в топике, дабы избежать коллизий со стороны слишком придирчивых товарищей!!!!

Тема исчерпана. Всем спасибо за внимание!!!
Поздравления с днем Святого Валентина

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Оптимизация запроса
« Ответ #13 : 10 Декабря 2003, 23:22:03 »
Ээээ.....RomikChef хоть и использовал стиль в форме наезда: но он прав - проще объединть запросы и вариантов объежинения много.

Nicki, задачу лучше сразу ставить целиком - тогда и решение отыщется быстрее.

Ко всем: корректнее в выражениях и ближе к сути.:)
2B OR NOT 2B = FF

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Оптимизация запроса
« Ответ #14 : 11 Декабря 2003, 10:54:46 »
За невнимательность ты меня макнул поделом. Виноват.
Но все равно я ясности не вижу в вопросе.
Если коротко - то мне не нравится ни тот ни другой вариант.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28