今日、指定された ID 値の順序で結果セットを返す必要があるクエリがあるという問題に遭遇しました。実際、ソートのためにプログラムに配置することもできるのですが、突然確認したいと思いました。 Mysql を使って直接クエリして返すことができたので探してみたのですが、実際には補助関数を実装する必要がありました。
Field() 関数
Mysql には、指定した順序で並べ替えをカスタマイズできる関数 Field() が用意されています。
例:
主キー ID と名前属性名を持つ地域という名前の都市情報テーブルがあるとします。次に、ID 2、3、1 をクエリして、この順序で返したいとします。
<p>select id, name from regions;#id name<br> 1 北京 2 上海 3 深圳<br></p>
Use field()
<p>select id, name from regions order by field(id, 2, 3, 1);#id name<br> 2 上海 3 深圳 1 北京<br></p>
これにより、カスタム順序で並べ替えるという目的が達成されます
パフォーマンス
<p>mysql> explain select id from regions order by field(id, 2, 3, 1);+---+-------------+---------+------+---------------+-----+---------+-----+------+-----------------------------+|id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra ||-- | ----------- | ------- | ---- | ------------- | --- | ------- | --- | ---- | ----------------------------| |1 | SIMPLE | regions | index| NULL | id | 4 | NULL| 3 | Using index; Using filesort |+---+-------------+---------+------+---------------+-----+---------+-----+------+-----------------------------+<br></p>
を使用しているため、 Order By Field が指定されている場合、主キーは主キー ID に従ってソートされます。主キー インデックスが存在します。この ID を使用して、条件が 2、3、および 1 に等しいレコードを検索します。 Extra には、Using インデックスがあります。別のインデックスに変更すると、インデックスは存在しません。ここのフィールドにはインデックスがありません。 Order By 句はこのインデックスを使用できず、Filesort 並べ替えのみを使用できます。これが、Extra に Filesort の使用がある理由です。
#おおよそのプロセスは次のとおりです。 #ID インデックスから リーフ ノードから開始して、すべてのリーフ ノードを順番にスキャンします 各リーフ ノードによって記録された主キー ID に従って主キー インデックス (クラスター化インデックス) に移動し、実際の行データを見つけます
行データが id = 2, 3 を満たすかどうかを判定します。 1. 条件を満たしていれば取り出して返します
基本的にはテーブル全体を走査する必要がありますが、選択したレコードの ID を検索するという人もいますFIELD リスト内の位置をソート基準として使用して位置を返します。
このような使用法は、ファイルソートを使用することになります (もちろん、ファイルソートを使用すると必ずしも遅くなるわけではありません。使用しないより速い場合もあります)。これは非常に非効率な並べ替え方法です。
通常、ORDER BY 句は LIMIT 句と組み合わせて、一部の行のみを取得します。上位 1 行を取り出すためだけにすべての行をソートする場合、これは明らかに効率的なアプローチではありません。
概要
Field() 関数は、データベース層で必要な並べ替えを直接完了し、ビジネス コードを簡素化するのに役立ちますが、同時に次のことも行います。互換性とパフォーマンス 問題の提案は、データ変更の頻度が低い場所や長期キャッシュがある場所で使用できます。データ量が多い場合は、データベースを使用してデータをクエリし、データを並べ替えることができます。プログラム.
推奨される学習:《mysql ビデオ チュートリアル
》以上がこの記事では、Mysql が ID 値の順序に基づいて結果を返す方法について説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。