4

変更されない固定テーブルがあります。私は80,000行を超えています。

CREATE TABLE `word_list_master` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `word` varchar(64) NOT NULL,
  `created` int(11) NOT NULL,
  `frequency` int(11) NOT NULL,
  `number_of_files` int(11) NOT NULL,
  `combined_frequency` bigint(24) NOT NULL,
  PRIMARY KEY (`id`)
)

Combined_frequency 列によって並べ替えられた行のランクを決定する 7 番目の列 'rank' を作成したいと考えています。データベースが稼働中のときのオーバーヘッドを減らすためにこれを行っています。

MySQL ステートメントを介してこれを行うことはできますか、または PHP で一連の SELECT/INSERT ステートメントを作成する必要がありますか? これまでほとんどの作業を PHP で行ってきましたが、テーブルに対する操作を実行するには最大 24 時間かかります。

RANK 関数を調べていましたが、私の MySQL の能力はかなりの容量しかないため、問題が発生しました。

4

2 に答える 2

2

通常、このような質問に対する有効な回答として「これを行わないでください」とは考えませんが、新しい列を追加することで状況を改善することはできません。データを並べ替えるための数値列が既にあります。この目的で 2 番目の数値列を追加することは、やり過ぎであるだけでなく、設計としても不適切です。

80,000 行 (それほど多くはない) しかないテーブルで操作を行うのに「最大 24 時間」か​​かる場合は、検索/並べ替え/結合に使用される列にインデックスを追加する必要があります。

于 2012-10-01T14:58:16.123 に答える
1

rankテーブルにフィールドを追加する方法は次のとおりです。

 SET @rownum = 0; 

 SELECT *,  (@rownum := @rownum + 1) AS rank
 FROM word_list_master
 ORDER BY combined_frequency DESC;

更新:そのランク フィールドに対してクエリを作成する場合は、次のように前のテーブルを派生テーブルとして使用する必要があります。

SET @rownum = 0; 
SELECT *
FROM
(
   SELECT *,  (@rownum := @rownum + 1) AS rank
   FROM word_list_master
   ORDER BY combined_frequency DESC;
) t
WHERE rank = 5

そして、次のようにクエリをページングしたい場合:

SET @rownum = 0; 
SELECT *
FROM
(
   SELECT *,  (@rownum := @rownum + 1) AS rank
   FROM word_list_master
   ORDER BY combined_frequency DESC;
) t
WHERE rank BETWEEN ((@PageNum - 1) * @PageSize + 1)
AND (@PageNum * @PageSize)

アップデート:

これを行う[LIMIT {[offset,] row_count }]ための標準的な mysql の方法である . クエリから限られた結果セットを取得したいだけの場合は、前の方法を使用しないでください。

于 2012-10-01T14:26:23.443 に答える