MySQLでは、データをクエリする際にorder by句を使用し、かつorder byフィールドに重複値が存在する場合、さらにlimit句を組み合わせてページングクエリを行うと、2ページ目のデータが1ページ目のデータと重複する問題が発生する可能性があります。これは、MySQLがソート時にヒープソートの方法を使用しているためです。ヒープソートは不安定なソート方法であり、重複値が存在する場合、出力結果が毎回一致しません。したがって、「order by ... limit ...」のシナリオを使用する際には、最適な解決策は「order by」のフィールドにインデックスが存在するようにすること、または「order by」のフィールドに他のフィールドを追加してデータの一意性を維持することです。
この問題に対し、読み取り専用分析エンジンではページング順序保持機能をサポートしています。これにより、ユーザーはこのようなシナリオにおいてデータベースの論理を考慮する必要がなく、従来のクエリ方法をそのまま使用してもorder by ... limit...の出力結果に重複が発生せず、順序の一貫性を確保できます。
実装原理
読み取り専用分析エンジンは、SQL実行でソートとページングを行うSQLシナリオにおいて、ビジネスソートロジックを確保した後、デフォルトで全量データに対して暗黙のソートを行います。これにより、Limit操作を使用する際に発生するデータ重複問題を回避できます。
順序保持シナリオ
order by句がなく、limit句だけがあるシナリオです。
order byフィールドに重複値が存在する場合、出力結果の一部のフィールドのみに対してソートが行われます。
サブクエリにはソートが含まれていますが、外側のクエリではソートが行われていません。
性能影響
ページング順序保持機能を有効にすると、追加的なソート操作が導入されるため、一部のクエリでパフォーマンスの低下が発生する可能性があります。業務の実際状況に基づき、ページングソート機能を使用するかどうかをご選択ください。
使用説明