powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Select * vs Select id
60 сообщений из 60, показаны все 3 страниц
Select * vs Select id
    #39094753
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
select * from t;

vs
Код: sql
1.
select id from t;



Вопросы:
1) Если два эти запроса выполняются не для получения данных, а для подсчета выбранных строк, то что именно мы теряем, если средний размер ряда 20 Кб, а количество выборки 12 тыс. строк?
2) Памяти больше сжирается? Корректно ли утверждать, что первый запрос требует на 240 Мб больше, чем второй? Чую, что, скорее всего нет, но утверждать что-либо у меня нет оснований.
3) Есть ли у первого запроса из-за звездочки потеря в производительности и если да, то о каких % потерь в скорости идет речь: 5%, 20%, 50%, в 2, 5, 10 раз медленнее?
4) Какие вообще сжираются ресурсы сервером при выполнении select'а до получения самих данных?
...
Рейтинг: 0 / 0
Select * vs Select id
    #39094767
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix
Код: sql
1.
select * from t;


vs
Код: sql
1.
select id from t;




Вопросы:
1) Если два эти запроса выполняются не для получения данных, а для подсчета выбранных строк, то что именно мы теряемВероятно, мозг. Потому как для подсчёта количества строк рекомендуют использовать функцию count(), специально для этого предназначенную. СУБД по барабану, как будут использованы отданные им записи.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39094782
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle1) Если два эти запроса выполняются не для получения данных, а для подсчета выбранных строк, то что именно мы теряем

Вероятно, мозг. Потому как для подсчёта количества строк рекомендуют использовать функцию count(), специально для этого предназначенную. СУБД по барабану, как будут использованы отданные им записи.

Эта тема не про решение какой-то конкретной задачи из ежедневной практики на получение количества записей.
В практике все задачи уже решены.
Этот пример искусственно создан для иллюстрации.
Вопрос стоит в понимании принципов работы со звездочкой * по сравнению с фиксированным списком полей.

Условие про подсчет я сформулировал для того, чтобы изолироваться от стадии получения данных.
Подобная изоляция позволяет сравнить поведение запросов на логической, а не на "транспортной" стадии.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39094869
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixУсловие про подсчет я сформулировал для того, чтобы изолироваться от стадии получения данных.
Ну, может, ты хотел "изолироваться". Но сделал-то с точностью до наоборот.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39094971
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixВопрос стоит в понимании принципов работы со звездочкой * по сравнению с фиксированным списком полей.ИМХО конечно.
Звезда требует дополнительного обращения к описанию таблицы для получения списка имеющихся полей.
Далее, раз уж речь пошла о ресурсах. Так получается, что данные всей таблицы будут скопированы в кеш запросов (если он не отключен и вмещает данные) и в выходной буфер для отдачи клиенту. Больше данных - больше объём памяти и время копирования. При малых объёмах данных select id может и окажется эффективнее count(), но при десятках-сотнях мегабайт уже вряд ли.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39094985
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleЗвезда требует дополнительного обращения к описанию таблицы для получения списка имеющихся полей.Не "дополнительного". Это нужно для выполнения вообще любого запроса.
vkleПри малых объёмах данных select id может и окажется эффективнее count(), но при десятках-сотнях мегабайт уже вряд ли.про count() в исходном сообщении вообще ни слова не было :)
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095148
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот пример искусственно создан для иллюстрации.
Вопрос стоит в понимании принципов работы со звездочкой * по сравнению с фиксированным списком полей.


дурацкий пример.
ну ладно.
сама * ничего не дает ни в плюс ни в минус, дела в том, что, какие данные, реально выбираются, и какова структура таблицы.

возможна ситуация, когда разницы не будет вообще, возможна, когда будет. Но вот что я точно скажу, что большая дурость изучать СУБД по таким вот примерам -- получится как когда слепой щупает жопу слона, и говорит, что слон круглый и теплый.

подумай лучше сам, что СУБД должна сделать, чтобы выполнить оба запроса.


Условие про подсчет я сформулировал для того, чтобы изолироваться от стадии получения данных.



а невозможно изолировать выполнение запроса от стадии передачи данных клиенту.



Подобная изоляция позволяет сравнить поведение запросов на логической, а не на "транспортной" стадии.


нет, не позволит.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095181
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВопрос стоит в понимании принципов работы со звездочкой * по сравнению с фиксированным списком полей.
Использование звёздочки вместо списка полей сродни всем иным lamer-friendly наворотам, вроде "свойства по умолчанию" или "неявного приведения типов". А потому - не использовать никогда.

За, пожалуй, единственным исключением - COUNT(*). И то - только в случаях, когда польза от такого действа явно описана документацией.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095331
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял, что сформулировал задачу неудачно.
Делаю второй подход к формулированию.

Пусть есть таблица.

Код: sql
1.
create table a (id int, tit text);

и для учебных целей мы заполняем её 1 млн. записей, где в каждое поле tit пишем 32 Кб текста.
Затем выполняем два запроса на клиенте, но данные НЕ фетчим данные.

Код: sql
1.
2.
select * from t;
select id from t;


Насколько я понимаю, первый запрос грузит сервер существенно больше, чем второй.
Вот я и хочу узнать ПРИНЦИПЫ что там примерно происходит, чтобы руководствуясь этими принципами можно было бы принимать более мудрые решения, когда звездочка погоды не делает, а когда замена звездочки на id может привести к сильной экономии.
Например, у меня есть внутренне ощущение, что в данном примере объем записанного текста, хоть 1кб, хоть 32 кб, на запрос со звездочкой не влияют, но я не могу это объяснить.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095394
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixЗатем выполняем два запроса на клиенте, но данные НЕ фетчим данные.
На самом деле сначала всегда следует ответить на вопрос "Ну и зачем?"... сами по себе, без конечной цели, оба запроса одинаково бессмысленны.

