|
|
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
остаётся вопрос что загружается - только то, что описано в select+ поля в where или все данные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 14:23:35 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
вадяinnodb_buffer_pool_size = 512M первый обращение запроса загружает таблицу в эту память, повторный - уже ищет в ней вооот! я сейчас пытаюсь выяснить что скрывается под тем, что вы называете загружает таблицу в эту память ну и как я уже приводил есть 3 варианта как мне видится: Код: sql 1. 2. 3. 4. если по первому селекту понятно, что грузится вся таблица, то по второму и третьему - вопрос: вся или во втором случае только список (id), а втретьем только список (id, a)?? Причина этого вопроса в том, что если и во втором и третьем случае в этот пул будет грузиться ВСЯ таблица, тогда select * вообще ни в чем не проигрывает селектам с перечисленными полями!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 14:41:37 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Lumix, ну, так сказать, просто проверьте, что происходит на самом деле создайте таблицу, как в вашем примере до после запросов 2 и 3 смотрите Show variables like %cache%; оцените "дельту" Qcache_free_memory почувствуйте разницу...... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 15:34:54 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
авторShow variables like %cache%; только это не отобразит "входную память" это скорее всего описывае процессы с "выходной памятью" как распределяется в innodb_buffer_pool_size хз... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 15:57:59 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Alex_Ustinov, если быть точнее Show STATUS like %Qcache%; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 16:02:02 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Lumix, установи dbForge, workBenche там можно посмотреть переменные сервера с их назначением, правда очень кратким, но может сможешь их трактовать полностью... как бы такого описания я не встречал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 16:03:52 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
вот как пример ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 16:11:58 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Alex_Ustinovну, так сказать, просто проверьте, что происходит на самом деле создайте таблицу, как в вашем примере до после запросов 2 и 3 смотрите Show variables like %cache%; оцените "дельту" Qcache_free_memory почувствуйте разницу...... Ну и какой мне смысл чувствовать разницу? Разница - это все рано что температуру мерить у пациента. Ну понятно, что у одного температура 37 у другого 39 и что дальше? То, что вы мне предлагаете - это не метод исследования, а игра в поле чудес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 18:25:46 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Lumix, вас остается только исходники читать оправлять. Все ж прозрачно и понятно. Ну попробуйте вместо Хабра купить на торентах книжку High Performance MySQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 19:26:14 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Lumix, вы постоянно уводите обсуждение в сторону этак мне не так а это не эдак. Много вопросов, мало дела. Пора уже переходить. От себя могу лишь добавить что мин.блок по-моему 8 байт, так что на запросе с LIMIT 1 никакой разницы не увидите. Берите сразу поглобальней. Длину записи (или полей) подсчитаете. Разделите, проанализируете Ну и еще - обсуждаемые варианты по-моему далеки от истины. ------ Ну понятно, что у одного температура 37 у другого 39 и что дальше? Это значит что у одного просто ОРЗ а у другого какой-то вирус, 39 это температура зараженного организма. Одни просто меряют температуру, другие меряют со смыслом и ставят диагноз, т.е. анализируют ----- То, что вы мне предлагаете - это не метод исследования, а игра в поле чудес. ... игрой в поле чудес занимаетесь вы...., кэш запросов даже по дефолту отключен, скачайте любой дистр-тив MySQL и посмотрите SHOW VARIABLES LIKE "query_cache_size" он равен 0 и просто его не включайте, будет все предсказуемо и просто. ... да будет вам известно, что существует даже метод исследования - "метод научного тыка", ткул в точку и попал. Я же вам предложил чисто практическое исследование, а не вычитывание каких то статеек. Это суть исследования - практика. Говорю вам как прикладник а не теоретик по профессии. От вычитывания статей (не от создателя) вы заимеете лишь чье-то субъективное мнение (конечно оно может быть и объективным) Посмотрел на топики с вашим участием, вы оказывается спец в С/С++. Исходники на офф.сайте лежат в свободном доступе. Или же для получения исчерпывающего ответа лучше обратиться на сайт Видениуса Монти, я думаю вам ответят. На Percone тоже очень общительные люди. PS. Вопросы внутренней механики слишком узко направлены, тем более когда эта механика практически не используется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 19:28:55 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Alex_Ustinov, очепятка .......От себя могу лишь добавить что мин.блок по-моему 1кбайт , ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 19:30:44 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
LumixТак вот если производство выборки на диске задается директивой НО КЕШ, значит обычный ход обработки запроса - это КЕШ или кеш в котором производится выборка данных и кеш запросов - это два разных типа кеша?? Два разных. Но один как раз традиционно кешем результатов называют, а второй - пул. innodb memory pool. если да, то меня интересует не кеш, в котором хранятся уже выполненные результаты запросов, а кеш, в котором хранятся данные, из которых производится выборка а ещё точнее меня интересует влияние на этот кеш звездочки в селекте Тут уже посложнее : Пул innodb оперирует страницами. Страницы - это плотно уложенные данные или связанные блоки дерева индексов. Различий в механизме кеширования между страницами в зависимости от типа нет. В каждой странице индекса хранятся идентификаторы primary key и по нему уже достаются остальные поля в записи. Так что для innodb select id, где id есть primary key, всегда существенно выгоднее select * . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 19:38:57 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
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 не наносит и единственный минус, который в этом может быть - это нагрузка на кеш запросов, а минус этот состоит в том, что в нем поместится меньше запросов, то есть при бОльших объемах данных, будут чаще удаляться более ранние запросы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 00:15:18 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
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 * нужно считать по ссылке дополнительные страницы содержащие остальные поля записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 00:48:56 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
авторя считаю, что измерение результатов запроса никоим образом не прольет свет на понимание принципов влияния списка полей в селекте по сравнению с select *. Так то поведение innodb в разных случаях можно измерить и сравнить. Одна беда - там счетчики глобальные. Нужно запускать в исключительно однопоточном окружении на сервере разработчика. Вот я более конкретно предлагаю вам сравнивать вывод show global status like '%Innodb_buffer_pool_read_requests%'; - это логические запросы чтения. Если не подтвердится - тогда уже будем думать почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 00:58:11 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
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' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 01:19:39 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Lumix, ну по вопросам и рассуждениям видно, что вам не хватает понимания механизмов. Я ответил на самое конкретное и в изолированных условиях без обсуждения query cache, а у вас в начале и по ходу другие общие вопросы возникают постоянно. Книжка на русском уж явно будет проще чем исходники. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 01:34:55 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
автора ведь никто из "советчиков" так и не смог сказать, что 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 на "транспортных расходах" это вам уже объясняли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 03:07:20 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
авторесли вы имеете ввиду %some% не сначала строки - все будет одинаково "тухло", так как основной "гвоздь" - это поиск по LIKE %% позволю себе поправить - сейчас это не тухло , это уже использует индекс :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 07:14:15 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Эта тема не про решение какой-то конкретной задачи из ежедневной практики на получение количества записей. В практике все задачи уже решены. Этот пример искусственно создан для иллюстрации. Вопрос стоит в понимании принципов работы со звездочкой * по сравнению с фиксированным списком полей. Условие про подсчет я сформулировал для того, чтобы изолироваться от стадии получения данных. Подобная изоляция позволяет сравнить поведение запросов на логической , а не на "транспортной" стадии.даже если не учитывать транспорт, а только логику механики то парсеру лучше знать конкретноый список полей какой вы желаете получить, поэтому SELECT * хуже SELECT id есть разница ЗАЛИТЬ в бак топливо ЗАДИТЬ в бак АИ-95 бензин почувствуйте... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 12:36:08 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Lumix Вопрос: Есть где-нибудь в интернете какая-нибудь статья или ещё лучше картинка (инфографика) где не профессорским, а более-менее простым языком перечисляются последовательности (примерный стратегический алгоритм) действий, которые происходят внутри сервера при выполнении обычного селекта? Примерно так: --посылка запроса. --парсинг (синтаксический разбор) запроса. --Разрешение имён и построение структуры запроса во внутренних структурах СУБД. --проверка прав --оптимизация запроса, построение плана его выполнения. --(6)выполнение шагов плана и формирование частичного результата с помещением его в буфер сетевого обмена для отсылки клиенту. --(7)отсылка клиенту буфера, очистка буфера. -- итеративное повторение шагов (6) и (7) до получения всех результатов. MasterZivа невозможно изолировать выполнение запроса от стадии передачи данных клиенту. Вопрос: Неужели не существует никакой экономии от того, что клиент не стал фетчить данные с сервера, а только выполнив select * запрос, просто стал выполнять другие запросы? Неужели с точки зрения сервера не существует разницы, если select * выбрал 10 тыс. строк, но клиент сфетчил первые 50, а остальные 9950 фетчить не стал, а просто стал выполнять какие-то другие запросы? Я в этом смысле имел ввиду изоляцию стадии выборки и стадии транспорта...[/quot] Экономия существует. Я не говорил, что она не существует. Я говорил, что эти два процесса невозможно изолировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 12:58:45 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Lumixвадяну вот я боюсь предлагать тебе ссылку, вдруг опять будешь ругаться.... http://habrahabr.ru/post/41166/ статью прочитал Зря прочитал, к обсуждаемой теме она не имеет ни малейшего отношения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 12:59:54 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Lumixвадяinnodb_buffer_pool_size = 512M первый обращение запроса загружает таблицу в эту память, повторный - уже ищет в ней вооот! я сейчас пытаюсь выяснить что скрывается под тем, что вы называете загружает таблицу в эту память Таблица никогда не загружается целиком в память . В смысле, это физически может происходить при большом кэше, но сервер никогда себе такую задачу не ставит, и -- главное -- в модели вычислений СУБД никогда не предполагается, что таблица находится в памяти. Наоборот, всегда должно предполагаться, что таблица находится на диске, и её придётся читать. авторПричина этого вопроса в том, что если и во втором и третьем случае в этот пул будет грузиться ВСЯ таблица, тогда select * вообще ни в чем не проигрывает селектам с перечисленными полями!!! Я же писал, что SELECT * и SELECT все поля через запятую -- это вообще одно и то же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 13:03:48 |
|
||
|
Select * vs Select id
|
|||
|---|---|---|---|
|
#18+
Alex_UstinovLumix, ну, так сказать, просто проверьте, что происходит на самом деле создайте таблицу, как в вашем примере до после запросов 2 и 3 смотрите Show variables like %cache%; оцените "дельту" Qcache_free_memory почувствуйте разницу...... Да чё ты ему всё про query cache задвигаешь ? это вообще к делу не относится, кроме того, эту хрень нужно раз и навсегда вырубить при установке сервера и никогда ни в коем случае не включать. Только память зазря расходует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 13:05:46 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39096772&tid=1832506]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
54ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 348ms |

| 0 / 0 |
