0

GUID をキーとして持つ以下のようなテーブルがあります。 GUID をキーとするページングを使用して tis のコンテンツを表示しようとしていますが、どうすればよいでしょうか?

CREATE TABLE `planetgeni`.`PostComment` (
  `PostCommentId` CHAR(36) DEFAULT NULL,
  `UserId` INT   NOT NULL,
  `CreatedAt` DATETIME NULL DEFAULT NULL ,
  .
  .
  .
   PRIMARY KEY (`PostCommentId`)
    )
 ENGINE=InnoDB DEFAULT CHARSET=latin1;

それが Int キーの場合、ストアド プロシージャは次のようになり、desc で次の 10 の順序が得られます。しかし、GUID では、そのタイプのページングを行う方法がわかりません。

getPostComment( int lastPostID)
   where PostCommentId< lastPostID order by PostCommentId desc LIMIT 10;
4

2 に答える 2

0

GUID を使用してこれを行うことはできますが、GUID は疑似乱数でORDER BY postcommentidあるため、順序はおそらく希望どおりにはなりません。ほぼ時系列の順序で何かが必要になる可能性があり、ランダムな GUID で並べ替えると、順序は繰り返し可能になりますが、ランダムになります。

@James のコメントとして、並べ替え順序に別の列を使用することもできますが、その列は一意である必要があります。そうしないと、重複する行を見逃すか ( を使用する場合>)、次のページで値を繰り返すことになります ( を使用する場合>=) 。 .

LIMITで使用するだけOFFSETです。MySQL は LIMIT クエリを最適化するため、ページに必要な行が見つかると、行の調査を中止します。ただし、前の行もすべて調べる必要があるため、番号の大きいページに進むにつれてクエリの負荷が高くなります。

これを軽減するには、いくつかの方法があります。

  • 番号の大きいページをユーザーに表示させないでください。「最後の」ページへの直接リンクを提供しないでください。「次へ」のページへのリンクを提供し、クエリのコストが非常に高くなる前に検索をあきらめることを願っています。

  • 一度に複数のページを取得し、キャッシュします。たとえば、の代わりに、結果を memcached などに保持するLIMIT 10ことができます。LIMIT 70アプリケーション コードを使用して、ユーザーがその行のセットを進めるまで、一度に 10 行を表示します。次に、8 ページ目に進んだ場合にのみ、別の SQL クエリを実行します。通常、ユーザーは数ページしか検索しないため、2 番目または 3 番目のクエリを実行する必要がある可能性は非常に低くなります。

于 2014-06-10T19:20:25.550 に答える