LumixНасколько я понимаю, первый запрос грузит сервер существенно больше, чем второй.
Сфига бы? если ты полагаешь, что сервер, как полный идиот, тебе подготовит полную выборку, и будет ждать, пока ты соизволишь ему сказать "А теперь дай-ка мне, дружище, первую запись!" - то вот зряшно. Я скорее предположу, что он получит массив внутренних идентификаторов отобранных записей, подготовит ссылочную структуру отдаваемого набора - и на том успокоится.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095454
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixЯ понял, что сформулировал задачу неудачно.
Делаю второй подход к формулированию.

Пусть есть таблица.

Код: sql
1.
create table a (id int, tit text);

и для учебных целей мы заполняем её 1 млн. записей, где в каждое поле tit пишем 32 Кб текста.
Затем выполняем два запроса на клиенте, но данные НЕ фетчим данные.

Код: sql
1.
2.
select * from t;
select id from t;


Насколько я понимаю, первый запрос грузит сервер существенно больше, чем второй.



Нет. Оба выбирут примерно одну страницу данных из таблицы и успокоются, отдав её клиенту.

Поскольку клиент не будет больше данных требовать, на сервере ничего происходить не будет.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095709
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaMasterZivВопрос стоит в понимании принципов работы со звездочкой * по сравнению с фиксированным списком полей.
Использование звёздочки вместо списка полей сродни всем иным lamer-friendly наворотам, вроде "свойства по умолчанию" или "неявного приведения типов". А потому - не использовать никогда.

А то что случится ?

Вот я заметил что в vbulletin и прочем коробочном вебе так постоянно делают.
А разгадка одна - расширения. Пожалуй, в других проектах так не делают, но тут во главу угла поставлена простота модификации. Изначально в коде не известно какие именно расширение движка добавило поля в основные таблицы, поэтому они выбирают все возможные. Иначе что, делать по два запроса ? Городить наследование классов/всякие перегрузки crud/на-что-там-сейчас-еще-модно-тратить-бюджет ?
То есть, в общем случае я бы согласился с утверждением, но в частные случаи бывают весьма оригинальны.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095740
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwindА разгадка одна - расширения.
Это - особый, пусть и да, реально нередко встречающийся случай, когда клиентская часть вынуждена работать с данными нефиксированной структуры. То есть базовый софт не знает истинной структуры хранения данных, хотя может быть убеждён, что некая базовая часть, которая известна ему, присутствует в структуре гарантированно и без модификаций. Хотя мне кажется, что два запроса всё-таки лучше одного. Ещё лучше, если к тому же расширение формирует свои структуры хранения данных, связанные с базовыми необходимыми соотношениями. Ну просто хотя бы из потенции интерференции данных двух независимых расширений.

PS. Однако в рассматриваемом исходно вопросе подобный особый случай не закладывается в принципе. Да и не влияет на суть вопроса.
PPS. Впрочем, до конца исходный вопрос я всё ещё не понял...
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095757
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaХотя мне кажется, что два запроса всё-таки лучше одного
Так если там выбирается набор сущностей, то тогда уже N запросов по одной на каждую сущность . А это N - это очень много :)
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095764
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwindAkinaХотя мне кажется, что два запроса всё-таки лучше одного
Так если там выбирается набор сущностей, то тогда уже N запросов по одной на каждую сущность . А это N - это очень много :)"пусть икс равен эн... нет, эн маловато, пусть икс равен эм..."
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095805
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, вижу, что моя вторая попытка сформулировать задачу тоже провалилась... (((

MasterZivподумай лучше сам, что СУБД должна сделать, чтобы выполнить оба запроса.

Вопрос: Есть где-нибудь в интернете какая-нибудь статья или ещё лучше картинка (инфографика) где не профессорским, а более-менее простым языком перечисляются последовательности (примерный стратегический алгоритм) действий, которые происходят внутри сервера при выполнении обычного селекта? Или все, что там происходит настолько сложно, что больше похоже на русскую рулетку?

MasterZivа невозможно изолировать выполнение запроса от стадии передачи данных клиенту.
Вопрос: Неужели не существует никакой экономии от того, что клиент не стал фетчить данные с сервера, а только выполнив select * запрос, просто стал выполнять другие запросы? Неужели с точки зрения сервера не существует разницы, если select * выбрал 10 тыс. строк, но клиент сфетчил первые 50, а остальные 9950 фетчить не стал, а просто стал выполнять какие-то другие запросы? Я в этом смысле имел ввиду изоляцию стадии выборки и стадии транспорта...
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095845
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixНеужели с точки зрения сервера не существует разницы, если select * выбрал 10 тыс. строк, но клиент сфетчил первые 50, а остальные 9950 фетчить не стал, а просто стал выполнять какие-то другие запросы?C точки зрения сервера (сам он, правда, об этом не скажет) клиент - клинический идиот. Потому как мог бы добавить в запрос LIMIT 50 - тогда сервер выбрал бы нужные полсотни записей и немедленно бросил это дурацкое занятие. А так он вынужден держать в памяти весь этот хлам, который. оказывается, клиенту-то и вовсе нафиг не нужен.

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

Lumixпохоже на русскую рулетку?
Если рассуждать "вообще" - да, похоже. А если по конкретному поводу - то это уже русская рулетка с пистолетом Макарова.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095936
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по работе на java с mysql обнаружил такой факт если сделать запрос к базе и получит от неё данные, но не закрыть соединение, то таких не закрытых накапливается прилично, я не смог найти параметры в mysql которые бы сбрасывали такое . хотя по рекомендациям делал...
пришлось делать шедулер на ребут mysql.
в общем правило хорошего тона говорит о том, что после получения данных надо закрывать соединение..
ну а если запрос сделан и закрыт - то что не забрано с сервера, серверу пофиг, и он этот объём держит в кэше минимум времени...
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095949
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяпо работе на java с mysql обнаружил такой факт если сделать запрос к базе и получит от неё данные, но не закрыть соединение, то таких не закрытых накапливается прилично, я не смог найти параметры в mysql которые бы сбрасывали такоеПосмотрите параметр interactive_timeout, он указывает, через какое время закрывать спящие соединения. Только применять его следует аккуратно. Однако, думается, было бы более правильным на стороне клиента организовать пул подключений, чтобы использовать уже установленные коннекты.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39095969
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяну а если запрос сделан и закрыт - то что не забрано с сервера, серверу пофиг, и он этот объём держит в кэше минимум времени...

вот уже ближе к тому, что я пытаюсь понять
пара вопросов

1) каждый последующий селект чистит кеш предыдущего? или у сервера там что-то типа сборщика мусора используется - типа если не мешается, то не трогает, а так как приспичит, то чистит?

2) что именно складывается в кеш?

Код: sql
1.
2.
3.
4.
create table t (id int, a text, b text, c text);
select * from t;
select id from t;
select id from t where a like '%1%';



Допустим в первом селекте в кеш копируется вся таблица за исключением полей, которые хранятся по ссылкам типа varchar, тогда как char всегда хранится в таблице.

Допустим тогда во втором селекте в кеш копируется только таблица из id, то есть список интов.

Но неужели в третьем селекте в кеш копируется только список айдишников-интов? Если нет, то тогда список из интов и колонки а? А если так и у нас в каждой записи в колонке а хранится по 32 кб данных, то все эти 32 Кб кидаются в кеш? или может быть все таки в кеш кидается ссылка (то есть инт), а 32 кб достаются только в момент фетчинга записи??
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096321
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleвадяпо работе на java с mysql обнаружил такой факт если сделать запрос к базе и получит от неё данные, но не закрыть соединение, то таких не закрытых накапливается прилично, я не смог найти параметры в mysql которые бы сбрасывали такоеПосмотрите параметр interactive_timeout, он указывает, через какое время закрывать спящие соединения. Только применять его следует аккуратно. Однако, думается, было бы более правильным на стороне клиента организовать пул подключений, чтобы использовать уже установленные коннекты.
менял эти параметры, только создалось впечатление, что не спящее соединение... и поэтому эта переменная не оказывала влияние.
пул соединений здесь не подходит ..
автор1) каждый последующий селект чистит кеш предыдущего? или у сервера там что-то типа сборщика мусора используется - типа если не мешается, то не трогает, а так как приспичит, то чистит?

