Mysql сколько строк в таблице
Базы данных часто используются для получения ответа на вопросы типа: «как часто данные определенного типа встречаются в таблице?» Вам, например, может понадобиться узнать общее количество животных, или то, сколько животных имеется у каждого из владельцев, или провести статистические исследования на базе хранящейся информации.
Процедура подсчета количества животных в сущности идентична подсчету количества строк в таблице, так как на каждое животное приходится по одной записи. Функция COUNT() подсчитает количество непустых результатов, и с ее помощью можно составить следующий запрос для определения числа животных:
mysql> SELECT COUNT(*) FROM pet; +----------+ | COUNT(*) | +----------+ | 9 | +----------+
Ранее мы уже извлекали из таблицы имена владельцев животных. При помощи функции COUNT() можно узнать, сколько животных принадлежит каждому из владельцев:
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; +--------+----------+ | owner | COUNT(*) | +--------+----------+ | Benny | 2 | | Diane | 2 | | Gwen | 3 | | Harold | 2 | +--------+----------+
Обратите внимание на использование команды GROUP BY для объединения всех записей по каждому из владельцев. Без этой команды запрос выдал бы только сообщение об ошибке:
mysql> SELECT owner, COUNT(owner) FROM pet; ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT(). ) with no GROUP columns is illegal if there is no GROUP BY clause
Команды COUNT() и GROUP BY очень помогают характеризовать данные различными способами. В примерах, приведенных ниже, вы увидите и другие способы проведения статистических подсчетов.
Количество животных каждого вида:
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species; +---------+----------+ | species | COUNT(*) | +---------+----------+ | bird | 2 | | cat | 2 | | dog | 3 | | hamster | 1 | | snake | 1 | +---------+----------+
Количество животных каждого пола:
mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex; +------+----------+ | sex | COUNT(*) | +------+----------+ | NULL | 1 | | f | 4 | | m | 4 | +------+----------+
(в этой таблице результатов NULL обозначает, что пол животного неизвестен)
Количество животных каждого вида с учетом пола:
mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | NULL | 1 | | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
При использовании функции COUNT() вовсе не обязательно загружать всю таблицу. Например, предыдущий запрос, в котором учитываются только кошки и собаки, выглядит следующим образом:
mysql> SELECT species, sex, COUNT(*) FROM pet -> WHERE species = "dog" OR species = "cat" -> GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | +---------+------+----------+
Можно узнать и количество животных каждого пола с учетом только тех экземпляров, пол которых известен:
mysql> SELECT species, sex, COUNT(*) FROM pet -> WHERE sex IS NOT NULL -> GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
MySQL Row Count: Как получить количество строк в MySQL
Описание : в этой статье вы узнаете, как получить количество строк MySQL в базе данных.
Получение количества строк MySQL в одной таблице
Чтобы получить количество строк в одной таблице, вы используете оператор COUNT(*) в SELECT следующим образом:
SELECT COUNT(*) FROM table_name;
Например, чтобы получить количество строк в таблице andreyex в примере базы данных, используйте следующий оператор:
SELECT COUNT(*) FROM andreyex;
+ ---------- + | COUNT(*) | + ---------- + | 35 | + ---------- +
1 row in set (0.01 sec)
Получение количества строк MySQL в двух или более таблиц
Чтобы получить количество строк в нескольких таблицах, вы используете оператор UNION для объединения наборов результатов, возвращаемых каждым отдельным оператором SELECT.
Например, чтобы получить количество строк таблиц andreyex и trainings в одном запросе, используйте следующую инструкцию.
SELECT 'andreyex' tablename, COUNT(*) rows FROM andreyex UNION SELECT 'trainings' tablename, COUNT(*) rows FROM trainings;
+ ----------- + ------ + | tablename | rows | + ----------- + ------ + | andreyex | 34 | | trainings | 451 | + ----------- + ------ +
2 rows in set (0.01 sec)
Получение количества строк MySQL всех таблиц в конкретной базе данных
Чтобы получить количество строк всех таблиц в конкретной базе данных, например classicmodels, вы используете следующие шаги:
- Во-первых, получить все имена таблиц в базе данных
- Во-вторых, создайте оператор SQL, который включает все операторы SELECT COUNT(*) FROM table_name для всех таблиц, разделенных UNION.
- В-третьих, выполните оператор SQL, используя оператор prepared
Во-первых, чтобы получить все имена таблиц базы данных, вы запрашиваете из базы данных information_schema следующее:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'classicmodels' AND table_type = 'BASE TABLE';
+ -------------- + | TABLE_NAME | + -------------- + | andreyex | | trainings | | sites | + -------------- +
3 rows in set (0.02 sec)
Во- вторых, построить оператор SQL, мы используем функции GROUP_CONCAT и CONCAT следующим образом:
SELECT CONCAT(GROUP_CONCAT(CONCAT('SELECT \'', table_name, '\' table_name,COUNT(*) rows FROM ', table_name) SEPARATOR ' UNION '), ' ORDER BY table_name') INTO @sql FROM table_list;
В этом запросе приведен список имен таблиц table_list, который является результатом запроса на первом этапе.
Следующий запрос использует первый запрос как производную таблицу и возвращает инструкцию SQL в виде строки.
SELECT CONCAT(GROUP_CONCAT(CONCAT('SELECT \'', table_name, '\' table_name,COUNT(*) rows FROM ', table_name) SEPARATOR ' UNION '), ' ORDER BY table_name') INTO @sql FROM (SELECT table_name FROM information_schema.tables WHERE table_schema = 'classicmodels' AND table_type = 'BASE TABLE') table_list
Если вы используете MySQL 8.0+, вы можете использовать MySQL CTE (общее табличное выражение) вместо производной таблицы:
WITH table_list AS ( SELECT table_name FROM information_schema.tables WHERE table_schema = 'classicmodels' AND table_type = 'BASE TABLE' ) SELECT CONCAT( GROUP_CONCAT(CONCAT("SELECT '",table_name,"' table_name,COUNT(*) rows FROM ",table_name) SEPARATOR " UNION "), ' ORDER BY table_name' ) INTO @sql FROM table_list;
В-третьих, вы выполняете оператор @sql, используя подготовленный оператор следующим образом:
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
Получение количества строк MySQL всех таблиц в базе данных одним запросом
Быстрый способ получить количество строк всех таблиц в базе данных — запрос данных из базы данных information_schema напрямую:
SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema = 'classicmodels' ORDER BY table_name;
Этот метод иногда не точен, потому что количество строк в information_schema и фактическое количество строк в таблицах не синхронизированы. Чтобы избежать этого, вы должны выполнить инструкцию ANALYZE TABLE перед запросом количества строк из базы данных information_schema.
ANALYZE TABLE table_name, . ;
В этой статье вы узнали о различных способах получения количества строк одной или нескольких таблиц в базе данных MySQL.
Mysql, максимальное количество записей в таблице myisam
Есть mysql 5.0, большая база данных и в ней (в том числе) большая таблица типа myisam. После того, как количество строк в таблице перевалило за 2 миллиона и суммарный размер всех таблиц базы данных и индексов дошёл до 2 гигов (это случилось одновременно), запросы к таблице сразу стали выполняться на порядок медленнее. Собственно вопрос — 2 миллиона — это максимальное количество строк в myisam, под обработку которых заточен mysql, или 2 гига — максимальный размер базы данных или всё это случайное совпадение и мне нужно шаманить с размерами буферов?
- Количество треков на Яндекс.Музыке превысило 10 миллионов
- Есть ли свободное место в базе данных поисковика Yahoo?
- Яндекс выложил YDB в открытый доступ
На сайте с 19.02.2005
4 января 2009, 09:02
Не стоит плодить сущности без необходимости
На сайте с 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
Сколько записей в одной таблице может выдержать myslq?
Полагаю что автору вопроса не стоит задаваться вопросом «Сколько записей в одной таблице может выдержать myslq?», потому что он изначально неверный.
Случай (когда вопрос представляет чисто академический интерес) рассматривать не будем.
Следует задаться другими вопросами:
— мне точно нужен MySQL для решения моей задачи?
— во что я упрусь при большом количестве записей — в ограничение по записи или по чтению?
— при каком объеме памяти в сервере MySQL не сможет эффективно доступаться к данным?
— что такое шардинг, партиционирование и репликация?
— как мне бэкапить базы?
— что будет если моя база упадет?
и т.д. в том же направлении.
Ответ написан более трёх лет назад
Комментировать
Нравится 3 Комментировать
Ответы на вопрос 6
1.844E+19 в таблице типа myisam.
У innodb сложнее найти, но есть ограничение на 64Тб на файл, а значит и на таблицу.
Только эти знания вам никакой практической пользы не принесут.
Ответ написан более трёх лет назад
Комментировать
Нравится 4 Комментировать
Под сотню миллионов держит спокойно, но конечно же таблица жестоко оптимизирована для конкретных достаточно простых запросов. InnoDB.
Переходить на другую СУБД, скорее всего, не стоит. Стоит измерить, насколько плачевная ситуация сейчас и можно ли ее изменить. Проанализируйте, какие запросы идут к таблице, насколько быстро они работают, какие основные операции идут (вставка-чтение), нет ли из-за этого забавных эффектов (например, блокировки на MyISAM и на InnoDB сильно отличаются), все ли индексы стоят, нет ли лишних индексов, нельзя ли их уменьшить и т.д. После этого будете принимать решение. Если сейчас у Вас 1 млн, можно забить тестовую базу на 5 млн и посмотреть, сильно ли изменился расклад.