[no_toc]
テーブル内のレコード件数を取得する方法としては、rowCount()やcount(*)などを使用する方法が良く使われているようですが、
実は、もっとスピーディで効率的に取得する方法があるので紹介します。
※ PHPを使用した例。
ダメな例
まずは、よく使われる手法として2つの例をあげます。
正確には全然ダメではなく、ちゃんと動作します。
…が、すこし負荷がかかります。
数千程度のそれほど多くないレコード数でアクセスもあまりなければそれでも大丈夫ですが、数十万レコードで、且つアクセスが多い時などは、ちょっとした負荷となってしまいます。
同じ結果を出すのであれば、負荷をかけずに処理したいところです。
以下は、あんまり良くない例です。
//あんまり良くない例1 // count(*)で取得する方法 try{ $sql = "SELECT count(*) as cnt FROM 【テーブル名】"; $stm = $pdo->prepare($sql); $stm->execute(); $result = $stm->fetch(PDO::FETCH_ASSOC); } catch(Exception $e) { exit("DB取得エラー"); } echo 'トータル件数'. $result['cnt'] .'件'; //件数表示
//あんまり良くない例2 // rowCount()で取得する方法 try{ $sql = "SELECT * FROM 【テーブル名】"; $stm = $pdo->prepare($sql); $stm->execute(); $result = $stm->fetchAll(PDO::FETCH_ASSOC); $total = $stm->rowCount(); } catch(Exception $e) { exit("DB取得エラー"); } echo 'トータル件数'. $total .'件'; //件数表示
良い例
次に良い例を紹介します。
何をもって「良い」かと言うと、
「負荷がかからず」、「高速」ということです。
データベース処理の基本ですね。
やり方は、予め記録されているテーブルからレコード数を取得するだけです。
information_schemaとは?
データベースを作成すると、
作った覚えがないのに「information_schema」というデータベースが自動的に作成されているかと思います。
このデータベース内の各テーブルには、いろいろなメタ情報が含まれ、各データベース、テーブルごとにトータル件数も収納されています。
つまり、このデータをひとつ取り出せば良いということになります。
INFORMATION_SCHEMAでは、データベースメタデータへのアクセスを実現し、データベースまたはテーブルの名前、カラムのデータ型、アクセス権限などの MySQL Server に関する情報を提供します。この情報に使用されることがある別の用語が、データディクショナリとシステムカタログです。
具体的な方法
具体的な方法としては以下の通り。
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つ取り出すだけなので、超高速です。
以上。
コメント