в кэше хранится сам запрос, или точнее его хеш, если новый запрос( вычисления его хеша) совпадает с уже имеющимся то данные берутся из кеша.
ну вот я боюсь предлагать тебе ссылку, вдруг опять будешь ругаться....
http://habrahabr.ru/post/41166/
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096502
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяну вот я боюсь предлагать тебе ссылку, вдруг опять будешь ругаться....
http://habrahabr.ru/post/41166/

статью прочитал
по моей теме со звездочкой она ничего не проясняет, к сожалению...

но очень полезная фишка там есть: любое изменение в таблице приводит к пересчету кеша, поэтому если часто селектятся какие-то данные, например, страница блога, то глупо в этой же самой таблице хранить счетчик просмотров этой страницы, потому что каждый инкремет обнуляет кеш и считывание кеша происходит заново - это реально очень полезная архитектурная подсказка!!

так же в статье упомянуто, что кешированные запросы стираются, когда для нового запроса не хватает размера отпущенного кеша, причем как мне подсказывает интуиция, наверное стирают по принципу FIFO, а это значит, что каждый последующий select не стирает кеш предыдущего селекта, пока размер памяти на кеш не исчерпан

неприятная новость в статье следующая: перед выполнением запроса сервер не знает о размере получившейся выборки... то есть не совсем понятно что происходит для запросов типа select * from t where id = 100500; Видимо как раз для таких случаев вы используете SQL_SMALL_RESULT типа как тут 18351614

итого:
1) из статьи я так и не понял в чем разница при работе с кешем для select * vs select id
2) не понял для select id from t where a like '%1%' && b like '%2%' в кеш достаются все поля таблицы, только id поля или id, a, b поля

Короче, Вадя, за эту статью скорее спасибо, нежели неспасибо. Сказать, что это прямо то, что я ищу не могу, но вот за фишку с разделением хранения часто доставаемых и часто меняемых данных в разных таблицах - ради этой фишки стоило потратить время на эту статью.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096547
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор1) из статьи я так и не понял в чем разница при работе с кешем для select * vs select id
ни в чем. исходной функцией для хеша является исходный текст запроса.
есть даже хотя бы один пробел не там поставит программист, то это посчитается за два разных запроса.
У select * конечно же меньше преимуществ в разрезе кеширования, потому что, в общем случае, данных в нем больше и они памяти больше занимают.

автор2) не понял для select id from t where a like '%1%' && b like '%2%' в кеш достаются все поля таблицы, только id поля или id, a, b поля
Достается и хранится весь результат как он есть. То есть, поле id.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096592
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwindУ select * конечно же меньше преимуществ в разрезе кеширования, потому что, в общем случае, данных в нем больше и они памяти больше занимают.

Насколько корректно просто сложить размеры полей:
все инты, варчары и тексты по 8 байт
+ все чаты по 1 байту на длину чара
и умножить на количество записей в таблице?

пример

Код: sql
1.
create table t (id int, tit char(6), t text, m varhchar(128), flag tinyint);



Вопрос: Если в таблице 8 тыс. записей, то сколько кеша запросов схавает запрос select * from t where id = 5;
Ответ: 8 + 6 + 8 + 8 + 1 * 8000 = 31 * 8000 = 248 Кб

Так верно или ошибочно?

автор2) не понял для select id from t where a like '%1%' && b like '%2%' в кеш достаются все поля таблицы, только id поля или id, a, b поля
Достается и хранится весь результат как он есть. То есть, поле id.[/quot]

