ランキングの対象となるテーブルに適切にインデックスが張られていて、ランキングの結果が全件でなければ一瞬でランキングの作成が終わると見積れます。
全件に対してランキングを作成する場合、おそらく SELECT がファイルソートになるので、レコード数が多いと時間がかかります。
以下参考例です。
MariaDB [hatena_question]> SHOW CREATE TABLE item;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| item | CREATE TABLE `item` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) NOT NULL,
`count` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `count` (`count`)
) ENGINE=InnoDB AUTO_INCREMENT=204443 DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
MariaDB [hatena_question]> SELECT COUNT(*) FROM item;
+----------+
| COUNT(*) |
+----------+
| 204442 |
+----------+
1 row in set (0.05 sec)
MariaDB [hatena_question]> SELECT * FROM item ORDER BY count DESC LIMIT 10;
+--------+------------+-----------+
| id | name | count |
+--------+------------+-----------+
| 102711 | item102711 | 399298036 |
| 34929 | item34929 | 399297693 |
| 5962 | item5962 | 399292859 |
| 180578 | item180578 | 399286130 |
| 40471 | item40471 | 399285684 |
| 41353 | item41353 | 399282738 |
| 134448 | item134448 | 399281769 |
| 101184 | item101184 | 399280862 |
| 202852 | item202852 | 399280606 |
| 170867 | item170867 | 399277978 |
+--------+------------+-----------+
10 rows in set (0.00 sec)
MariaDB [hatena_question]> explain SELECT * FROM item ORDER BY count DESC LIMIT 100;
+------+-------------+-------+-------+---------------+-------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+-------+---------------+-------+---------+------+------+-------+
| 1 | SIMPLE | item | index | NULL | count | 4 | NULL | 100 | |
+------+-------------+-------+-------+---------------+-------+---------+------+------+-------+
1 row in set (0.00 sec)
MariaDB [hatena_question]> explain SELECT * FROM item ORDER BY count DESC;
+------+-------------+-------+------+---------------+------+---------+------+--------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+---------------+------+---------+------+--------+----------------+
| 1 | SIMPLE | item | ALL | NULL | NULL | NULL | NULL | 204835 | Using filesort |
+------+-------------+-------+------+---------------+------+---------+------+--------+----------------+
1 row in set (0.00 sec)
[サブクエリを使ったランキング]
参考サイトで挙げられている SQL によるランキング集計は、DEPENDENT SUBQUERY になるのでスケールしません。100 件のランキングを作るのでも 3秒 もかかります。全件でランキングを作成しようとするとおそらく終わりません。
PHP でランキング計算をして、データを更新するのがよいでしょう。
MariaDB [hatena_question]> explain SELECT id, count, (SELECT COUNT(*) FROM item sub WHERE sub.count > main.count) + 1 AS rank FROM item main ORDER BY count DESC LIMIT 10000;
+------+--------------------+-------+-------+---------------+-------+---------+------+--------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+--------------------+-------+-------+---------------+-------+---------+------+--------+--------------------------+
| 1 | PRIMARY | main | index | NULL | count | 4 | NULL | 10000 | Using index |
| 2 | DEPENDENT SUBQUERY | sub | index | count | count | 4 | NULL | 204109 | Using where; Using index |
+------+--------------------+-------+-------+---------------+-------+---------+------+--------+--------------------------+
2 rows in set (0.00 sec)
MariaDB [hatena_question]> SELECT id, count, (SELECT COUNT(*) FROM item sub WHERE sub.count > main.count) + 1 AS rank FROM item main ORDER BY count DESC LIMIT 100;
100 rows in set (2.94 sec)
システムをよく理解してなくて、自動終了&ポイント等分になってしまいました。
(終了後に判定するものだとばかり思ってました。)
なお、多くのご意見の中に様々なヒントがあり、これから試行錯誤しようと思います。
ですので、今後このQ&Aを見た人が、これが唯一の回答だ!と言えるものは無いと思い
あえてベストアンサーは選びませんので、ご理解、ご了承ください。
私の方からは説明の中でただし書きを致したつもりですが、ベストな解決策はデータ規模やハードウェアスペックなど環境に依存します。それらを質問者が最後まで明らかにしなかったため、回答者は想像で回答するしかなく、最適な選択を提示できませんでした。それだけです。