2016-08-09 9 views
0

非常に頻繁に更新されるカラム(好き、ポイントなど)を使ってmysqlテーブルをソートしてページを作成しなければならない問題に悩まされています。ユーザーが2番目のページに達すると、ソート順が好きな値の変更によって変更されている可能性が非常に高いため、カーソルベースのアプローチを使用するインターネットでは読んだが、いくつかの固定列を使用しているIDや日付時刻などです。そして、それはサーバーの目的ではありません。MySQL頻繁に更新されるカラムとページネーションによるテーブルのソート

私は現在、表示されているIDをユーザーから取得していて、以前に表示されたレコードを選択しないようにNOT IN条件で使用していますが、その解決策は速度と最適化の点では適切ではありません。

ご迷惑をおかけして申し訳ございません。

おかげ

+0

結果セットが十分に小さい場合は、あなたがオーバーテーブル全体を送信し、改ページを扱うことができますdatatables.netのようなものでクライアント側 –

+0

あなたのコメントをありがとう、私が扱っているテーブルは約900kの行があります。 – TilalHusain

+0

紛らわしい解決策はありません。しかし、好き嫌いの数が多いほど、頻繁に変わる順序が変わる可能性は低くなります。 – Jakumi

答えて

0

まず、別の、パラレル、表の中に "頻繁に更新された列" に移動。これにより、他の列に触れるのではなく、「お気に入り」を更新することとの競合を避けることで、システムをより効率的にすることができます。

このようなテーブルは、id(メインテーブルの場合はJOINingの場合)とlikesの2つのカラムしか持たないでしょう。今、あなたはページ分割へのアプローチを "中止した場所を覚えている"ように態勢を整えています。

しかし、$ leftoff_id、$ leftoff_likesは、中止した箇所を覚えておくために2つのことを把握してください。 「下降」したいと仮定:

PRIMARY KEY(likes, id) -- for this query 
INDEX(id, likes) -- for maintenance and JOINs 

SELECT likes 
    From Likes 
    WHERE likes <= $leftoff_likes 
     AND (id < $leftoff_id OR likes < $leftoff_likes) 
    ORDER BY likes DESC, id DESC 
    LIMIT 10; 

(MySQLがORDER BY x DESC, y ASCのインデックスを使用することはできませんので、私はid DESCを使用しています。)

関連する問題