|
|
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. vs Код: sql 1. Вопросы: 1) Если два эти запроса выполняются не для получения данных, а для подсчета выбранных строк, то что именно мы теряем, если средний размер ряда 20 Кб, а количество выборки 12 тыс. строк? 2) Памяти больше сжирается? Корректно ли утверждать, что первый запрос требует на 240 Мб больше, чем второй? Чую, что, скорее всего нет, но утверждать что-либо у меня нет оснований. 3) Есть ли у первого запроса из-за звездочки потеря в производительности и если да, то о каких % потерь в скорости идет речь: 5%, 20%, 50%, в 2, 5, 10 раз медленнее? 4) Какие вообще сжираются ресурсы сервером при выполнении select'а до получения самих данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 00:20:20 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Lumix Код: sql 1. vs Код: sql 1. Вопросы: 1) Если два эти запроса выполняются не для получения данных, а для подсчета выбранных строк, то что именно мы теряемВероятно, мозг. Потому как для подсчёта количества строк рекомендуют использовать функцию count(), специально для этого предназначенную. СУБД по барабану, как будут использованы отданные им записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 01:18:21 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
vkle1) Если два эти запроса выполняются не для получения данных, а для подсчета выбранных строк, то что именно мы теряем Вероятно, мозг. Потому как для подсчёта количества строк рекомендуют использовать функцию count(), специально для этого предназначенную. СУБД по барабану, как будут использованы отданные им записи. Эта тема не про решение какой-то конкретной задачи из ежедневной практики на получение количества записей. В практике все задачи уже решены. Этот пример искусственно создан для иллюстрации. Вопрос стоит в понимании принципов работы со звездочкой * по сравнению с фиксированным списком полей. Условие про подсчет я сформулировал для того, чтобы изолироваться от стадии получения данных. Подобная изоляция позволяет сравнить поведение запросов на логической, а не на "транспортной" стадии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 02:50:32 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
LumixУсловие про подсчет я сформулировал для того, чтобы изолироваться от стадии получения данных. Ну, может, ты хотел "изолироваться". Но сделал-то с точностью до наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 08:58:28 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
LumixВопрос стоит в понимании принципов работы со звездочкой * по сравнению с фиксированным списком полей.ИМХО конечно. Звезда требует дополнительного обращения к описанию таблицы для получения списка имеющихся полей. Далее, раз уж речь пошла о ресурсах. Так получается, что данные всей таблицы будут скопированы в кеш запросов (если он не отключен и вмещает данные) и в выходной буфер для отдачи клиенту. Больше данных - больше объём памяти и время копирования. При малых объёмах данных select id может и окажется эффективнее count(), но при десятках-сотнях мегабайт уже вряд ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 10:34:26 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
vkleЗвезда требует дополнительного обращения к описанию таблицы для получения списка имеющихся полей.Не "дополнительного". Это нужно для выполнения вообще любого запроса. vkleПри малых объёмах данных select id может и окажется эффективнее count(), но при десятках-сотнях мегабайт уже вряд ли.про count() в исходном сообщении вообще ни слова не было :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 10:42:26 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Этот пример искусственно создан для иллюстрации. Вопрос стоит в понимании принципов работы со звездочкой * по сравнению с фиксированным списком полей. дурацкий пример. ну ладно. сама * ничего не дает ни в плюс ни в минус, дела в том, что, какие данные, реально выбираются, и какова структура таблицы. возможна ситуация, когда разницы не будет вообще, возможна, когда будет. Но вот что я точно скажу, что большая дурость изучать СУБД по таким вот примерам -- получится как когда слепой щупает жопу слона, и говорит, что слон круглый и теплый. подумай лучше сам, что СУБД должна сделать, чтобы выполнить оба запроса. Условие про подсчет я сформулировал для того, чтобы изолироваться от стадии получения данных. а невозможно изолировать выполнение запроса от стадии передачи данных клиенту. Подобная изоляция позволяет сравнить поведение запросов на логической, а не на "транспортной" стадии. нет, не позволит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 12:25:23 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
MasterZivВопрос стоит в понимании принципов работы со звездочкой * по сравнению с фиксированным списком полей. Использование звёздочки вместо списка полей сродни всем иным lamer-friendly наворотам, вроде "свойства по умолчанию" или "неявного приведения типов". А потому - не использовать никогда. За, пожалуй, единственным исключением - COUNT(*). И то - только в случаях, когда польза от такого действа явно описана документацией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 12:43:03 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Я понял, что сформулировал задачу неудачно. Делаю второй подход к формулированию. Пусть есть таблица. Код: sql 1. и для учебных целей мы заполняем её 1 млн. записей, где в каждое поле tit пишем 32 Кб текста. Затем выполняем два запроса на клиенте, но данные НЕ фетчим данные. Код: sql 1. 2. Насколько я понимаю, первый запрос грузит сервер существенно больше, чем второй. Вот я и хочу узнать ПРИНЦИПЫ что там примерно происходит, чтобы руководствуясь этими принципами можно было бы принимать более мудрые решения, когда звездочка погоды не делает, а когда замена звездочки на id может привести к сильной экономии. Например, у меня есть внутренне ощущение, что в данном примере объем записанного текста, хоть 1кб, хоть 32 кб, на запрос со звездочкой не влияют, но я не могу это объяснить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 14:20:46 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
LumixЗатем выполняем два запроса на клиенте, но данные НЕ фетчим данные. На самом деле сначала всегда следует ответить на вопрос "Ну и зачем?"... сами по себе, без конечной цели, оба запроса одинаково бессмысленны. LumixНасколько я понимаю, первый запрос грузит сервер существенно больше, чем второй. Сфига бы? если ты полагаешь, что сервер, как полный идиот, тебе подготовит полную выборку, и будет ждать, пока ты соизволишь ему сказать "А теперь дай-ка мне, дружище, первую запись!" - то вот зряшно. Я скорее предположу, что он получит массив внутренних идентификаторов отобранных записей, подготовит ссылочную структуру отдаваемого набора - и на том успокоится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 14:51:54 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
LumixЯ понял, что сформулировал задачу неудачно. Делаю второй подход к формулированию. Пусть есть таблица. Код: sql 1. и для учебных целей мы заполняем её 1 млн. записей, где в каждое поле tit пишем 32 Кб текста. Затем выполняем два запроса на клиенте, но данные НЕ фетчим данные. Код: sql 1. 2. Насколько я понимаю, первый запрос грузит сервер существенно больше, чем второй. Нет. Оба выбирут примерно одну страницу данных из таблицы и успокоются, отдав её клиенту. Поскольку клиент не будет больше данных требовать, на сервере ничего происходить не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 15:12:35 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
AkinaMasterZivВопрос стоит в понимании принципов работы со звездочкой * по сравнению с фиксированным списком полей. Использование звёздочки вместо списка полей сродни всем иным lamer-friendly наворотам, вроде "свойства по умолчанию" или "неявного приведения типов". А потому - не использовать никогда. А то что случится ? Вот я заметил что в vbulletin и прочем коробочном вебе так постоянно делают. А разгадка одна - расширения. Пожалуй, в других проектах так не делают, но тут во главу угла поставлена простота модификации. Изначально в коде не известно какие именно расширение движка добавило поля в основные таблицы, поэтому они выбирают все возможные. Иначе что, делать по два запроса ? Городить наследование классов/всякие перегрузки crud/на-что-там-сейчас-еще-модно-тратить-бюджет ? То есть, в общем случае я бы согласился с утверждением, но в частные случаи бывают весьма оригинальны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 17:20:32 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
netwindА разгадка одна - расширения. Это - особый, пусть и да, реально нередко встречающийся случай, когда клиентская часть вынуждена работать с данными нефиксированной структуры. То есть базовый софт не знает истинной структуры хранения данных, хотя может быть убеждён, что некая базовая часть, которая известна ему, присутствует в структуре гарантированно и без модификаций. Хотя мне кажется, что два запроса всё-таки лучше одного. Ещё лучше, если к тому же расширение формирует свои структуры хранения данных, связанные с базовыми необходимыми соотношениями. Ну просто хотя бы из потенции интерференции данных двух независимых расширений. PS. Однако в рассматриваемом исходно вопросе подобный особый случай не закладывается в принципе. Да и не влияет на суть вопроса. PPS. Впрочем, до конца исходный вопрос я всё ещё не понял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 17:46:44 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
AkinaХотя мне кажется, что два запроса всё-таки лучше одного Так если там выбирается набор сущностей, то тогда уже N запросов по одной на каждую сущность . А это N - это очень много :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 17:58:36 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
netwindAkinaХотя мне кажется, что два запроса всё-таки лучше одного Так если там выбирается набор сущностей, то тогда уже N запросов по одной на каждую сущность . А это N - это очень много :)"пусть икс равен эн... нет, эн маловато, пусть икс равен эм..." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 18:02:40 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Блин, вижу, что моя вторая попытка сформулировать задачу тоже провалилась... ((( MasterZivподумай лучше сам, что СУБД должна сделать, чтобы выполнить оба запроса. Вопрос: Есть где-нибудь в интернете какая-нибудь статья или ещё лучше картинка (инфографика) где не профессорским, а более-менее простым языком перечисляются последовательности (примерный стратегический алгоритм) действий, которые происходят внутри сервера при выполнении обычного селекта? Или все, что там происходит настолько сложно, что больше похоже на русскую рулетку? MasterZivа невозможно изолировать выполнение запроса от стадии передачи данных клиенту. Вопрос: Неужели не существует никакой экономии от того, что клиент не стал фетчить данные с сервера, а только выполнив select * запрос, просто стал выполнять другие запросы? Неужели с точки зрения сервера не существует разницы, если select * выбрал 10 тыс. строк, но клиент сфетчил первые 50, а остальные 9950 фетчить не стал, а просто стал выполнять какие-то другие запросы? Я в этом смысле имел ввиду изоляцию стадии выборки и стадии транспорта... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 18:40:57 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
LumixНеужели с точки зрения сервера не существует разницы, если select * выбрал 10 тыс. строк, но клиент сфетчил первые 50, а остальные 9950 фетчить не стал, а просто стал выполнять какие-то другие запросы?C точки зрения сервера (сам он, правда, об этом не скажет) клиент - клинический идиот. Потому как мог бы добавить в запрос LIMIT 50 - тогда сервер выбрал бы нужные полсотни записей и немедленно бросил это дурацкое занятие. А так он вынужден держать в памяти весь этот хлам, который. оказывается, клиенту-то и вовсе нафиг не нужен. Lumix Вопрос: Есть где-нибудь в интернете какая-нибудь статья или ещё лучше картинка (инфографика) где не профессорским, а более-менее простым языком перечисляются последовательности (примерный стратегический алгоритм) действий, которые происходят внутри сервера при выполнении обычного селекта? Внутри сервера происходит сначала создание плана выполнения запроса. Процесс сам по себе ни разу не простой. А по его окончании сервер оказывается на перекрёстке из полусотни дорог, и какую из них он выберет - зависит от результатов первого этапа, так что обсуждать этот выбор "теоретически" слегка бессмысленно. Lumixпохоже на русскую рулетку? Если рассуждать "вообще" - да, похоже. А если по конкретному поводу - то это уже русская рулетка с пистолетом Макарова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 19:28:18 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
по работе на java с mysql обнаружил такой факт если сделать запрос к базе и получит от неё данные, но не закрыть соединение, то таких не закрытых накапливается прилично, я не смог найти параметры в mysql которые бы сбрасывали такое . хотя по рекомендациям делал... пришлось делать шедулер на ребут mysql. в общем правило хорошего тона говорит о том, что после получения данных надо закрывать соединение.. ну а если запрос сделан и закрыт - то что не забрано с сервера, серверу пофиг, и он этот объём держит в кэше минимум времени... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 21:22:45 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
вадяпо работе на java с mysql обнаружил такой факт если сделать запрос к базе и получит от неё данные, но не закрыть соединение, то таких не закрытых накапливается прилично, я не смог найти параметры в mysql которые бы сбрасывали такоеПосмотрите параметр interactive_timeout, он указывает, через какое время закрывать спящие соединения. Только применять его следует аккуратно. Однако, думается, было бы более правильным на стороне клиента организовать пул подключений, чтобы использовать уже установленные коннекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 21:46:49 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
вадяну а если запрос сделан и закрыт - то что не забрано с сервера, серверу пофиг, и он этот объём держит в кэше минимум времени... вот уже ближе к тому, что я пытаюсь понять пара вопросов 1) каждый последующий селект чистит кеш предыдущего? или у сервера там что-то типа сборщика мусора используется - типа если не мешается, то не трогает, а так как приспичит, то чистит? 2) что именно складывается в кеш? Код: sql 1. 2. 3. 4. Допустим в первом селекте в кеш копируется вся таблица за исключением полей, которые хранятся по ссылкам типа varchar, тогда как char всегда хранится в таблице. Допустим тогда во втором селекте в кеш копируется только таблица из id, то есть список интов. Но неужели в третьем селекте в кеш копируется только список айдишников-интов? Если нет, то тогда список из интов и колонки а? А если так и у нас в каждой записи в колонке а хранится по 32 кб данных, то все эти 32 Кб кидаются в кеш? или может быть все таки в кеш кидается ссылка (то есть инт), а 32 кб достаются только в момент фетчинга записи?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 22:32:51 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
vkleвадяпо работе на java с mysql обнаружил такой факт если сделать запрос к базе и получит от неё данные, но не закрыть соединение, то таких не закрытых накапливается прилично, я не смог найти параметры в mysql которые бы сбрасывали такоеПосмотрите параметр interactive_timeout, он указывает, через какое время закрывать спящие соединения. Только применять его следует аккуратно. Однако, думается, было бы более правильным на стороне клиента организовать пул подключений, чтобы использовать уже установленные коннекты. менял эти параметры, только создалось впечатление, что не спящее соединение... и поэтому эта переменная не оказывала влияние. пул соединений здесь не подходит .. автор1) каждый последующий селект чистит кеш предыдущего? или у сервера там что-то типа сборщика мусора используется - типа если не мешается, то не трогает, а так как приспичит, то чистит? в кэше хранится сам запрос, или точнее его хеш, если новый запрос( вычисления его хеша) совпадает с уже имеющимся то данные берутся из кеша. ну вот я боюсь предлагать тебе ссылку, вдруг опять будешь ругаться.... http://habrahabr.ru/post/41166/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 11:12:56 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
вадяну вот я боюсь предлагать тебе ссылку, вдруг опять будешь ругаться.... 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 поля Короче, Вадя, за эту статью скорее спасибо, нежели неспасибо. Сказать, что это прямо то, что я ищу не могу, но вот за фишку с разделением хранения часто доставаемых и часто меняемых данных в разных таблицах - ради этой фишки стоило потратить время на эту статью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 13:01:46 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
автор1) из статьи я так и не понял в чем разница при работе с кешем для select * vs select id ни в чем. исходной функцией для хеша является исходный текст запроса. есть даже хотя бы один пробел не там поставит программист, то это посчитается за два разных запроса. У select * конечно же меньше преимуществ в разрезе кеширования, потому что, в общем случае, данных в нем больше и они памяти больше занимают. автор2) не понял для select id from t where a like '%1%' && b like '%2%' в кеш достаются все поля таблицы, только id поля или id, a, b поля Достается и хранится весь результат как он есть. То есть, поле id. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 13:20:37 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
netwindУ select * конечно же меньше преимуществ в разрезе кеширования, потому что, в общем случае, данных в нем больше и они памяти больше занимают. Насколько корректно просто сложить размеры полей: все инты, варчары и тексты по 8 байт + все чаты по 1 байту на длину чара и умножить на количество записей в таблице? пример Код: sql 1. Вопрос: Если в таблице 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, который принудительно заставляет эту переборку делать на диске, если изначально известно, что размер выборки огромен. Так вот если производство выборки на диске задается директивой НО КЕШ, значит обычный ход обработки запроса - это КЕШ или кеш в котором производится выборка данных и кеш запросов - это два разных типа кеша?? если да, то меня интересует не кеш, в котором хранятся уже выполненные результаты запросов, а кеш, в котором хранятся данные, из которых производится выборка а ещё точнее меня интересует влияние на этот кеш звездочки в селекте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 13:47:41 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
там ещё много интересного в коментах авторБлин, опять запутался: в кеше хранятся данные, по которым производится выборка a like '' && b like '' или в кеше все-таки хранятся результаты выборки и если у нас where id = 5, в то кеше будет хранится вся таблица в которой искалось id = 5 или в кеше будет храниться только одна эта запись? только одна запись для хранения первоначальных данных таблицы используется другая память(область) в этой области хранится вся таблица... вот эта переменная отвечает innodb_buffer_pool_size = 512M первый обращение запроса загружает таблицу в эту память, повторный - уже ищет в ней ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 14:21:12 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39094985&tid=1832506]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
77ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 434ms |

| 0 / 0 |
