お世話になります
レコード数の多いMySQLの順番決めに関する構造のベストプラクティスを
皆様にお聞きしたいです
もしかするとアルゴリズムの質問になるかもしれません
例えば以下のように、順番を管理するカラムorderを作って
任意に出力順を決めるような構造にしたとします
id | name | order |
---|---|---|
1 | いちご | 1 |
2 | メロン | 4 |
3 | りんご | 2 |
4 | バナナ | 3 |
SELECT `name` FROM `table` ORDER BY `order` ASC
出力結果は
いちご、りんご、バナナ、メロン
期待通りです
このような「順番用のカラム」を作ってORDERするような構造はよく使われていると思いますが
例えば、10万件ほどのデータがあり
ユーザーが順番を任意にソートして保存できるような機能を採用した場合
例えば、order 50,000位だった列をorder 1位に移動すると5万件のレコードの更新が必要になってしまうと思います
id | name | order(更新前) | order(更新後) |
---|---|---|---|
50000 | そば | 50000 | 1 |
1 | いちご | 1 | 2 |
2 | メロン | 4 | 5 |
3 | りんご | 2 | 3 |
4 | バナナ | 3 | 4 |
5...続く |
ユーザーが順番を任意にソートして保存できる機能ですので
7万位から2万位に動かす場合、5万位から2位 and 6万位から5位 and 2位から9万位など複数のソートがある場合があります
ユーザーが順番を任意にソートして保存できる機能は
一回限定の機能ではなく繰り返し行われます
これが100万件になったら、1億件になったら、ソートだけでとんでもない負荷になると思います
ですので、レコード数が多い場合「順番用のカラム」を作ってORDERするような構造は良いものとは言えないかなと思います
「順番を任意に保存できるようにしたい」「レコード数が多い」場合
みなさんはどのような構造にしているのでしょうか??
なにかアルゴリズムで対応しているのでしょうか
事例やヒントをいただけますと幸いです
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/10 12:26 編集
2020/07/11 06:35 編集
2020/07/11 07:06