Блин, опять запутался: в кеше хранятся данные, по которым производится выборка a like '' && b like '' или в кеше все-таки хранятся результаты выборки и если у нас where id = 5, в то кеше будет хранится вся таблица в которой искалось id = 5 или в кеше будет храниться только одна эта запись?

Ну и собственно мы опять вернулись в исходную точку:
когда поступает select * from t where id = 5, то сервер ведь не на винчестере ищет данные, а он сначала их с винчестера читает в память и уже в памяти их "перебирает" для выполнения запроса? и в вашей статье даже есть модификатор SQL_NO_CACHE, который принудительно заставляет эту переборку делать на диске, если изначально известно, что размер выборки огромен.

Так вот если производство выборки на диске задается директивой НО КЕШ, значит обычный ход обработки запроса - это КЕШ
или кеш в котором производится выборка данных и кеш запросов - это два разных типа кеша??
если да, то меня интересует не кеш, в котором хранятся уже выполненные результаты запросов, а кеш, в котором хранятся данные, из которых производится выборка
а ещё точнее меня интересует влияние на этот кеш звездочки в селекте
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096637
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там ещё много интересного в коментах

авторБлин, опять запутался: в кеше хранятся данные, по которым производится выборка a like '' && b like '' или в кеше все-таки хранятся результаты выборки и если у нас where id = 5, в то кеше будет хранится вся таблица в которой искалось id = 5 или в кеше будет храниться только одна эта запись?

только одна запись
для хранения первоначальных данных таблицы используется другая память(область)
в этой области хранится вся таблица...
вот эта переменная отвечает
innodb_buffer_pool_size = 512M
первый обращение запроса загружает таблицу в эту память, повторный - уже ищет в ней
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096642
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
остаётся вопрос что загружается - только то, что описано в select+ поля в where
или все данные
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096666
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяinnodb_buffer_pool_size = 512M
первый обращение запроса загружает таблицу в эту память, повторный - уже ищет в ней

вооот!
я сейчас пытаюсь выяснить что скрывается под тем, что вы называете загружает таблицу в эту память

ну и как я уже приводил есть 3 варианта как мне видится:
Код: sql
1.
2.
3.
4.
create table t (id int, a text, b text, c text);
select * from t;
select id from t;
select id from t where a like '%1%';



если по первому селекту понятно, что грузится вся таблица, то по второму и третьему - вопрос: вся или во втором случае только список (id), а втретьем только список (id, a)??

Причина этого вопроса в том, что если и во втором и третьем случае в этот пул будет грузиться ВСЯ таблица, тогда select * вообще ни в чем не проигрывает селектам с перечисленными полями!!!
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096746
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,

ну, так сказать, просто проверьте, что происходит на самом деле
создайте таблицу, как в вашем примере
до после запросов 2 и 3

смотрите
Show variables like %cache%;

оцените "дельту" Qcache_free_memory
почувствуйте разницу......
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096772
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторShow variables like %cache%;
только это не отобразит "входную память"
это скорее всего описывае процессы с "выходной памятью"
как распределяется в innodb_buffer_pool_size хз...
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096776
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov,

если быть точнее
Show STATUS like %Qcache%;
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096779
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,
установи dbForge, workBenche
там можно посмотреть переменные сервера с их назначением, правда очень кратким, но может сможешь их трактовать полностью...
как бы такого описания я не встречал
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096794
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот как пример
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096902
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovну, так сказать, просто проверьте, что происходит на самом деле
создайте таблицу, как в вашем примере
до после запросов 2 и 3

смотрите
Show variables like %cache%;

оцените "дельту" Qcache_free_memory
почувствуйте разницу......

Ну и какой мне смысл чувствовать разницу?
Разница - это все рано что температуру мерить у пациента.
Ну понятно, что у одного температура 37 у другого 39 и что дальше?
То, что вы мне предлагаете - это не метод исследования, а игра в поле чудес.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096956
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix, вас остается только исходники читать оправлять. Все ж прозрачно и понятно.
Ну попробуйте вместо Хабра купить на торентах книжку High Performance MySQL
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096958
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,

вы постоянно уводите обсуждение в сторону
этак мне не так а это не эдак.
Много вопросов, мало дела. Пора уже переходить.
От себя могу лишь добавить что мин.блок по-моему 8 байт, так что на запросе с LIMIT 1 никакой разницы не увидите. Берите сразу поглобальней. Длину записи (или полей) подсчитаете. Разделите, проанализируете
Ну и еще - обсуждаемые варианты по-моему далеки от истины.

------ Ну понятно, что у одного температура 37 у другого 39 и что дальше?
Это значит что у одного просто ОРЗ а у другого какой-то вирус, 39 это температура зараженного организма.
Одни просто меряют температуру, другие меряют со смыслом и ставят диагноз, т.е. анализируют

----- То, что вы мне предлагаете - это не метод исследования, а игра в поле чудес.
... игрой в поле чудес занимаетесь вы...., кэш запросов даже по дефолту отключен, скачайте любой дистр-тив MySQL
и посмотрите SHOW VARIABLES LIKE "query_cache_size" он равен 0
и просто его не включайте,
будет все предсказуемо и просто.
... да будет вам известно, что существует даже метод исследования - "метод научного тыка", ткул в точку и попал.
Я же вам предложил чисто практическое исследование, а не вычитывание каких то статеек.
Это суть исследования - практика. Говорю вам как прикладник а не теоретик по профессии.
От вычитывания статей (не от создателя) вы заимеете лишь чье-то субъективное мнение (конечно оно может быть и объективным)
Посмотрел на топики с вашим участием, вы оказывается спец в С/С++.
Исходники на офф.сайте лежат в свободном доступе.
Или же для получения исчерпывающего ответа лучше обратиться на сайт Видениуса Монти, я думаю вам ответят.
На Percone тоже очень общительные люди.
PS. Вопросы внутренней механики слишком узко направлены, тем более когда эта механика практически не используется.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096960
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov,

