Перейти к содержимому

Mysql сколько строк в таблице

  • автор:

Как определить количество строк в таблице в базе данных MySQL

Однажды я столкнулся с тем, что мне нужно было посчитать количество строк в таблице SQL, но многие из предлагаемых в интернете решений у меня не работали. И всё же я нашёл выход.

Способ 1. phpMyAdmin

Начнем с самого простого и очевидного. Допустим, вам не нужно использовать полученный результат в коде, а просто узнать количество строк, только и всего.

Тогда заходим в phpMyAdmin (localhost/tools/phpmyadmin — для Денвера, localhost/phpMyAdmin для MAMP), затем выбираем нужную базу данных, после этого выбираем таблицу, количество строк в которой нужно выяснить, и видим следующее сообщение:

количество строк в таблице базы данных

Способ 2. COUNT

Вот так выглядит сам SQL-запрос:

SELECT COUNT(1) FROM название_таблицы

SQL-запрос с условием:

SELECT COUNT(1) FROM название_таблицы WHERE условие

Реализация на PHP:

$a = mysql_query("SELECT COUNT(1) FROM название_таблицы"); $b = mysql_fetch_array( $a ); echo $b[0]; // выведет число строк

Аналогичным образом сюда можно добавить условие. Тогда код выведет число строк в таблице, удовлетворяющих условию.

Способ 3. mysql_num_rows

Этот способ позволяет подсчитать количество строк результата запроса.

Например в WordPress посты хранятся в таблице wp_posts , таким образом мы можем узнать сколько записей (типов постов) хранится в базе данных в таблице MySQL. Этот код дан только для примера (или для случаев, когда среда WordPress не подгружена), так как в WordPress подключение к базе данных осуществляется через класс $wpdb.

/* * для начала подключимся к базе данных * возможно вы уже подключились к ней ранее * пользователь root и пустой пароль - настройки по умолчанию для Денвера */ $connect_db = mysqli_connect( "localhost", "root", "", "truemisha_database" ); /* * SQL запрос * у меня в качестве названия таблицы указана таблица с записями WordPress */ $posts = mysqli_query( $connect_db, "SELECT * FROM wp_posts" ); /* * задействуем функцию mysql_num_rows() */ $num_rows = mysqli_fetch_row( $posts )[0]; echo "Количество записей на вашем блоге WordPress: $num_rows \n";

В результат будут включены абсолютно все записи. А как узнать количество только тех, которые опубликованы? Для этого нам потребуется немного изменить SQL-запрос.

$posts = mysqli_query( $connect_db, "SELECT * FROM wp_posts WHERE post_status='publish'" );

Смотрите также

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Узнать количество записей в таблице MySQL

Нужно с помощью PHP узнать сколько в таблице users пользователей, у которых значение rating больше 10. Подскажите пожалуйста, как это сделать?

Отслеживать
20.5k 4 4 золотых знака 27 27 серебряных знаков 50 50 бронзовых знаков
задан 4 апр 2020 в 5:41
Максим Закревский Максим Закревский
347 1 1 золотой знак 5 5 серебряных знаков 14 14 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Если нужно узнать только количество строк, но не нужны сами строки

Для того чтобы узнать количество записей в таблице, нужно использовать SQL функцию COUNT() :

SELECT count(*) FROM users 

Если нужно подсчитать количество записей по условию, то его надо добавить в запрос:

SELECT count(*) FROM users WHERE rating > 10 

Для получения этого значения в РНР можно выполнить запрос обычным порядком

$res = $conn->query("SELECT count(*) FROM users WHERE rating > 10"); $row = $res->fetch_row(); $count = $row[0]; 

Если условие задается динамически, то при запросе необходимо использовать подготовленные выражения:

$rating = 10; $stmt = $conn->prepare("SELECT count(*) FROM users WHERE rating > ?"); $stmt->bind_param("s", $rating); $stmt->execute(); $res = $stmt->get_result(); $row = $res->fetch_row(); $count = $row[0]; 

Если нужно получить сами строки, а также узнать, сколько их

Здесь ещё проще. Просто получаем все строки в массив:

$res = $conn->query("SELECT * FROM users WHERE rating > 10"); $rows = $res->fetch_all(MYSQLI_ASSOC); 

