Forum Webscript.Ru
Разное => Флейм => Тема начата: 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(),
честно говоря, даже не знаю какой максимальный предел кол-ва элементов у этой функции. Если кто знает, подскажите.
Да и вообще, на сколько сильно будет загружать сервер такая конструкция?
-
ИМХО, второй вариант значительно правильнее по следующим причинам:
1. Код php в любом случае будет работать медленнее мускуля.
2. По сокетному соединению между пхп и мускулем будет передаваться ощутимо меньше данных.
3. Ограничений на кол-во элементов в функции IN(), насколько я знаю, нет.
4. Единственный чисто психологический минус этого подхода - "слишком длинный" mysql-запрос, но по сравнению с количеством данных, которые бы возвращал запрос в первом варианте, второй выглядит намного привлекательнее.
-
обоим читать про волшебный оператор LIMIT.
-
RomikChef
Но ведь ни слова не было сказано про критерий отбора!
Я исходил из того, что записи выбераются случайным образом (или по какому-то иному закону) и ORDER BY + LIMIT в данном случае не работают.
-
Тьфу ты! перепутал, блин, ответчика с истецом.
Ну. И чего?
Во-первых, именно потому, что он НЕ СКАЗАЛ, я и написал про лимит. Безо всяких критериев (как спрошено) лимит прекрасно работает. Надо отобрать 70 из 150 - лимит в руки. ответ дан. Ответ не устраивает - формулируйте критерии лучше.
Во-вторых, с любым законом лимит прекрасно работает.
Учи матчасть, студент.
-
Под иным законом я понимал те критерии, которые являются внешними относительно СУБД (например, если критерии формирует скрипт или программа, совершающая запрос). Поэтому их лимитом и не задашь.
Но в общем случае я с тобой согласен - можно обойтись LIMIT\'ом.
А если нельзя, то это либо не общий случай :), либо ошибка проектирования.
-
FreeSpace:
Но ведь ни слова не было сказано про критерий отбора!
Все правильно. Мне не нужно лимитировать вывод, мне нужно отобрать ВСЕ что удовлетворяет критериям и ВСЕ (сколько бы ни было) вывести из БД, а не конкретно, допустим 10 записей из 70 отобранных. Так что ты правильно меня понял.
RomikChef:
Во-первых, именно потому, что он НЕ СКАЗАЛ, я и написал про лимит.
Все, что нужно я сказал. Если бы мне нужно было лимитировать, я так бы и написал, как ограничить кол-во уже отобранных записей.
RomikChef:
Безо всяких критериев (как спрошено) лимит прекрасно работает. Надо отобрать 70 из 150 - лимит в руки. ответ дан. Ответ не устраивает - формулируйте критерии лучше.
Критерии есть, и формулировать лучше их уже нельзя, т.к. они ВСЕ упомянуты в примерах запросов. 70 из 150 удовлетворяющих условию, а не просто что попадет.
В общем, всем спасибо. Но RomikChef не внимательно прочел сам вопрос и пример, а обосрал хорошо. Обидно, честно говоря.
-
Nicki:
они ВСЕ упомянуты в примерах
ой, праааавда штооолииии?
Ну, ткните меня носом, покажите - по каким критериям
средствами PHP отбираются 70 из 150-и.
Ась?
мне нужно отобрать ВСЕ что удовлетворяет критериям и ВСЕ (сколько бы ни было) вывести из БД,
Милый, ты уж определись, сколько будет это ВСЕ -
150
или
70 эллементов
Ты сначала с критериями своими определись, перестань в собственных штанах путаться, а потом уже обижайся.
-
Все, что нужно я сказал
Все, что нужно - будешь говорить у прокурора.
А здесь - форум. Ответ нужен - тебе. Не надо держать здесь людей за быдло. Хочешь, чтобы ответили? Ну так и относись по-хорошему.
Выглядит твой вопрос так: "ответьте мне на мой гениально сформулированный вопрос и не смейте сомневаться в предоставленных условиях." Такие претензии ты маме своей предъявляй.
А я имею основания не верить в мифические "условия", пока не увижу их собственными глазами.
Если тебя спросили - а что за условия такие? - тебе впадлу ответить?
-
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(), и вообще, лимит на кол-во элементов в этой функции.
-
Быстрее будет указать сразу в запросе все условия, и получить нужные 70 записей, безо всяких инов.
Нет, мне не в падлу ответить.
Однако ж, не ответил. Ты размазал соплей тут на два экрана. Но толком, единственное - что от тебя добиваются уже сутки - что это за критерий, по которому "средствами ПХП" отбираются 70 запсей - не написал.
И я знаю, почему.
Стыдно тебе. наверняка эти 70 ид получаются из другого запроса. А как объединить запросы - ты не знаешь. Так?
что ты мне пихаешь свои со следующими условиями отбора: weightDesign=grpL, sectionPicture=$X. Причем, я знаю idPicture всех мне необходимых записей, т.е. всех 70-ти.
?
я одного не пойму - ты действительно такой дурак, или издеваешься?
Эти, приведенные тобой условия - не равнозначны! по ид выбирается одно количество записей, по "weightDesign=grpL, sectionPicture=$X" - ДРУГОЕ!!!
КАК можно сравнивать их? может быть ты родишь, все-таки, недостающее условие?
Ты можешь описать свою задачу словами? Челвоеческими словами, а не идиотскими запросами вида
WHERE idPicture IN (\'pic1\',\'pic2\',\'...\',\'pic70\') AND sectionPicture=$X
Ты можешь объяснить смысл выделенного жирным куска?
Глядя на такое, я справедливо делаю вывод, что ты совершенно не понимаешь, что делаешь. И пытаюсь вытрясти из тебя очень простую вещь - чтобы ты словами описал, что тебе надо.
И тебе ответят - как это сделать по-человечески.
А ты уперся как баран и талдычишь "вот у меня два запроса - како из них лучше". ОБА КРИВЫЕ!
-
интересно, сколько времени придется вытрясать из тебя, откуда берутся эти 70 ид, которые ты "знаешь".
Честное слово - такое впечатление слкдывается, что ты партизан на допросе, а я гестаповец.
что нормальный запрос нужен мне, а не тебе.
-
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.
В следующий раз потрачу не пять минут на составление вопроса, а часа полтора, чтобы ВСЁЁЁЁЁ изложить в топике, дабы избежать коллизий со стороны слишком придирчивых товарищей!!!!
Тема исчерпана. Всем спасибо за внимание!!!
-
Ээээ.....RomikChef хоть и использовал стиль в форме наезда: но он прав - проще объединть запросы и вариантов объежинения много.
Nicki, задачу лучше сразу ставить целиком - тогда и решение отыщется быстрее.
Ко всем: корректнее в выражениях и ближе к сути.:)
-
За невнимательность ты меня макнул поделом. Виноват.
Но все равно я ясности не вижу в вопросе.
Если коротко - то мне не нравится ни тот ни другой вариант.
-
Nicki
[moderator]
За языком следи иначе награжу медалькой
[/moderator]
-
RomikChef:
Если коротко - то мне не нравится ни тот ни другой вариант.
А какой же Вам наравится, уважаемый?? Просветите всех нас своей ясной мыслёёёёй!!!! Или мы не достойны вашего внимания????????
Chs:
Ээээ.....RomikChef хоть и использовал стиль в форме наезда: но он прав - проще объединть запросы и вариантов объежинения много.
Не мог бы ты малость поподробнее отписать. Не хочется в этом признаваться, т.к. граждане вроде RomikChef сразу обольют кое-чем с ног до головы. Но с MySQL, ... и SQL\'ом вообще, я знаком буквально с месяц.
Модератору: ты сначала награждай медалькой тех, кто детский сад из форума устраивает, кто действительно "за языком не следит", а потом уж, миролюбивых тварей. Я первым никогда не начинаю. Прочти топ еще раз.
-
Nicki
мне абсолютно все равно, кто начинает.
Если у тебя не хватает ума не отвечать на подобные вещи - это твои трудности
я предупредил.
Если ты с SQL знаком всего месяц - слушай что тебе говорят те, кто с ним знаком уже несколько лет, покури доки, чтобы разобраться и не меряйся своим самомнением с другими
перехали - ибо флейма больше чем разговоров по существу вопроса
-
ThE0ReTiC:
слушай что тебе говорят те, кто с ним знаком уже несколько лет, покури доки, чтобы разобраться и не меряйся своим самомнением с другими
Во первых, есть водилы, которые баранку всю жизнь крутят, и тем не менее, водят не чуть не лучше тех, кто только начинает. Зачастую, даже намного хуже. А во вторых, кроме унижения, я от RomikChef, ни чего не получил - ни одного совета или примера. Так к чему мне прислушиваться?? "Доки сходи покури"???? Я их и так постоянно покуриваю. Накурился уже. Мне нужны простые и понятные ответы, помощь, реальная помощь. Иначе, меня тут не было бы. А я, вместо помощи, по шее словил.
ThE0ReTiC:
мне абсолютно все равно, кто начинает.
но однако, ты только мне, только мне сделал замечание. И я знаю почему. Потому что, тот тип постоянный "клиент" на форуме. Он вам там рейтинг поднимает, банеры показывает и все это, постоянно. А я, вроде случайного прохожего - не имею ни каких прав и привилегий. Так вот у нас живется, в России.
Ладно, прощайте ребятня. Умаялся я с вами.
-
Nicki
потому что козлом в натуре он тебя не называл
тема закрыта