PHP

この方法知っておいて!【MySQL】トータル件数を超高速で取得する方法

テーブル内のレコード件数を取得する方法としては、rowCount()count(*)などを使用する方法が良く使われているようですが、データ件数を取得するだけなのに、ループ処理させるのはどうかと思いませんか?

実は、もっとスピーディで効率的に取得する方法があるので紹介します。

PHPを使用した例です。

ダメな例

まずは、よく使われる手法として2つの例をあげます。

正確には動作的には全然ダメではなく、ちゃんと動作します。

ただ、負荷がかかります。

数千程度のそれほど多くないレコード数でアクセスもあまりなければそれでも大丈夫ですが、10万レコードで且つアクセスが多い時などは、ちょっとした負荷となってしまいます。

同じ結果を出すのであれば、負荷をかけずに結果を出したいところです。

//ダメな例1

try{
	$sql = "SELECT * FROM 【テーブル名】";

	$stm = $pdo->prepare($sql);
	$stm->execute();
	$result = $stm->fetchAll(PDO::FETCH_ASSOC); //fetchAll
} catch(Exception $e) { exit("DB取得エラー"); } 

$total = $stm->rowCount();

echo 'トータル件数'. $total .'件'; //件数表示
//ダメな例2

try{
	$sql = "SELECT count(*) as cnt FROM 【テーブル名】";

	$stm = $pdo->prepare($sql);
	$stm->execute();
	$result = $stm->fetchAll(PDO::FETCHALL_ASSOC); //fetchAll
} catch(Exception $e) { exit("DB取得エラー"); } 

echo 'トータル件数'. $cnt .'件'; //件数表示

良い例

次に良い例を紹介します。

何をもって「良い」かと言うと、
「負荷がかからず」、「高速」です。

データベース処理の基本ですね。

やり方は上記の「悪い例」と根本的に違います。

ループさせて件数を取得するのではなく、予め記録されているレコード数を取得するだけです。

information_schemaとは?

データベースを作成すると、
作った覚えがないのに「information_schema」というデータベースが自動的に作成されています。

このデータベース内の各テーブルには、いろいろなメタ情報が含まれ、各データベース、テーブルごとにトータル件数も収納されています。

つまり、このデータをひとつ取り出せば良いということになります。

INFORMATION_SCHEMA では、データベースメタデータへのアクセスを実現し、データベースまたはテーブルの名前、カラムのデータ型、アクセス権限などの MySQL Server に関する情報を提供します。この情報に使用されることがある別の用語が、データディクショナリシステムカタログです。

引用元:MySQL リファレンスマニュアル:INFORMATION_SCHEMA テーブル

具体的な方法

具体的な方法としては以下の通り。

try{
	$sql = "
	SELECT TABLE_ROWS
	FROM information_schema.TABLES
	WHERE
	table_schema = 【データベース名】 AND
	table_name = 【テーブル名】;
	";
  
	$stm = $pdo->prepare($sql);
	$stm->execute();
	$result = $stm->fetch(PDO::FETCH_ASSOC); //fetch
} catch(Exception $e) { exit("DB取得エラー"); } 

$total = $result['TABLE_ROWS'];

echo 'トータル件数'. $total .'件'; //件数表示

コピペして、【データベース名】と【テーブル名】を変更すればOKです。

ループさせて件数をカウントするのではなく、レコードを1つ取り出すだけなので、超高速です。

以上。

\ 注 目 /

CodeCamp
▲自宅で学べるプログラミング学習

関連記事

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です