Здесь мы получили обычный массив, с которым можем делать то же самое что и с любым другим массивом. например, если нам надо узнать есть ли в массиве что-нибудь, мы можем подставить его в прямо в условие:

if (!$rows) < echo "ничего не нашлось"; >else < foreach ($rows as $row ) < echo $row['name']; >> 

Если вдруг надо получить именно количество строк, то просто выполняем обычную функцию count()

MySQL Как быстро посчитать все строки в таблице

Существует несколько способов получить количество строк в таблице MySQL. Некоторые продукты управления базами данных предоставляют статистику базы данных, например, размеры таблиц, но это можно сделать и с помощью прямого SQL.

Считать кол-во строк в PHP почти всегда непроизводительно.
Оглавление:

  • information_schema.TABLES
  • SHOW TABLE STATUS
  • SQL_CALC_FOUND_ROWS
  • Функция COUNT()
  • Подсчет всех строк в таблице
  • Подсчет не-NULL строк — разница между COUNT() и COUNT(*)
  • Подсчет только NULL строк
  • Подсчет уникальных значений
  • Условные подсчеты с использованием выражений

information_schema.TABLES

$dbname = DB_NAME; $total = $wpdb->get_var( "SELECT TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA = '$dbname' AND TABLE_NAME = '$wpdb->coin_price_history'" );

Это способ позволяет получить данные о колличестве строк во всей таблице (без учета WHERE). Такие данные храняться в служебной таблице information_schema.TABLES :

SELECT TABLE_ROWS "Rows Count" FROM information_schema.TABLES WHERE table_name="my_table_name" AND table_schema="my_db_name";

Этот метод очень быстрый, но не точный, поскольку данные в information_schema о количестве строк и фактическое количество строк в таблицах не всегда синхронизированы. Чтобы этого избежать, необходимо выполнить оператор ANALYZE TABLE перед запросом к таблице information_schema.

ANALYZE TABLE my_db_name;

SHOW TABLE STATUS

Мы также можем получить данные таблицы следующим запросом:

SHOW TABLE STATUS LIKE 'my_db_name';
+--------------------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+------------------+-----------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | Max_index_length | Temporary | +--------------------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+------------------+-----------+ | coin_price_history | InnoDB | 10 | Dynamic | 2798728 | 75 | 210518016 | 0 | 236552192 | 4194304 | 2856706 | 2022-04-05 18:24:38 | 2022-04-06 12:44:26 | NULL | utf8mb4_unicode_ci | NULL | | | 0 | N | +--------------------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+------------------+-----------+

В колонке Rows находится кол-во строк в таблице.

SQL_CALC_FOUND_ROWS

SELECT SQL_CALC_FOUND_ROWS * FROM table_name LIMIT 5; SELECT FOUND_ROWS();

Этот способ не самый быстрый, но есть случай, когда COUNT(*) не подходит, например когда результаты группируются, можно столкнуться с проблемой, что COUNT на самом деле не считает все строки.

Решением является SQL_CALC_FOUND_ROWS — этот маркер нужно добавить сразу после SELECT :

SELECT SQL_CALC_FOUND_ROWS [нужные поля или *] FROM table WHERE . ;

После запроса кол-во всех строк нужно получить еще одним запросом — он должен быть сделан сразу после запроса на выборку данных:

SELECT FOUND_ROWS();

Функция COUNT()

При COUNT(*) учитываются индексы столбцов, поэтому результат будет хорошим по производительности. Также, стоит отметить, что таблица MySQL с движком MyISAM хранит количество строк как впомогательные данные к таблице и он не считает все строки каждый раз при запросе если это возможно.

Если COUNT(*) работает медленно, нужно добавить в начало запроса маркер EXPLAIN и проверить, какие индексы используются, и где их следует добавить.

Функция COUNT() считает количество строк в таблице. Она подходит для подсчета как всех строк таблицы, так и строк подходящих под условие WHERE. Есть несколько сигнатур:

  • COUNT(*) — получит всё не-NULL и NULL строки (одинаковые значения считаются по отдельности).
  • COUNT(expr) — возвращает набор результатов, не содержащих NULL строк.
  • COUNT(DISTINCT expr) — возвращает количество уникальных строк, не содержащих значений NULL.
  • COUNT() и COUNT(*) — разницу читайте ниже — коротко COUNT() — пропускает NULL строки.

