3

mysql クエリで読み込み時間が遅い問題に直面した後、行数を数える最良の方法を探しています。私はこれを行うために関数を愚かに使用mysql_num_rows()しましたが、これが最悪の方法であることに気付きました。私は実際にPHPでページを作るためにページネーションを作っていました。行数を数える方法がいくつか見つかりました。しかし、私はそれを数えるより速い方法を探しています。

テーブルの種類は MyISAM です

だから質問は今です

数えるのに最適で速いのはどれですか -

1. `SELECT count(*) FROM 'table_name'`

2. `SELECT TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES WHERE table_schema =  'database_name'
AND table_name LIKE  'table_name'`

3. `SHOW TABLE STATUS LIKE 'table_name'`

4. `SELECT FOUND_ROWS()`

これを行うための他のより良い方法がある場合は、それらも教えてください。可能であれば、答えとともに説明してください-なぜそれが最適で高速なのか。そのため、要件に基づいてメソッドを理解し、使用することができました。

ありがとう。

4

5 に答える 5

8

COUNTに関する MySQL リファレンス マニュアルの引用

COUNT(*) は、SELECT が 1 つのテーブルから取得し、他の列が取得されず、WHERE 句がない場合に非常に迅速に返されるように最適化されています。例えば:

mysql> SELECT COUNT(*) FROM student; 

この最適化は MyISAM テーブルのみに適用されます。これは、このストレージ エンジンに対して正確な行数が保存され、非常に迅速にアクセスできるためです。InnoDB などのトランザクション ストレージ エンジンの場合、複数のトランザクションが発生し、それぞれがカウントに影響を与える可能性があるため、正確な行数を格納することはより問題になります。

この質問 MySQL - Complexity of: SELECT COUNT(*) FROM MyTable;もお読みください。

于 2011-08-04T10:26:13.393 に答える
5

それはSELECT count(*) FROM 'table_name'、移植性が最も高く、理解しやすく、DBMS 開発者がこの種の一般的な慣用的なクエリを最適化する可能性が高いためです。

それが十分に高速でない場合にのみ、リストされているアプローチをベンチマークして、大幅に高速なアプローチがあるかどうかを確認します。

于 2011-08-04T10:18:13.857 に答える
2

定数をカウントする方がわずかに高速です。

select count('x') from table;

パーサーがヒットcount(*)すると、 によって表されるテーブルのすべての列が何であるかを把握し、*内でそれらを受け入れる準備をしなければなりませんcount()

定数を使用すると、この (わずかではありますが) 列チェックのオーバーヘッドが回避されます。

余談ですが、高速ではありませんが、1 つのかわいいオプションは次のとおりです。

select sum(1) from table;
于 2011-08-04T10:30:05.577 に答える
0

これを捨てるために私が持っていたアイデアの1つは、行数を見積もる方法を見つけることです。これはユーザーにページ数を知らせるためだけのものなので、正確である必要はなく、約4837ページの1ページまたは約4800ページの1ページなどと言うこともできます。

見積もりカウント関数をすぐに見つけることができませんでしたが、テーブルサイズを取得し、決定された/一定の平均行サイズで割ってみることができます。TABLESTATUSからテーブルサイズを取得する方がTABLESTATUSから行を取得するよりも速いかどうか、またはその理由はわかりません。

于 2011-08-04T12:03:18.313 に答える