Forum Webscript.Ru

Разное => Флейм => Тема начата: Nicki от 09 Декабря 2003, 18:58:43

Название: Оптимизация запроса
Отправлено: Nicki от 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 от 09 Декабря 2003, 21:10:18
ИМХО, второй вариант значительно правильнее по следующим причинам:
1. Код php в любом случае будет работать медленнее мускуля.
2. По сокетному соединению между пхп и мускулем будет передаваться ощутимо меньше данных.
3. Ограничений на кол-во элементов в функции IN(), насколько я знаю, нет.
4. Единственный чисто психологический минус этого подхода - "слишком длинный"  mysql-запрос, но по сравнению с количеством данных, которые бы возвращал запрос в первом варианте, второй выглядит намного привлекательнее.
Название: Оптимизация запроса
Отправлено: Меняздесьдавнонет от 09 Декабря 2003, 21:29:12
обоим читать про волшебный оператор LIMIT.
Название: Оптимизация запроса
Отправлено: FreeSpace от 09 Декабря 2003, 21:39:50
RomikChef
Но ведь ни слова не было сказано про критерий отбора!
Я исходил из того, что записи выбераются случайным образом (или по какому-то иному закону) и ORDER BY + LIMIT в данном случае не работают.
Название: Оптимизация запроса
Отправлено: Меняздесьдавнонет от 09 Декабря 2003, 22:39:42
Тьфу ты! перепутал, блин, ответчика с истецом.

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

Во-вторых, с любым законом лимит прекрасно работает.
Учи матчасть, студент.
Название: Оптимизация запроса
Отправлено: FreeSpace от 09 Декабря 2003, 23:04:50
Под иным законом я понимал те критерии, которые являются внешними относительно СУБД (например, если критерии формирует скрипт или программа, совершающая запрос). Поэтому их лимитом и не задашь.
Но в общем случае я с тобой согласен - можно обойтись LIMIT\'ом.
А если нельзя, то это либо не общий случай :), либо ошибка проектирования.
Название: Оптимизация запроса
Отправлено: Nicki от 10 Декабря 2003, 11:20:08
Цитировать
FreeSpace:
Но ведь ни слова не было сказано про критерий отбора!

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

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


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

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


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

В общем, всем спасибо. Но RomikChef не внимательно прочел сам вопрос и пример, а обосрал хорошо. Обидно, честно говоря.
Название: Оптимизация запроса
Отправлено: Меняздесьдавнонет от 10 Декабря 2003, 11:42:12
Цитировать
Nicki:
они ВСЕ упомянуты в примерах

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

Ась?

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

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

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


Ты сначала с критериями своими определись, перестань в собственных штанах путаться, а потом уже обижайся.
Название: Оптимизация запроса
Отправлено: Меняздесьдавнонет от 10 Декабря 2003, 11:46:26
Цитировать
Все, что нужно я сказал

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

Если тебя спросили - а что за условия такие? - тебе впадлу ответить?
Название: Оптимизация запроса
Отправлено: Nicki от 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, 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

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

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

И тебе ответят - как это сделать по-человечески.
А ты уперся как баран и талдычишь "вот у меня два запроса - како из них лучше". ОБА КРИВЫЕ!
Название: Оптимизация запроса
Отправлено: Меняздесьдавнонет от 10 Декабря 2003, 17:20:42
интересно, сколько времени придется вытрясать из тебя, откуда берутся эти 70 ид, которые ты "знаешь".
Честное слово - такое впечатление слкдывается, что ты партизан на допросе, а я гестаповец.
что нормальный запрос нужен мне, а не тебе.
Название: Оптимизация запроса
Отправлено: Nicki от 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 от 10 Декабря 2003, 23:22:03
Ээээ.....RomikChef хоть и использовал стиль в форме наезда: но он прав - проще объединть запросы и вариантов объежинения много.

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

Ко всем: корректнее в выражениях и ближе к сути.:)
Название: Оптимизация запроса
Отправлено: Меняздесьдавнонет от 11 Декабря 2003, 10:54:46
За невнимательность ты меня макнул поделом. Виноват.
Но все равно я ясности не вижу в вопросе.
Если коротко - то мне не нравится ни тот ни другой вариант.
Название: Оптимизация запроса
Отправлено: ThE0ReTiC от 11 Декабря 2003, 11:06:37
Nicki
[moderator]
За языком следи иначе награжу медалькой
[/moderator]
Название: Оптимизация запроса
Отправлено: Nicki от 11 Декабря 2003, 14:03:49
Цитировать
RomikChef:
Если коротко - то мне не нравится ни тот ни другой вариант.

А какой же Вам наравится, уважаемый?? Просветите всех нас своей ясной мыслёёёёй!!!! Или мы не достойны вашего внимания????????

Цитировать
Chs:
Ээээ.....RomikChef хоть и использовал стиль в форме наезда: но он прав - проще объединть запросы и вариантов объежинения много.

Не мог бы ты малость поподробнее отписать. Не хочется в этом признаваться, т.к. граждане вроде RomikChef сразу обольют кое-чем с ног до головы. Но с MySQL, ... и SQL\'ом вообще, я знаком буквально с месяц.

Модератору: ты сначала награждай медалькой тех, кто детский сад из форума устраивает, кто действительно "за языком не следит", а потом уж, миролюбивых тварей. Я первым никогда не начинаю. Прочти топ еще раз.
Название: Оптимизация запроса
Отправлено: ThE0ReTiC от 11 Декабря 2003, 14:09:01
Nicki
мне абсолютно все равно, кто начинает.
Если у тебя не хватает ума не отвечать на подобные вещи - это твои трудности
я предупредил.
Если ты с SQL знаком всего месяц - слушай что тебе говорят те, кто с ним знаком уже несколько лет, покури доки, чтобы разобраться и не меряйся своим самомнением с другими

перехали - ибо флейма больше чем разговоров по существу вопроса
Название: Оптимизация запроса
Отправлено: Nicki от 11 Декабря 2003, 15:13:29
Цитировать
ThE0ReTiC:
слушай что тебе говорят те, кто с ним знаком уже несколько лет, покури доки, чтобы разобраться и не меряйся своим самомнением с другими

Во первых, есть водилы, которые баранку всю жизнь крутят, и тем не менее, водят не чуть не лучше тех, кто только начинает. Зачастую, даже намного хуже. А во вторых, кроме унижения, я от RomikChef, ни чего не получил - ни одного совета или примера. Так к чему мне прислушиваться?? "Доки сходи покури"???? Я их и так постоянно покуриваю. Накурился уже. Мне нужны простые и понятные ответы, помощь, реальная помощь. Иначе, меня тут не было бы. А я, вместо помощи, по шее словил.

Цитировать
ThE0ReTiC:
мне абсолютно все равно, кто начинает.

но однако, ты только мне, только мне сделал замечание. И я знаю почему. Потому что, тот тип постоянный "клиент" на форуме. Он вам там рейтинг поднимает, банеры показывает и все это, постоянно. А я, вроде случайного прохожего - не имею ни каких прав и привилегий. Так вот у нас живется, в России.

Ладно, прощайте ребятня. Умаялся я с вами.
Название: Оптимизация запроса
Отправлено: ThE0ReTiC от 11 Декабря 2003, 15:21:03
Nicki
потому что козлом в натуре он тебя не называл
тема закрыта