очепятка
.......От себя могу лишь добавить что мин.блок по-моему 1кбайт ,
...
Рейтинг: 0 / 0
Select * vs Select id
    #39096964
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixТак вот если производство выборки на диске задается директивой НО КЕШ, значит обычный ход обработки запроса - это КЕШ
или кеш в котором производится выборка данных и кеш запросов - это два разных типа кеша??

Два разных.
Но один как раз традиционно кешем результатов называют, а второй - пул. innodb memory pool.

если да, то меня интересует не кеш, в котором хранятся уже выполненные результаты запросов, а кеш, в котором хранятся данные, из которых производится выборка
а ещё точнее меня интересует влияние на этот кеш звездочки в селекте
Тут уже посложнее :
Пул innodb оперирует страницами. Страницы - это плотно уложенные данные или связанные блоки дерева индексов. Различий в механизме кеширования между страницами в зависимости от типа нет. В каждой странице индекса хранятся идентификаторы primary key и по нему уже достаются остальные поля в записи.

Так что для innodb select id, где id есть primary key, всегда существенно выгоднее select * .
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097098
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwindLumix, вас остается только исходники читать оправлять. Все ж прозрачно и понятно.

Нее, сорсы читать не буду.
Игра не стоит свеч.

netwindНу попробуйте вместо Хабра купить на торентах книжку High Performance MySQL

Только что по вашей рекомендации прочитал эту книжку
На торренты даже идти не пришлось, лежит в инете открытой ссылкой
http://moemesto.ru/kristy/file/9626805/OReIlly.High.Performance.MySQL.pdf

вот что я смог взять оттуда полезного, но прямого ответа на свой вопрос я так и не нашел, только косвенные намеки

стр. 81. Избегайте NULL как только возможно
стр. 85. Char всегда обрезает пробелы с обоих концов строки
стр. 87. Text и Blob требуют от 1 до 4 байт для хранения каждой колонки
стр. 87. Никогда не сортируйте по полю с типом Text или Blob
стр. 124. Индексы используются как для поиска, так и для сортировки
стр. 153. Относитесь с подозрением ко всем select *
стр. 154. но select * имеет смысл, если смотреть с точки зрения кодинга по обслуживанию софта
стр. 157. мускул тянет 50К запросов / сек локально и 2К запросов / сек по гигабитной сетке

стр. 159. декомпозиция джоинов на отдельные селекты с клиента дает существенную экономию в хайлоаде

стр. 169. в мускуле in() умный, то есть в других базах in() является аналогом OR и поэтому алгоритмическая сложность линейная, то у мускульного in() за счет сортировки алогоритмическая сложность логарифмическая

