в чем разница count и count колонка
В SQL, какая разница между count (column) и count (*)?
У меня есть следующий запрос:
ОТВЕТЫ
Ответ 1
count(*) подсчитывает NULL и count(column) не
[edit] добавил этот код, чтобы люди могли его запускать
Ответ 2
Другим незначительным различием между использованием * и конкретным столбцом является то, что в случае столбца вы можете добавить ключевое слово DISTINCT и ограничить счет на различные значения:
Ответ 3
Дальнейшее и, возможно, незначительное различие заключается в том, что в некоторых реализациях базы данных счетчик (*) вычисляется путем просмотра индексов в рассматриваемой таблице, а не фактических строк данных. Поскольку конкретный столбец не указан, нет необходимости беспокоиться о фактических строках и их значениях (как это было бы, если бы вы подсчитали конкретный столбец). Разрешение базы данных на использование данных индекса может быть значительно быстрее, чем подсчет «реальных» строк.
Ответ 4
Объяснение в docs помогает объяснить это:
COUNT (*) возвращает количество элементов в группе, включая значения NULL и дубликаты.
COUNT (выражение) оценивает выражение для каждой строки в группе и возвращает количество ненулевых значений.
Ответ 5
Мы можем использовать Stack Exchange Data Explorer, чтобы проиллюстрировать разницу с простым запросом. Таблица Users в базе данных Qaru содержит столбцы, которые часто остаются пустыми, например URL-адрес веб-сайта пользователя.
Ответ 6
В основном функция COUNT (*) возвращает все строки из таблицы, тогда как COUNT (COLUMN_NAME) не работает; то есть он исключает нулевые значения, на которые здесь все также ответили. Но самая интересная часть состоит в том, чтобы оптимизировать запросы и базу данных, лучше использовать COUNT (*), если не использовать несколько счетчиков или сложный запрос, а не COUNT (COLUMN_NAME). В противном случае это существенно снизит производительность вашего БД при работе с огромным количеством данных.
Ответ 7
См. следующий код для тестовых исполнений SQL Server 2008:
Ответ 8
Лучше всего использовать
чтобы подсчитать количество строк в таблице, оно быстрее, чем любой формат, потому что он никогда не проверяет имя столбца в таблице или нет
Ответ 9
Нет никакой разницы, если один столбец является фиксированным в вашей таблице, если вы хотите использовать более одного столбца, чем вам нужно указать, сколько столбцов вам нужно подсчитать.
Ответ 10
В SQL, в чем разница между count(столбец) и count(*)?
у меня есть следующий запрос:
этот вопрос был вдохновлен как найти повторяющиеся значения в таблице в Oracle?.
чтобы уточнить принятый ответ (и, возможно, мой вопрос), заменив count(column_name) С count(*) вернет дополнительную строку в результате, которая содержит null и null значения в колонна.
10 ответов
count(*) считает нули и count(column) не
[edit] добавлен этот код, чтобы люди могли его запускать
еще одно незначительное различие между использованием * и определенным столбцом заключается в том, что в случае столбца вы можете добавить ключевое слово DISTINCT и ограничить количество различными значениями:
еще одно и, возможно, тонкое различие заключается в том, что в некоторых реализациях базы данных count(*) вычисляется путем просмотра индексов в рассматриваемой таблице, а не фактических строк данных. Поскольку конкретный столбец не указан, нет необходимости беспокоиться о фактических строках и их значениях (как было бы, если бы вы посчитали конкретный столбец). Разрешение базе данных использовать индексные данные может быть значительно быстрее, чем подсчет «реальных» строк.
объяснение docs, помогает объяснить вот это:
COUNT (*) возвращает количество элементов в группе, включая нулевые значения и дубликаты.
COUNT (expression) оценивает выражение для каждой строки в группе и возвращает количество значений nonnull.
поэтому count (*) включает нули, другой метод-нет.
мы можем использовать Stack Exchange Data Explorer чтобы проиллюстрировать разницу простым запросом. Таблица Users в базе данных Stack Overflow содержит столбцы, которые часто остаются пустыми, например URL-адрес веб-сайта пользователя.
в основном функция COUNT (*) возвращает все строки из таблицы, тогда как COUNT (COLUMN_NAME) этого не делает; то есть она исключает нулевые значения, на которые все здесь также ответили здесь. Но самая интересная часть-сделать запросы и оптимизировать базу данных лучше использовать COUNT (*), если не делать несколько подсчетов или сложный запрос, а не COUNT (COLUMN_NAME). В противном случае это действительно снизит производительность вашей БД при работе с огромным количеством данных.
см. следующий код для выполнения тестов SQL Server 2008:
для подсчета количества строк в таблице, это быстрее, чем любой формат, потому что он никогда не пойдет, чтобы проверить имя столбца в таблице, существует или нет
нет никакой разницы, если один столбец исправить в таблице, если вы хотите использовать более одного столбца, чем вы должны указать, сколько колонок вы обязаны посчитать.
как уже упоминалось в предыдущих ответах, Count(*) рассчитывает даже NULL колонки, в то время как count(Columnname) считается, только если столбец имеет значения.
Русские Блоги
Хороший вопрос: в чем разница между count (1), count (*), count (столбец)?
Эффект исполнения:
1. count(1) and count(*)
Когда количество данных в таблице велико, после анализа таблицы использование count (1) занимает больше времени, чем использование count (*)! К
Из плана выполнения действие count (1) и count (*) одинаково. Но после анализа таблицы count (1) займет меньше времени, чем count (*) (объем данных меньше 1w), но это не намного хуже. К
Если count (1) является индексом кластера id, то count (1) определенно быстрее. Но разница очень небольшая. К
Потому что count (*), какое поле автоматически оптимизируется. Так что нет необходимости переходить к count (1), используйте count (*), sql поможет вам завершить оптимизацию. Следовательно: Принципиально нет разницы между count (1) и count (*) !
2. count (1) и count (поле)
count (1) подсчитает все записи в таблице, Содержит примечание о том, что поле пустое записывать.
count (field) будет подсчитывать, сколько раз поле появляется в таблице, игнорируя случай, когда поле имеет значение NULL. который Записи с пустыми полями не учитываются. 。
Разница между count (*) и count (1) и count (имя столбца)
Эффект от реализации:
count(*) Включая все столбцы, эквивалентные количеству строк, При подсчете результатовНе игнорирует значение столбца как NULL
count(1) Включая игнорирование всех столбцов, использование 1 для представления строки кода, когда статистические результаты,Никогда не игнорируйте значения столбцов как NULL
По эффективности исполнения:
Имя столбца является первичным ключом, count (имя столбца) будет быстрее, чем count (1)
Имя столбца не является первичным ключом, count (1) будет быстрее, чем count (имя столбца)
Если в таблице несколько столбцов и нет первичного ключа, эффективность выполнения count (1) лучше, чем count (*)
Если есть первичный ключ, эффективность выполнения подсчета выбора (первичного ключа) оптимальна.
Если в таблице есть только одно поле, выберите count (*).
Русские Блоги
Понимание count (*), count (столбец), count (1) в MYSQL
Эффект от реализации:
1. Счетчик (*) включает все столбцы, что эквивалентно количеству строк.При подсчете результатов значение столбца не будет игнорироваться как NULL.
2. count (1) включает игнорирование всех столбцов. 1 представляет строку кода. При подсчете результатов значение столбца не будет игнорироваться.
3. Счетчик (имя столбца) включает только имя столбца. При подсчете результатов значение столбца будет проигнорировано (пустая строка здесь не просто пустая строка или 0, но Представляет количество NULL), то есть, когда значение определенного поля равно NULL, оно не учитывается.
Заявление о создании таблицы
2. Вызов хранимой процедуры
1. Базовый синтаксис:
Примечание. После имени хранимой процедуры необходимо добавить скобки, даже если хранимая процедура не имеет параметров для передачи.
3. Удалите хранимую процедуру.
1. Базовый синтаксис:
2. Вопросы, требующие внимания
(1) Вы не можете удалить другую хранимую процедуру в хранимой процедуре, вы можете только вызвать другую хранимую процедуру
Проверить эффект исполнения
Нет разницы между cout (*) и count (1), но cout (имя столбца) не считается нулевым
Проверить эффективность выполнения
Проанализируйте план выполнения, а затем посмотрите время выполнения,Безусловный запросВ сложившейся ситуации
Можно сделать вывод
Count (первичный ключ) count (*) count (1) намного эффективнее, чем count (столбцы без первичного ключа)
1. count (*) count (1), count (столбец, первичный ключ) План выполнения в основном тот же
Как посмотреть план выполнения MYSQL
Посмотреть время выполнения
1 show profiles;
2 показать переменные; Проверить, включено ли профилирование;
3 Если он выключен, установите profiling = 1;
4 Выполните собственный оператор sql;
5 показывают профили; вы можете проверить время выполнения инструкции sql;
Метод просмотра: показать такие переменные, как «% pro%»;
Установить способ открытия: установить профилирование = 1;
Посмотрите, сколько линий было задействовано
Id: Содержит набор чисел, указывающих порядок, в котором предложение select или таблица операций выполняется в запросе; порядок выполнения выполняется от наибольшего к наименьшему;
select_type: Представляет тип каждого предложения select в запросе (простое ИЛИ сложное)
SIMPLE: Запрос не содержит подзапросов или UNION
PRIMARY: Если запрос содержит какие-либо сложные части, самый внешний запрос помечается как ПЕРВИЧНЫЙ.
SUBQUERY: Подзапрос включен в список SELECT или WHERE, и подзапрос помечен как SUBQUERY
DERIVED: Подзапросы, содержащиеся в списке FROM, помечены как DERIVED (производные)
UNION: Если второй SELECT появляется после UNION, он помечается как UNION;
DERIVED: Если UNION включен в подзапрос предложения FROM, внешний SELECT будет помечен как DERIVED
UNION RESULT: SELECT, который получает результат из таблицы UNION, помечен как: UNION RESULT
Type: Указывает способ, которым MySQL находит нужную строку в таблице.
ALL: Полное сканирование таблицы, MySQL выполнит полное сканирование таблицы;
index: Полное сканирование индекса, разница между индексом и ВСЕМ состоит в том, что тип индекса проходит только по дереву индекса;
range: Сканирование индекса диапазона, сканирование индекса начинается с определенной точки и возвращает строки, соответствующие диапазону, что является обычным для запросов, таких как между, ;
ref: Сканирование неуникального индекса, возврат всех строк, соответствующих одному значению. Обычно используется в поиске с использованием неуникального индекса или неуникального префикса уникального индекса;
eq_ref: Уникальное сканирование индекса, для каждого ключа индекса ему соответствует только одна запись в таблице. Обычно используется при сканировании первичного ключа или уникального индекса
const system: Когда MySQL оптимизирует определенную часть запроса и преобразует ее в константу, используйте эти типы доступа. Если первичный ключ помещен в список where, MySQL может преобразовать запрос в константу
NULL: MySQL разбивает операторы в процессе оптимизации и даже не нуждается в доступе к таблицам или индексам во время выполнения.
possible_keys: Укажите, какой индекс MySQL может использовать для поиска строк в таблице.Если есть индекс в поле, участвующем в запросе, индекс будет указан, но он может не использоваться запросом;
key: Отображает индексы, фактически используемые MySQL в запросе. Если индексы не используются, он отображается как NULL. Когда в запросе используется покрывающий индекс, он появляется только в списке ключей.
key_len: Указывает количество байтов, используемых в индексе, и длина индекса, используемого в запросе, может быть вычислена с помощью этого столбца.
ref: Представляет условие сопоставления соединений в приведенной выше таблице, то есть эти столбцы или константы используются для поиска значения в столбце индекса;
rows: Указывает, что MySQL оценивает количество строк, которые необходимо прочитать, чтобы найти требуемую запись, на основе статистики таблицы и выбора индекса;
Extra: Содержит очень важную дополнительную информацию, которая не подходит для отображения в других столбцах;
Использование where: указывает, что сервер MySQL выполняет «пост-фильтр» после того, как механизм хранения получает записи. Если запрос не может использовать индекс, функция Using where предназначена только для того, чтобы напомнить нам, что MySQL будет использовать предложение where для фильтрации набора результатов
Использование временного: указывает, что MySQL необходимо использовать временную таблицу для хранения набора результатов, что является обычным для запросов сортировки и группировки;
Использование файловой сортировки: операция сортировки в MySQL, которая не может быть выполнена с использованием индексов, называется «сортировкой файлов»;
Об ограничениях плана выполнения MySQL:
EXPLAIN не сообщит вам о влиянии триггеров, хранимых процедур или пользовательских функций на запросы.
EXPLAIN не учитывает различные кеши
EXPLAIN не может отображать работу по оптимизации, выполненную MySQL во время выполнения запроса.
Некоторые статистические данные являются приблизительными, а не точными.
EXPALIN может объяснить только операцию SELECT, другие операции следует переписать как SELECT и затем просмотреть.
Посмотреть время выполнения
Запросить информацию о механизме хранения таблицы
Запрос уровня изоляции транзакции
В документе MySQL5.7 есть параграф:
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
For MyISAM tables, COUNT(*) is optimized to return very quickly if the SELECT retrieves from one table, no other columns are retrieved, and there is no WHERE clause.This optimization only applies to MyISAM tables, because an exact row count is stored for this storage engine and can be accessed very quickly. COUNT(1) is only subject to the same optimization if the first column is defined as NOT NULL.
InnoDBОбрабатывайте операции SELECT COUNT (*) и SELECT COUNT (1) одинаково. Между ними нет разницы в производительности.
заMyISAMТаблица, если SELECT извлекается из таблицы, другие столбцы не извлекаются и нет предложения WHERE, тогдаCOUNT(*)Оптимизирован для быстрого возврата. Эта оптимизация применяется только к таблицам MyISAM, поскольку этот механизм хранения хранит точное количество строк и может быть доступен очень быстро.COUNT(1)Только когда первый столбец определен как NOT NULL иCOUNT(*)Такая же оптимизация.
В SQL, в чем разница между count(столбец) и count(*)?
у меня есть следующий запрос:
чтобы уточнить принятый ответ (и, возможно, мой вопрос), заменив count(column_name) С count(*) вернет дополнительную строку в результате, который содержит null и null значения в колонна.
10 ответов:
count(*) подсчитывает нули и count(column) не
[edit] добавил этот код, чтобы люди могли его запустить
еще одно незначительное различие между использованием * и определенным столбцом заключается в том, что в случае столбца вы можете добавить ключевое слово DISTINCT и ограничить количество различными значениями:
еще одно и, возможно, тонкое различие заключается в том, что в некоторых реализациях базы данных count(*) вычисляется путем просмотра индексов в рассматриваемой таблице, а не фактических строк данных. Поскольку конкретный столбец не указан, нет необходимости беспокоиться о фактических строках и их значениях (как было бы, если бы вы посчитали конкретный столбец). Разрешить базе данных использовать данные индекса может быть значительно быстрее, чем заставить ее подсчитывать «реальные» строки.
объяснение docs, помогает объяснить вот это:
COUNT (*) возвращает количество элементов в группе, включая нулевые значения и дубликаты.
COUNT (expression) вычисляет выражение для каждой строки в группе и возвращает количество ненулевых значений.
поэтому count (*) включает в себя нули, другой метод-нет.
мы можем использовать Stack Exchange Data Explorer чтобы проиллюстрировать разницу с помощью простого запроса. Таблица Users в базе данных Stack Overflow содержит столбцы, которые часто остаются пустыми, например URL-адрес веб-сайта пользователя.
в основном функция COUNT (*) возвращает все строки из таблицы, тогда как COUNT (COLUMN_NAME) этого не делает; то есть она исключает нулевые значения, которые все здесь также ответили здесь. Но самая интересная часть-сделать запросы и оптимизировать базу данных лучше использовать COUNT (*), если не делать несколько подсчетов или сложный запрос, а не COUNT (COLUMN_NAME). В противном случае это действительно снизит производительность вашей БД при работе с огромным количеством данных.
см. следующий код для выполнения тестов SQL Server 2008:
для подсчета количества строк в таблице, это быстрее, чем любой формат, потому что он никогда не пойдет, чтобы проверить имя столбца в таблице, существует или нет
нет никакой разницы, если один столбец исправлен в вашей таблице, если вы хотите использовать более одного столбца, чем вам нужно указать, сколько столбцов вам нужно считать.
как уже упоминалось в предыдущих ответах, Count(*) рассчитывает даже NULL колонки, в то время как count(Columnname) считается, только если столбец имеет значения.