В каждом случае COUNT() возвращает BIGINT — количество совпавших строк. Или ноль, если не было найдено ни одной.

Подсчет всех строк в таблице

Чтобы подсчитать все строки в таблице, независимо от того, содержат они значения NULL или нет, используйте COUNT(*). Такая запись в основном возвращает количество строк в наборе результатов, возвращенных оператором SELECT.

SELECT COUNT(*) FROM my_table;

Вызов COUNT(*) без WHERE или дополнительных столбцов, будет работать очень быстро в таблицах MyISAM, поскольку количество строк хранится в столбце table_rows в таблице tables базы данных information_schema .

Для транзакционных систем хранения данных, таких как InnoDB, хранение точного количества строк проблематично, поскольку InnoDB не ведет внутренний подсчет строк в таблице. Если бы он велся, то одновременные транзакции могли бы «видеть» разное количество строк в одно и то же время. Следовательно, операторы SELECT COUNT() подсчитывают только строки, видимые текущей транзакции. Это означает, что выполнение запроса с COUNT() при большой нагрузке может привести к неточным числам.

Подсчет не-NULL строк — разница между COUNT() и COUNT(*)

Если в COUNT() ничего не передавать, то выполняется версия функции COUNT(expr) , но без параметров. Вызов COUNT() таким образом возвращает только строки, где нет NULL. Например, у нас есть таблица code_values:

code_values +-------+ | code | +-------+ | 1 | +-------+ | NULL | +-------+ | NULL | +-------+ | 4 | +-------+

Запрос COUNT() вернет 2, хотя в таблице 4 строки:

SELECT COUNT() FROM code_values; +---------+ | COUNT() | +---------+ | 2 | +---------+

Обратите внимание, что эта версия функции COUNT() используется редко, потому что NULL-строки не должны быть проблемой в базах данных. Они могут создать проблемы только в том случае, если таблица не имеет первичного ключа. В большинстве случаев COUNT(*) будет работать просто отлично.

COUNT(expr) может принимать правильные выражения. Еще один запрос, который одинаково извлекает NULL и не NULL строки:

SELECT COUNT( IFNULL(code, 1) ) FROM code_values;

Подсчет только NULL строк

Версия функции COUNT(expr) также принимает имена отдельных столбцов, в результате чего COUNT(имя_столбца) возвращает количество записей, в которых имя_столбца не является NULL. Следовательно, следующий запрос SELECT получит количество строк, в которых столбец description содержит не NULL-значения:

SELECT COUNT(description) FROM widgets;

Подсчет уникальных значений

Функция COUNT(DISTINCT) возвращает количество строк с уникальными не-NULL значениями. Следовательно, включение ключевого слова DISTINCT исключает дубликаты строк из подсчета. Синтаксис функции следующий:

COUNT( DISTINCT expr,[expr. ] )

Как и в обычной функции COUNT(), параметры expr выше могут быть любыми выражениями, включая конкретные столбцы, все столбцы (*), возвращаемые значения функций или выражения, такие как операторы IF/CASE.

Пример. Допустим, у нас есть следующая таблица клиентов:

+------------+-------------+ | last_name | first_name | +------------+-------------+ | Tannen | Biff | +------------+-------------+ | McFly | Marty | +------------+-------------+ | Brown | Dr. Emmett | +------------+-------------+ | McFly | George | +------------+-------------+

Вызов COUNT(*) вернет количество всех строк (4), а COUNT DISTINCT по last_name каждую строку где дублирующие last_name будут считаться за одну строку, так что в итоге мы получим 3:

SELECT COUNT(*), COUNT(DISTINCT last_name) FROM clients; +----------+---------------------------+ | COUNT(*) | COUNT(DISTINCT last_name) | +----------+---------------------------+ | 4 | 3 | +----------+---------------------------+

Условные подсчеты с использованием выражений

Параметры функции COUNT() не ограничиваются именами столбцов; возвращаемые значения функций и выражения, такие как операторы IF/CASE, также будут работать.

Вот таблица, содержащая номера телефонов и пол нескольких пользователей:

+------------+---------+ | tel | sex | +------------+---------+ | 7136609221 | male | +------------+---------+ | 7136609222 | male | +------------+---------+ | 7136609223 | female | +------------+---------+ | 7136609228 | male | +------------+---------+ | 7136609222 | male | +------------+---------+ | 7136609223 | female | +------------+---------+

