Порахуйте рядки таблиці


166

Що таке команда MySQL для отримання кількості записів у таблиці?

Відповіді:


237
SELECT COUNT(*) FROM fooTable;

буде рахувати кількість рядків у таблиці.

Дивіться посібник з посилання .


7
Чи швидше, коли я використовую ім'я індексованого стовпця замість *? tablename

1
Лише трохи. У мене з’явилася таблиця рядків 21961904, за якою його запитували COUNT за 115 секунд, тоді як використання ідентифікатора займало 107 сек.
Бондолін

2
COUNT (*) - це суворе мовне визначення. Ви отримаєте помилку розбору, якщо спробуєте COUNT (*) відзначити пробіл
ppostma1

9
Можна зробити COUNT(1), це буде найшвидший спосіб.
Шота Папіашвілі

Який найкращий спосіб використання COUNT () для написання змінної в PHP? Чи роблю я "... COUNT (*) AS rowCount ..." у SQL, чи він використовує $ results-> num_rows, чи є спосіб викликати цей результат безпосередньо?
Nosajimiki

71

Тому що про це ніхто не згадував:

show table status;

перелічує всі таблиці разом з деякою додатковою інформацією, включаючи передбачувані рядки для кожної таблиці. Це те, що phpMyAdmin використовує для своєї сторінки баз даних.

Ця інформація доступна в MySQL 4, ймовірно, в MySQL 3.23 занадто тривалий час в базі даних попередніх інформаційних схем.

ОНОВЛЕННЯ:

Оскільки було голосування проти, я хочу уточнити, що показане число оцінюється для InnoDB і TokuDB, і це абсолютно правильно для двигунів зберігання даних MyISAM та Aria (Maria).

Відповідно до документації :

Кількість рядків. Деякі двигуни зберігання даних, такі як MyISAM, зберігають точну кількість. Для інших двигунів зберігання даних, таких як InnoDB, це значення є приблизним і може змінюватись від фактичного значення на цілих 40% до 50%. У таких випадках використовуйте SELECT COUNT (*) для отримання точного підрахунку.

Це також найшвидший спосіб побачити кількість рядків на MySQL, тому що запит типу:

select count(*) from table;

Виконання повного сканування таблиці може бути дуже дорогою операцією, яка може зайняти години на великому сервері з високим навантаженням. Це також збільшує введення / виведення диска.

Ця ж операція може блокувати таблицю для вставок та оновлень - це відбувається лише в екзотичних системах зберігання даних.

InnoDB і TokuDB в порядку з блокуванням таблиці, але потрібно повне сканування таблиці.


3
Це виглядає як найефективніший спосіб підрахунку рядків. Цікаво, чому це не відповідь? Я використовую InnoDB. Якщо блокувати таблицю, кількість рядків має бути точно вірно?
Chung Lun Yuen

для innodb оцінюється . але ви можете використовувати його в деяких випадках "На нашому веб-сайті є члени xxx", "Ми виявили результати xxx, схожі на ваші" тощо.
Нік

Я не впевнений. але для Innodb це не реально. Але це досить корисно для мільйонів таблиць рядків.
Нік

4
Проходити по таблицях для підрахунку кожного рядка, щоб отримати кількість рядків, досить смішно. Тому я вважаю за краще і цю відповідь.
th3penguinwhisperer

35

У нас є інший спосіб дізнатися кількість рядків у таблиці, не виконуючи selectзапит на цій таблиці.

Кожен екземпляр MySQL має базу даних information_schema. Якщо ви запустите наступний запит, він дасть повну інформацію про таблицю, включаючи приблизну кількість рядків у цій таблиці.

select * from information_schema.TABLES where table_name = 'table_name'\G

Це швидше і в таблиці MyISAM, оскільки MyISAM зберігає кількість рядків?
NaturalBornCamper

Я ніколи цього не перевіряв на MyISAM.
Сантош Тангуду



3

Просто зробіть

SELECT COUNT(*) FROM table;

Ви можете вказати умови за допомогою "Де" після цього

SELECT COUNT(*) FROM table WHERE eye_color='brown';

3

Якщо у вас в полі декілька полів, і ваша таблиця величезна, краще НЕ ВИКОРИСТОВУЙТЕ, * оскільки вона завантажить усі поля в пам'ять, а використання наведених нижче буде мати кращу продуктивність

SELECT COUNT(1) FROM fooTable;

Це неправильно. Дивіться stackoverflow.com/questions/5179969/… COUNT (1) насправді може бути набагато повільніше для MyISAM.
jcoffland

@jcoffland ви можете спробувати t самостійно, особливо коли у вас є приєднання або коли умови будуть набагато швидшими, ніж підрахунок (*).
Юсефері

2

Як згадував Сантош , я вважаю, що цей запит є досить швидким, але не запитує всю таблицю.

Щоб повернути цілий результат кількості записів даних для конкретного імені таблиці в певній базі даних :

select TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA = 'database' 
AND table_name='tablename';

1
Це може повернути орієнтовну кількість рядків. В одному прикладі я отримав 55,940,343 рядків за допомогою COUNT (*), але 56,163,339 за допомогою цього методу, тому він був вимкнений більш ніж на 200 тис.
jcoffland

@jcoffland, я згадав відповідь _ Santosh_, над якою вказано результат приблизний . Моя відповідь - більш детальний практичний запит. Цілком зрозумілі відповіді, якщо ви хочете точно використовувати підрахунок count(*)з усвідомленням продуктивності
Мохаммед Канан,

1
$sql="SELECT count(*) as toplam FROM wp_postmeta WHERE meta_key='ICERIK' AND post_id=".$id;
$total = 0;
$sqls = mysql_query($sql,$conn);
if ( $sqls ) {
    $total = mysql_result($sqls, 0);
};
echo "Total:".$total;`

Ця відповідь застаріла, mysql_result застарілий у PHP 5.5.0 та видалений у PHP 7.0.0
Зробіть цей світ кращим місцем

1

Ви повинні використовувати count () повертає кількість рядків, що відповідає заданим критеріям

select count(*) from table_name;

0

Якщо у вас є первинний ключ або унікальний ключ / індекс, можливий більш швидкий метод (Тестований з 4 мільйонами таблиць рядків)

SHOW INDEXES FROM "database.tablename" WHERE Key_Name=\"PRIMARY\"

а потім отримати поле кардинальності (воно близьке до миттєвого)

Часи, коли від 0,4 до 0,0001 мс

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.