テーブルの行をカウントする


165

テーブルのレコード数を取得するMySQLコマンドとは何ですか?

回答:


236
SELECT COUNT(*) FROM fooTable;

テーブルの行数をカウントします。

リファレンスマニュアルを参照してください


7
*の代わりにインデックス付きの列の名前を使用した方が高速ですか?このように:SELECT COUNT(id)FROMtablename

1
ほんの少しだけ。IDを使用すると107秒かかりましたが、彼のCOUNTが115秒でク​​エリした21961904行テーブルを取得しました。
Bondolin 2013

2
COUNT(*)は厳密な言語定義です。COUNT(*)を試みると解析エラーが発生します。スペースに注意してください
ppostma1

9
できますCOUNT(1)。これが最速の方法です。
Shota Papiashvili 2016

PHPで変数を書き込むためにCOUNT()を使用する最良の方法は何ですか?SQLで「... COUNT(*)AS rowCount ...」を実行しますか、それは$ 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;

フルテーブルスキャンを実行すると、大規模な高負荷サーバーで数時間かかる可能性のある非常にコストのかかる操作になる可能性があります。また、ディスクI / Oも増加します。

同じ操作により、挿入と更新のテーブルがブロックされる可能性があります。これは、エキゾチックなストレージエンジンでのみ発生します。

InnoDBとTokuDBはテーブルロックがあっても問題ありませんが、フルテーブルスキャンが必要です。


3
これは、行をカウントする最も効率的な方法のようです。なぜそれが答えではないのでしょうか?私はInnoDBを使用しています。テーブルロックを使用すると、行数は正確になりますか?
Chung Lun Yuen

innodbの場合は推定です。しかし、「私たちのウェブサイトにはxxxのメンバーがいる」、「あなたに似たxxxの結果が検出された」などの場合にも使用できます。
Nick

私はわかりません。しかし、Innodbは実際の数ではありません。しかし、100万行のテーブルには非常に役立ちます。
Nick

4
テーブルを調べて各行をカウントし、行カウントを取得するのは、とんでもないことです。だから私もこの答えを好む。
th3penguinwhisperer 2017年

35

を実行せずにテーブルの行数を確認する別の方法があります selectクエリがあります。

すべてのMySQLインスタンスにはinformation_schemaデータベースがあります。次のクエリを実行すると、テーブルのおよその行数など、テーブルに関する完全な詳細が表示されます。

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

MyISAMは行数を格納しているので、これはMyISAMテーブルでもより高速ですか?
NaturalBornCamper 2017年

MyISAMでこれをテストしたことはありません。
Santhosh Tangudu



3

ただ

SELECT COUNT(*) FROM table;

その後にWhereを使用して条件を指定できます

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

3

あなたは、テーブルとテーブル内のいくつかのフィールドを持っている場合は巨大であり、それは良いでしょうDO NOT USE *それはメモリにすべてのフィールドをロードし、以下のように使用すると、より良い性能を持つことになりますのため

SELECT COUNT(1) FROM fooTable;

これは誤りです。stackoverflow.com/questions/5179969/…を参照してください。COUNT (1)は実際にはMyISAMの方がはるかに遅くなる場合があります。
jcoffland 2018年

@jcofflandは、自分でtを試すことができます。特に、ジョインがある場合、または条件がcount(*)よりもはるかに高速である場合は特にそうです。
ユセフェリ2018年

2

Santoshが述べたように、このクエリは適切に高速であると思いますが、すべてのテーブルをクエリするわけではありません。

特定のデータベースの特定のテーブル名について、データレコード数の整数結果を返すには、次のようにします

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

1
これにより、推定行数が返される場合があります。1つの例では、COUNT(*)を使用して55,940,343行を取得しましたが、このメソッドを使用して56,163,339行なので、200k以上ずれていました。
jcoffland 2018年

@jcoffland、私は上記の_ Santosh_による回答に言及しましたが、結果はおおよそのものであると述べています。私の答えは、より詳細で実用的なクエリです。count(*)パフォーマンスを意識した正確なカウントの使用が必要な場合は、回答全体で非常に明確です
Mohammad Kanan

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

主キーまたは一意のキー/インデックスがある場合、可能なより高速な方法(400万行のテーブルでテスト)

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

カーディナリティフィールドを取得します(インスタントに近いです)

0.4秒から0.0001ミリ秒までの時間

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.