|
|
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Lumixа ведь никто из "советчиков" так и не смог сказать, что Код: sql 1. проигрывает Код: sql 1. в случае, если по полю a объявлен ключ (задан индекс), но становится таким же неэффективным как select * , если в запросе появляется поле, которого нет в индексе, например Код: sql 1. или Код: sql 1. Это типа идёт отсылка к покрывающим индексам. Но то, что ты написал, на самом деле не совсем так, всё немного сложнее. Ты очень вольно формулируешь условия задачи, а это всё важно. Нужно иметь структуру таблицы, индексов, и полностью сформулированный запрос. Именно поэтому я и не стал тебе про это всё рассказывать с самого начала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 13:15:26 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
авторТаблица никогда не загружается целиком в память. В смысле, это физически может происходить при большом кэше, но сервер никогда себе такую задачу не ставит, и -- главное -- в модели вычислений СУБД никогда не предполагается, что таблица находится в памяти. Наоборот, всегда должно предполагаться, что таблица находится на диске, и её придётся читать. позволю себе на сщгласиться с этим выводом проводя опыты с like %% в 5.7.9 видел занятие памяти в том (и даже большем) объёме, что и таблица, хотя поиск происходил с использоанием индеса, очем говорят и время поиска и план выполнения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 13:32:33 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
MasterZiv, изначально задан логический вопрос о запросах, без указания движка, зацеплен кэш запросов, затем быстрый переход к Иннодб, затем еще что-то, поэтому на сумбур - сумбур -----Исходники-то есть, да разобраться там можно далеко не вдруг... согласен, но столько писанины, давно бы уже голову туда засунуть или обратиться к первоисточнику только там истина топикстартер не понимает, что это все НЕЯВНО. В одном случае одно, в другом другое. Статью пишет что ли.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 13:46:15 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Alex_UstinovMasterZiv, изначально задан логический вопрос о запросах, без указания движка, зацеплен кэш запросов, затем быстрый переход к Иннодб, затем еще что-то, поэтому на сумбур - сумбур Да, согласен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2015, 17:11:34 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Lumix Код: sql 1. и для учебных целей мы заполняем её 1 млн. записей, где в каждое поле tit пишем 32 Кб текста. Затем выполняем два запроса на клиенте, но данные НЕ фетчим данные. Код: sql 1. 2. Насколько я понимаю, первый запрос грузит сервер существенно больше, чем второй. Вот я и хочу узнать ПРИНЦИПЫ что там примерно происходит, чтобы руководствуясь этими принципами можно было бы принимать более мудрые решения, когда звездочка погоды не делает, а когда замена звездочки на id может привести к сильной экономии. Например, у меня есть внутренне ощущение, что в данном примере объем записанного текста, хоть 1кб, хоть 32 кб, на запрос со звездочкой не влияют, но я не могу это объяснить. Бегло пробежал весь топик. А почему никто не спросил какая база? Это может зависеть от конкретной базы, и даже от конкретного режима! Например, в maria (и в mysql, насколько понимаю) с настройками по умолчанию не важно, фетчите вы данные или нет, вся таблица перегрузится вам в память, и будет создан ResultSet ее всю содержащий. Если данных много - будет OOM. А если сделать setFetchSize(Integer.MIN_VALUE), то драйвер переключается в режим row-by-row fetching, тогда по документации - будет фетчится по 1 колонке, реально - будет фетчиться некоторое небольшое кол-во колонок за раз, по всей видимости ограниченное некоторым размером(это видно по ваершарку). Это означает, что если в этом режиме просто сделать select *, но данные не фетчить, то mysql ничего никуда не закэширует (возможно только первую порцию) и не прочтет, потому что он тоже делает это в потоковом режиме, по мере запроса. Ну, по крайней мере, не должен. При этом какие-то подготовки с запросом будут сделаны, но там неособо много. Правда, пользы от такого селекта будет ноль. Другие базы могут вести себя как-то по другому, но совершенно точно, что если запрашивается все, то 32кб колонка будет загружена в память - и как минимум эту память отожрет. Возможно, вы не замечаете этого потому что у вас все работает на 1 машине, и винт быстрый, и все отрабатывает быстро. Ну так подключитесь клиентом по медленному вайфаю и выполните эти два селекта. (для чистоты эксперимента можно еще использовать SQL_NO_CACHE или его аналог) Запрошенные данные будут бежать по сети и разницу вы заметите очень легко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2015, 22:19:29 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
chabapokНапример, в maria (и в mysql, насколько понимаю) с настройками по умолчанию не важно, фетчите вы данные или нет, вся таблица перегрузится вам в память, и будет создан ResultSet ее всю содержащий. Если данных много - будет OOM. А если сделать setFetchSize(Integer.MIN_VALUE), то драйвер переключается в режим row-by-row fetching, тогда по документации - будет фетчится по 1 колонке,Вы, случаем, не описываете поведение PHP? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2015, 22:25:41 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
miksoft, Оу, это ветка по Mysql. Я че-то решил, что я в java. В таком случае, все вопрос "а какая база" - снимается. Это поведение жавовского коннектора. Наверное, в php и других все обстоит примерно так же, так что скорей всего это же и php. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2015, 23:28:33 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
chabapokБегло пробежал весь топик. А почему никто не спросил какая база? Это может зависеть от конкретной базы, и даже от конкретного режима! Да блин, потому что это может зависеть кроме этого ещё от моря всяческих тонкостей, и в итоге вообще бессмысленно о чём-то спрашивать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2015, 09:45:38 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
chabapokmiksoft, Оу, это ветка по Mysql. Я че-то решил, что я в java. В таком случае, все вопрос "а какая база" - снимается. Это поведение жавовского коннектора. Наверное, в php и других все обстоит примерно так же, так что скорей всего это же и php. Это не так даже с Java-коннектором, и даже в PHP, я уверен, всё не так. Не идиоты же его писали, чтобы весь набор в память засасывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2015, 09:47:27 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Я не говорил, что засовывается всегда весь набор в память. Я говорил, что есть 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 нужно когда надо обрабатывать на стороне клиента очень большие по возвращаемым данным селекты, в практике это встречается редко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2015, 14:03:04 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39097217&tid=1832506]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
26ms |
get tp. blocked users: |
1ms |
| others: | 185ms |
| total: | 269ms |

| 0 / 0 |