стр. 178. Вот в этом параграфе Query Execution Engine должна была располагаться инфа, которую я ищу, но там лишь вода... (((

стр. 299. Для InnoDB опасно хранить данные, если ряд превышает 8 Кб, потому что будет создаваться дополнительная 16КБ пага и она все время будет подтягиваться в пул, как только двигателю понадобится эта запись

стр. 300. На чтение колонок влияет не select *, а where, то есть условия выборки и если запись понадобится, то в пул будут считываться все паги этой записи

стр. 300. Если в записи слишком много больших колонок, то лучше объединить их в одну, иначе на каждую колонку будет создаваться отдельная innodb пага по 16 кб

стр. 313. Если InnoDB потребуется запись, то она будет читать с диска в пул все 16 кб, вне зависимости от select *, причем даже если вес записи 6 интов, то есть 24 байта, все равно будет читать 16 кб

стр. 577. Buffer pool hit rate - соотношение - какой % данных достается из пула, а не из диска

ещё не записал на какой странице, но прочитал там такое: паги читаются в пул по некому хитрому алгоритму, что наиболее частые паги умирают позже всех и таким образом, повышается вероятность, что некая запись, которая требуется для выполнения запроса будет в скорее пуле, а не на диске

но применительно к обсуждаемой теме, если пага записи уже в пуле, то нет никакой разницы select id или select * - все равно в паге хранится вся запись

*

просмотрел доку, тоже нет ответа

https://dev.mysql.com/doc/refman/5.5/en/estimating-performance.html
https://dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html
https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-diskio.html
https://dev.mysql.com/doc/internals/en/innodb-page-structure.html

*

Таким образом из книжки понял следующее: единственный перегрев от select * может быть в хранении лишних данных в кеше запросов, тогда как кеш данных (пул) все равно хранит данными пагами по 16 кб и на его нагрузку влияет не select *, а сколько записей потребуется перебрать, чтобы выполнить запрос

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

кеш данных (пул) убивают запросы, выполнение которых требует перебора сразу большого количества данных, то есть запросы без условий и лимитов, а select * тут вообще ни при чем


Alex_Ustinovвы постоянно уводите обсуждение в сторону
этак мне не так а это не эдак.

мой интерес в этой теме довольно узок - понять принципы как влияет список полей в селекте по сравнению с select *

вы предлагаете выполнять запросы и смотреть на состояние статусных параметров кеша запросов, то есть кеша готовых результатов.

я считаю, что измерение результатов запроса никоим образом не прольет свет на понимание принципов влияния списка полей в селекте по сравнению с select *.

поэтому я ваше предложение игнорирую
никакого увода в сторону тут нет и в помине
игнор и увод в сторону - разные вещи!
я просто не иду слепо у вас на поводу, а подхожу к поступающим предложениям вдумчиво, избирательно, критически

Alex_UstinovПосмотрел на топики с вашим участием, вы оказывается спец в С/С++.
Исходники на офф.сайте лежат в свободном доступе.

Я не буду копаться в сорсах ради получения ответа на этот вопрос.

Alex_UstinovPS. Вопросы внутренней механики слишком узко направлены, тем более когда эта механика практически не используется.
Меня не интересует механика, меня интересует принцип.

netwindТак что для innodb select id, где id есть primary key, всегда существенно выгоднее select * .

не пойму эту фразу, потому исходя из философии хранения innodb select * уже всегда содержит в себе primary key...

Исходя из книги, которую я прочитал по вашей рекомендации я понял, что вне зависимости от перечисления полей, если движку для обработки запроса понадобится 1000 каких-то записей, то он потянет в пул все страницы этих записей ВНЕ зависимости от select * это или select id

т.о. опасность представляет только превышение одной записи размера 8 кб, потому что в этом случае создается вторая пага 16 КБ для этой же записи, но это надо очень сильно постараться, чтобы запись стала 8 кб, потому что все тяжелое является блобом или текстом, а они по факту являются интом, а тела свои хранят отдельно

значит, если в условиях селектов производится выборка только по полям, которые не хранятся за пределами таблицы, то никакого ущерба select * по сравнению с select id не наносит и единственный минус, который в этом может быть - это нагрузка на кеш запросов, а минус этот состоит в том, что в нем поместится меньше запросов, то есть при бОльших объемах данных, будут чаще удаляться более ранние запросы
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097115
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixТолько что по вашей рекомендации прочитал эту книжку

Ну тогда вопросов и быть не должно. Можно больше ничего не обсуждать :)


netwindТак что для innodb select id, где id есть primary key, всегда существенно выгоднее select * .

не пойму эту фразу, потому исходя из философии хранения innodb select * уже всегда содержит в себе primary key...

Исходя из книги, которую я прочитал по вашей рекомендации я понял, что вне зависимости от перечисления полей, если движку для обработки запроса понадобится 1000 каких-то записей, то он потянет в пул все страницы этих записей ВНЕ зависимости от select * это или select id


А вот и нет. Упускаете как именно происходит считывание страниц. Желательно таки дочитать книжку, чтобы понимать как это работает все вместе. Как минимум первых 5 глав.
Допустим, в общем случае программист стремится писать оба этих запроса достаточно "хорошими" так, что запросы выбирают нужные строки по индексу, а не последовательным чтением страниц данных.
Очевидно, для запросов типа select id_primary ..., select key_value ... where key_value= достаточно считать только некоторые страницы содержащие этот индекс, а primary key или значения столбцов из индекса там уже будут в этих же страницах.
А в случае с select * нужно считать по ссылке дополнительные страницы содержащие остальные поля записи.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097118
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторя считаю, что измерение результатов запроса никоим образом не прольет свет на понимание принципов влияния списка полей в селекте по сравнению с select *.
Так то поведение innodb в разных случаях можно измерить и сравнить.
Одна беда - там счетчики глобальные. Нужно запускать в исключительно однопоточном окружении на сервере разработчика.
Вот я более конкретно предлагаю вам сравнивать вывод show global status like '%Innodb_buffer_pool_read_requests%'; - это логические запросы чтения.
Если не подтвердится - тогда уже будем думать почему.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097121
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwindУпускаете как именно происходит считывание страниц. Желательно таки дочитать книжку, чтобы понимать как это работает все вместе. Как минимум первых 5 глав.

ну вот собственно вот так и разводят всех новичков на форумах...
и меня тоже много лет так разводили в начале моего профессионального пути...

вы видимо не совсем понимаете, что только что дали рекомендацию перечитать 264 страницы А4 сложнейшего текста на английском языке ради того, что на самом деле уместилось в три строчки ответа на русском языке...

ведь это так приятно с умным сказать: ИДИ ЧИТАЙ!!
http://moemesto.ru/kristy/file/9626805/OReIlly.High.Performance.MySQL.pdf

netwindОчевидно, для запросов типа select id_primary ..., select key_value ... where key_value= достаточно считать только некоторые страницы содержащие этот индекс, а primary key или значения столбцов из индекса там уже будут в этих же страницах.
А в случае с select * нужно считать по ссылке дополнительные страницы содержащие остальные поля записи.

а ведь никто из "советчиков" так и не смог сказать, что

select * from t where a like 'some'
проигрывает
select id from t where a like 'some'
в случае, если по полю a объявлен ключ (задан индекс),
но становится таким же неэффективным как
select * , если в запросе появляется поле, которого нет в индексе,
например
select id, b from t where a like 'some'
или select id from t where a like 'some' && b like 'some'
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097122
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix, ну по вопросам и рассуждениям видно, что вам не хватает понимания механизмов. Я ответил на самое конкретное и в изолированных условиях без обсуждения query cache, а у вас в начале и по ходу другие общие вопросы возникают постоянно.
Книжка на русском уж явно будет проще чем исходники.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097125
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора ведь никто из "советчиков" так и не смог сказать, что

select * from t where a like 'some'
проигрывает
select id from t where a like 'some'
в случае, если по полю a объявлен ключ (задан индекс),
но становится таким же неэффективным как
select *, если в запросе появляется поле, которого нет в индексе,
например
select id, b from t where a like 'some'
или select id from t where a like 'some' && b like 'some'вы написали масло масленное, это неявные примеры. и уже пять раз описанные
a LIKE 'some' (читаю как вы написали т.е. a = 'some') пратически отработает одинаково быстро "если по полю a объявлен ключ (задан индекс)",
если вы имеете ввиду %some% не сначала строки - все будет одинаково "тухло", так как основной "гвоздь" - это поиск по LIKE %%

последний пара примеров вообще не сравнима.
SELECT * всегда проиграет SELECT id на "транспортных расходах" это вам уже объясняли
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097131
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторесли вы имеете ввиду %some% не сначала строки - все будет одинаково "тухло", так как основной "гвоздь" - это поиск по LIKE %%
позволю себе поправить - сейчас это не тухло , это уже использует индекс :)
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097192
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эта тема не про решение какой-то конкретной задачи из ежедневной практики на получение количества записей.
В практике все задачи уже решены.
Этот пример искусственно создан для иллюстрации.
Вопрос стоит в понимании принципов работы со звездочкой * по сравнению с фиксированным списком полей.

Условие про подсчет я сформулировал для того, чтобы изолироваться от стадии получения данных.
Подобная изоляция позволяет сравнить поведение запросов на логической
, а не на "транспортной" стадии.даже если не учитывать транспорт, а только логику механики то парсеру лучше знать конкретноый список полей какой вы желаете получить, поэтому
SELECT * хуже SELECT id
есть разница
ЗАЛИТЬ в бак топливо
ЗАДИТЬ в бак АИ-95 бензин
почувствуйте...
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097198
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix Вопрос: Есть где-нибудь в интернете какая-нибудь статья или ещё лучше картинка (инфографика) где не профессорским, а более-менее простым языком перечисляются последовательности (примерный стратегический алгоритм) действий, которые происходят внутри сервера при выполнении обычного селекта?


Примерно так:
--посылка запроса.
--парсинг (синтаксический разбор) запроса.
--Разрешение имён и построение структуры запроса во внутренних структурах СУБД.
--проверка прав
--оптимизация запроса, построение плана его выполнения.
--(6)выполнение шагов плана и формирование частичного результата с помещением его в буфер сетевого обмена для отсылки клиенту.
--(7)отсылка клиенту буфера, очистка буфера.
-- итеративное повторение шагов (6) и (7) до получения всех результатов.


MasterZivа невозможно изолировать выполнение запроса от стадии передачи данных клиенту.
Вопрос: Неужели не существует никакой экономии от того, что клиент не стал фетчить данные с сервера, а только выполнив select * запрос, просто стал выполнять другие запросы? Неужели с точки зрения сервера не существует разницы, если select * выбрал 10 тыс. строк, но клиент сфетчил первые 50, а остальные 9950 фетчить не стал, а просто стал выполнять какие-то другие запросы? Я в этом смысле имел ввиду изоляцию стадии выборки и стадии транспорта...[/quot]

Экономия существует. Я не говорил, что она не существует. Я говорил, что эти два процесса невозможно изолировать.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097199
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixвадяну вот я боюсь предлагать тебе ссылку, вдруг опять будешь ругаться....
http://habrahabr.ru/post/41166/

статью прочитал


Зря прочитал, к обсуждаемой теме она не имеет ни малейшего отношения.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097202
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixвадяinnodb_buffer_pool_size = 512M
первый обращение запроса загружает таблицу в эту память, повторный - уже ищет в ней

вооот!
я сейчас пытаюсь выяснить что скрывается под тем, что вы называете загружает таблицу в эту память



Таблица никогда не загружается целиком в память .
В смысле, это физически может происходить при большом кэше, но сервер никогда себе такую задачу не ставит, и
-- главное -- в модели вычислений СУБД никогда не предполагается, что таблица находится в памяти.
Наоборот, всегда должно предполагаться, что таблица находится на диске, и её придётся читать.


авторПричина этого вопроса в том, что если и во втором и третьем случае в этот пул будет грузиться ВСЯ таблица, тогда select * вообще ни в чем не проигрывает селектам с перечисленными полями!!!

Я же писал, что SELECT * и SELECT все поля через запятую -- это вообще одно и то же.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097203
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_UstinovLumix,

ну, так сказать, просто проверьте, что происходит на самом деле
создайте таблицу, как в вашем примере
до после запросов 2 и 3

смотрите
Show variables like %cache%;

оцените "дельту" Qcache_free_memory
почувствуйте разницу......


Да чё ты ему всё про query cache задвигаешь ?
это вообще к делу не относится, кроме того, эту хрень нужно раз и навсегда вырубить при установке сервера
и никогда ни в коем случае не включать.
Только память зазря расходует.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097205
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_UstinovПосмотрел на топики с вашим участием, вы оказывается спец в С/С++.
Исходники на офф.сайте лежат в свободном доступе.


Исходники-то есть, да разобраться там можно далеко не вдруг...
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097208
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixа ведь никто из "советчиков" так и не смог сказать, что

Код: sql
1.
select * from t where a like 'some'



проигрывает

Код: sql
1.
select id from t where a like 'some'



в случае, если по полю a объявлен ключ (задан индекс),
но становится таким же неэффективным как

select * , если в запросе появляется поле, которого нет в индексе,
например

Код: sql
1.
select id, b from t where a like 'some'



или
Код: sql
1.
select id from t where a like 'some' && b like 'some'






Это типа идёт отсылка к покрывающим индексам.
Но то, что ты написал, на самом деле не совсем так, всё немного сложнее. Ты очень вольно формулируешь условия задачи, а это всё важно. Нужно иметь структуру таблицы, индексов, и полностью сформулированный запрос.
Именно поэтому я и не стал тебе про это всё рассказывать с самого начала.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097217
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТаблица никогда не загружается целиком в память.
В смысле, это физически может происходить при большом кэше, но сервер никогда себе такую задачу не ставит, и
-- главное -- в модели вычислений СУБД никогда не предполагается, что таблица находится в памяти.
Наоборот, всегда должно предполагаться, что таблица находится на диске, и её придётся читать.
позволю себе на сщгласиться с этим выводом
проводя опыты с like %% в 5.7.9 видел занятие памяти в том (и даже большем) объёме, что и таблица, хотя поиск происходил с использоанием индеса, очем говорят и время поиска и план выполнения
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097226
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

изначально задан логический вопрос о запросах, без указания движка, зацеплен кэш запросов, затем быстрый переход к Иннодб, затем еще что-то, поэтому на сумбур - сумбур
-----Исходники-то есть, да разобраться там можно далеко не вдруг...
согласен, но столько писанины, давно бы уже голову туда засунуть или обратиться к первоисточнику
только там истина
топикстартер не понимает, что это все НЕЯВНО. В одном случае одно, в другом другое. Статью пишет что ли....
...
Рейтинг: 0 / 0
Select * vs Select id
    #39097665
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_UstinovMasterZiv,

изначально задан логический вопрос о запросах, без указания движка, зацеплен кэш запросов, затем быстрый переход к Иннодб, затем еще что-то, поэтому на сумбур - сумбур



Да, согласен.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39101204
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix
Код: sql
1.
create table a (id int, tit text);

и для учебных целей мы заполняем её 1 млн. записей, где в каждое поле tit пишем 32 Кб текста.
Затем выполняем два запроса на клиенте, но данные НЕ фетчим данные.

Код: sql
1.
2.
select * from t;
select id from t;


Насколько я понимаю, первый запрос грузит сервер существенно больше, чем второй.
Вот я и хочу узнать ПРИНЦИПЫ что там примерно происходит, чтобы руководствуясь этими принципами можно было бы принимать более мудрые решения, когда звездочка погоды не делает, а когда замена звездочки на id может привести к сильной экономии.
Например, у меня есть внутренне ощущение, что в данном примере объем записанного текста, хоть 1кб, хоть 32 кб, на запрос со звездочкой не влияют, но я не могу это объяснить.

Бегло пробежал весь топик. А почему никто не спросил какая база? Это может зависеть от конкретной базы, и даже от конкретного режима!
Например, в maria (и в mysql, насколько понимаю) с настройками по умолчанию не важно, фетчите вы данные или нет, вся таблица перегрузится вам в память, и будет создан ResultSet ее всю содержащий. Если данных много - будет OOM. А если сделать setFetchSize(Integer.MIN_VALUE), то драйвер переключается в режим row-by-row fetching, тогда по документации - будет фетчится по 1 колонке, реально - будет фетчиться некоторое небольшое кол-во колонок за раз, по всей видимости ограниченное некоторым размером(это видно по ваершарку). Это означает, что если в этом режиме просто сделать select *, но данные не фетчить, то mysql ничего никуда не закэширует (возможно только первую порцию) и не прочтет, потому что он тоже делает это в потоковом режиме, по мере запроса. Ну, по крайней мере, не должен. При этом какие-то подготовки с запросом будут сделаны, но там неособо много. Правда, пользы от такого селекта будет ноль.

Другие базы могут вести себя как-то по другому, но совершенно точно, что если запрашивается все, то 32кб колонка будет загружена в память - и как минимум эту память отожрет. Возможно, вы не замечаете этого потому что у вас все работает на 1 машине, и винт быстрый, и все отрабатывает быстро. Ну так подключитесь клиентом по медленному вайфаю и выполните эти два селекта. (для чистоты эксперимента можно еще использовать SQL_NO_CACHE или его аналог) Запрошенные данные будут бежать по сети и разницу вы заметите очень легко.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39101210
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokНапример, в maria (и в mysql, насколько понимаю) с настройками по умолчанию не важно, фетчите вы данные или нет, вся таблица перегрузится вам в память, и будет создан ResultSet ее всю содержащий. Если данных много - будет OOM. А если сделать setFetchSize(Integer.MIN_VALUE), то драйвер переключается в режим row-by-row fetching, тогда по документации - будет фетчится по 1 колонке,Вы, случаем, не описываете поведение PHP?
...
Рейтинг: 0 / 0
Select * vs Select id
    #39101257
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Оу, это ветка по Mysql. Я че-то решил, что я в java. В таком случае, все вопрос "а какая база" - снимается.
Это поведение жавовского коннектора. Наверное, в php и других все обстоит примерно так же, так что скорей всего это же и php.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39101432
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokБегло пробежал весь топик. А почему никто не спросил какая база? Это может зависеть от конкретной базы, и даже от конкретного режима!

Да блин, потому что это может зависеть кроме этого ещё от моря всяческих тонкостей, и в итоге вообще бессмысленно о чём-то спрашивать...
...
Рейтинг: 0 / 0
Select * vs Select id
    #39101434
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokmiksoft,

Оу, это ветка по Mysql. Я че-то решил, что я в java. В таком случае, все вопрос "а какая база" - снимается.
Это поведение жавовского коннектора. Наверное, в php и других все обстоит примерно так же, так что скорей всего это же и php.

Это не так даже с Java-коннектором, и даже в PHP, я уверен, всё не так.
Не идиоты же его писали, чтобы весь набор в память засасывать.
...
Рейтинг: 0 / 0
Select * vs Select id
    #39101824
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не говорил, что засовывается всегда весь набор в память. Я говорил, что есть 2 режима, и тот что стоит в Java-коннекторе по умолчанию, засовывает весь набор в память.

MasterZivЭто не так даже с Java-коннектором, и даже в PHP, я уверен, всё не так.
читайте документацию http://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html

By default, ResultSets are completely retrieved and stored in memory. In most cases this is the most efficient way to operate and, due to the design of the MySQL network protocol, is easier to implement. If you are working with ResultSets that have a large number of rows or large values and cannot allocate heap space in your JVM for the memory required, you can tell the driver to stream the results back one row at a time.

To enable this functionality, create a Statement instance in the following manner:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

The combination of a forward-only, read-only result set, with a fetch size of Integer.MIN_VALUE serves as a signal to the driver to stream result sets row-by-row. After this, any result sets created with the statement will be retrieved row-by-row.



MasterZivНе идиоты же его писали, чтобы весь набор в память засасывать.

Такими категориями мыслить не следует. Обоснование того или иного решения гораздо более многогранно, каждое решение имеет свои недостатки и свои достоинства. Например, при таком подходе меньше данных бегает по сети. Меньше зависимость от сети, один раз стянул все - и пользуешься. Таким образом, row-by-row нужно когда надо обрабатывать на стороне клиента очень большие по возвращаемым данным селекты, в практике это встречается редко.
...
Рейтинг: 0 / 0
60 сообщений из 60, показаны все 3 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Select * vs Select id
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]