За последние 24 часа нас посетил 22531 программист и 1046 роботов. Сейчас ищут 718 программистов ...

Лучше запрашивать все или не все?

Тема в разделе "MySQL", создана пользователем Diver, 26 июн 2006.

  1. Diver

    Diver Активный пользователь

    С нами с:
    19 фев 2006
    Сообщения:
    144
    Симпатии:
    0
    Адрес:
    Владивосток
    Вот есть таблица с юзерами. там 23 поля. стандартные поля типа имени, мейла, асику и т.д. как у всех.
    А мне надо взять оттуда некоторые, на сумму 18 (20) полей. Опять таки стандартные поля типа мейла, асику, кол-ва постов и т.д.
    Что лучше и быстрее и проще для железок. SELECT * FROM tbl WHERE user_id=... или SELECT user_email, user_icq и далее еще 20 пунктов.
    ?
    Какой запрос будет быстрее?
     
  2. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Diver

    задумываться над скоростью надо тогда когда тормозит. в твоем случае ты не заметишь разницы.
     
  3. Diver

    Diver Активный пользователь

    С нами с:
    19 фев 2006
    Сообщения:
    144
    Симпатии:
    0
    Адрес:
    Владивосток
    ну дай бох будет в будущем тормозить. ну а всетаки?
    судя по phpmyadmin, SELECT * идет 0.0003секи, а SELECT все но по отдельности идет 0.0015 секоф. Значит надо пологать что для базы легче выделить все, чем выделять что то отдельно. А вот для пхп что легче?
     
  4. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Тот в котором перечисленно мимнимальное количество полей для выборки из БД.

    Что тебе мешает сделать в цикле 20 000 запросов на insert
    А потом попробовать обоими способами.
     
  5. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Ему в большей степени пофигу. У тебя в 10 раз быстрее база упадет чем пхп (грубо говоря :)).
     
  6. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    я даже не задумываюсь над таким. как показывает практика тормоза идут совсем в других местах. например при множественных выборках.
     
  7. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Код (Text):
    1.  
    2. select a.*, b.*, c.* from t1 a, t2 b, t3 c where /*очень много всего*/
    спокойно представим в каждой таблице по 20 000 записей. И посмотрим стоит задумываться над такими вещами или нет.


    Diver, на мой взгляд в данном случае 440hz не прав. Правильно делаешь что задаешься вопросами сейчас, когда реализуешь всю логику и узнаешь что у тебя все тормозит из-за базы очень сильно пожалеешь что не задумался об оптимизации на стадии проектирования/начала работ.
     
  8. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    vb

    тормоза между * и a,b,c не тот случай когда нужно хлопотать. по крайне мере сейчас, а вот с проектированием - тут да. нужно очень подумать прежде чем все делать.
     
  9. Diver

    Diver Активный пользователь

    С нами с:
    19 фев 2006
    Сообщения:
    144
    Симпатии:
    0
    Адрес:
    Владивосток
    а если у меня 90% таких запросов. что их зря сохатить?
    далее.
    лучше делать один запрос в несколько таблиц (в 2-3)
    или 2-3 запроса отдельно?
     
  10. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Смотреть надо по ситуации - а именно на предполагаемые размеры таблиц и индексы полей. Если ты знаешь что таблицы t1, t2, t3 есть/будут большие - мое мнение - однозначно несколько запросов.

    например ты делаешь
    Код (Text):
    1.  
    2. FROM t1 LEFT JOIN t2 ON t2.id=t1.id
    Пусть записей в обоих таблицах по 20 000.
    В данном примере мы получаем - что прежде чем выдать результат mysql должен сделать пробег по 20 000 строк таблицы t1 и на каждой итерации определить среди 20 000 записей таблицы t2 соответствующую запись.
    Конечно при индексе полей связи все ускорится, но все равно ИМХО не супер.
    При таком раскладе я сделал бы два запроса, которые гарантировывали бы мне, что пробег по записям не превысит 40 000 итераций.
    А выбирать как я написал тремя постами выше,
    Код (Text):
    1.  
    2.  ... from t1, t2, t3
    это по-моему вообще застрел.

    С другой стороны, если ты знаешь что таблицы будут относительно не большими, то лучше использовать JOIN чем два маленьких запроса (главное не переборщи с WHERE - это касается любого запроса). Использование JOIN на относительно небольших таблицах приведет к тому что ты можешь очень сильно сэкономить время на обращении к серверу БД. На самом деле если ты обратишь внимание то на маленьких запросах - которые могут вообще ничего не значить и выполняться за 0.00000000001 секунды твой php потратит значительно большее время за счет того, что каждое обращение к какому либо серверу - это накладные расходы времени.

    Как определить относительно большая или маленькая таблица можно только путем тестов на том сервере на котором ты намерен использовать в будущем свои запросы.

    p.s. и еще, если ты делаешь 20 раз
    Код (Text):
    1.  
    2. SELECT z.id FROM t1 a LEFT JOIN t1 b ON b.parent=a.id LEFT JOIN t3 c ON c.parent=b.id /*.... и.т.д*/ LEFT JOIN z.parent=x.id WHERE a.id = 10
    то один такой запрос будет выполняться быстрее чем 20 маленьких....
    На самом деле почитай лучше вот тут,
    http://www.mysql.ru/docs/optimal.html
    http://www.mysql.ru/docs/man/MySQL_Optimisation.html
    все равно никто тебе в полной мере не сможет все объяснить на форуме.... а то получится все равно что изучение английского по телефону.