あなたは、ときにCOUNT(*)
それが最良の結果となりますので、それは、カウント列インデックスになります。でMySQL のMyISAMエンジンは、実際に行数を格納し、それはあなたがすべての行をカウントしようとするたびに、すべての行をカウントdoensn't。(主キーの列に基づく)
PHPを使用して行をカウントすることは、mysqlからphpにデータを送信する必要があるため、あまり賢くありません。mysql側で同じことを達成できるのになぜそれをするのですか?
COUNT(*)
が遅い場合はEXPLAIN
、クエリを実行して、インデックスが実際に使用されているかどうか、およびインデックスをどこに追加するかを確認してください。
以下は最速の方法ではありCOUNT(*)
ませんが、実際には適合しない場合があります-結果のグループ化を開始すると、COUNT
実際にはすべての行をカウントしない問題に遭遇する可能性があります。
解決策はSQL_CALC_FOUND_ROWS
です。これは通常、行を選択するときに使用されますが、(ページングなどのために)行の総数を知る必要があります。データ行を選択するときはSQL_CALC_FOUND_ROWS
、SELECTの後にキーワードを追加するだけです。
SELECT SQL_CALC_FOUND_ROWS [needed fields or *] FROM table LIMIT 20 OFFSET 0;
必要な行を選択したら、次の1つのクエリでカウントを取得できます。
SELECT FOUND_ROWS();
FOUND_ROWS()
データ選択クエリの直後に呼び出す必要があります。
結論として、すべては実際にはエントリの数とWHEREステートメントの内容によって決まります。多くの行(数万、数百万、およびそれ以上)がある場合は、インデックスの使用方法に注意を払う必要があります。
SELECT 1
、使用しませんSELECT *
。違いはありますか?