Предположим, что мы хотим создать запрос, который сообщает нам, сколько разных женщин и мужчин содержится в таблице. Человек идентифицируется по номеру телефона («tel»). Один и тот же номер может встречаться несколько раз, но пол этого номера должен учитываться только один раз.

Вот один из вариантов использования отдельного COUNT DISTINCT для каждого столбца:

SELECT COUNT(DISTINCT tel) gender_count, COUNT(DISTINCT CASE WHEN gender = 'male' THEN tel END) male_count, COUNT(DISTINCT CASE WHEN gender = 'female' THEN tel END) female_count FROM people
+--------------+------------+---------------+ | gender_count | male_count | female_count | +--------------+------------+---------------+ | 4 | 3 | 1 | +--------------+------------+---------------+
  • https://chartio.com/resources/tutorials/how-to-get-the-size-of-a-table-in-mysql/
  • https://stackoverflow.com/questions/5060366/mysql-fastest-way-to-count-number-of-rows
  • https://www.mysqltutorial.org/mysql-row-count/

Mysql, максимальное количество записей в таблице myisam

Есть mysql 5.0, большая база данных и в ней (в том числе) большая таблица типа myisam. После того, как количество строк в таблице перевалило за 2 миллиона и суммарный размер всех таблиц базы данных и индексов дошёл до 2 гигов (это случилось одновременно), запросы к таблице сразу стали выполняться на порядок медленнее. Собственно вопрос — 2 миллиона — это максимальное количество строк в myisam, под обработку которых заточен mysql, или 2 гига — максимальный размер базы данных или всё это случайное совпадение и мне нужно шаманить с размерами буферов?

На сайте с 19.02.2005
4 января 2009, 09:02
ОС 64-х битная?
Не стоит плодить сущности без необходимости
На сайте с 12.07.2006
4 января 2009, 09:31
Andreyka, нет
На сайте с 06.05.2007
4 января 2009, 09:34

явасумоляю. все проблемы в mysql именно так и проявляются : как только данных становится больше некоторого порога они уже не влезают в кеш и начинаются торможения. а еще бывает что с ростом объема данных в какой-то момент поменяется способ исполнения запроса. но вообще оптимизация штука комплексная и общих советов дать трудно. выделите медленные запросы, покажите структуру таблиц, explain запросов. может тогда. обычный лимит у myisam-таблиц 2^32 то есть 4 миллиарда записей. даже если он достигнут то можно пересобрать с опцией —with-big-tables и лимит будет (2^32)^2

Кнопка вызова админа ( )
На сайте с 19.02.2005
4 января 2009, 14:21
Ставьте 64-х битную, помогает
На сайте с 12.07.2006
5 января 2009, 19:35

Вынес часть таблиц в другую базу, поигрался с буферами, нагрузка на сервер снизилась до приемлимой. Возникла другая проблема — как делать бэкап большой базы? Делаю

nice —15 mysqldump -uюзер -pпароль -hlocalhost —opt —add-drop-table —quote-name база_данных > db.sql

Сервер вешается, запросы к базе данных выполняются с большим тормозом. Как правильно это делается?
На сайте с 01.04.2008
5 января 2009, 19:41
ИМХО если все так запущено тогда вариант: реплицировать БД на другой сервер и там уже бэкапить.
Править домен летит Айболит. И одно только слово твердит: — DNS! DNS! DNS!
На сайте с 06.05.2007
5 января 2009, 20:35

Разумеется он «вешается». mysqldump блокирует таблицы перед чтением. Еще можно попробовать использовать снапшеты LVM, если вдруг у вас есть возможность. Может быть вам подойдет скрипт mysqlhotcopy ( у меня лично он крешит базы в произвольный момент времени).

На сайте с 19.09.2007
8 января 2009, 21:23

ну как бы на выбор — еще можно раз скопировать и включить бинлоги, и ими потом «догонять» копию. те кто пользует говорят «вполне даже удобно» сам гоняю через репликацию — с нее уже бэкап и когда очень уж необходимо — стопорим на пару минут для снапшота (но у меня фряха ОС) и с него обычная копия и под базу специально отрезан не сильно большой разел чтобы быстренько снапшотилось.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *