powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Select * vs Select id
10 сообщений из 60, страница 3 из 3
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
10 сообщений из 60, страница 3 из 3
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Select * vs Select id
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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