プログラミングMySQLのlimitを使用した場合、オフセット部分が増えるとパフォーマンスが低下する場合の対処方法メモ。データベースからlimit指定で必要な情報を抜き出すのは便利ですが、インデックスが使われていなかったりして激重になるケースもよく見かけます。自分自身の勉強も兼ねて大量データに対するlimitの使い方を色々調べてみました。まとめまずはlimitの処理内容を理解する例文からlimitの内部処理がどうなっているのかを見てみましょう。10;上記の場合「データを100から10個だけ取得」ではなく「110個データを取得してから先頭から100個を捨てる」という処理が行われます。初心者がMySQLのlimitで重いと勘違いしやすい部分でしょう。desc;limitだけで全ての処理を行っているようなプログラムを見かけますが、適した関数を選択することでパフォーマンスの維持に繋がりますね。BY句の両方で同じカラムを指定することが必要になりますので、柔軟な利用には適していないかもしれません。大量データのオフセットのパフォーマンスそれでは100万件以上あるデータを取り扱う場合で見ていきます。100万件の後半を取得する処理をみてみます。前述した通り100万件取得して99万9990件を捨てる処理になってしまっているということですね。念のため100万件の前半をオフセットで取得してみましょう。sec)本来はこのぐらい早くないとダメですよね。対処方法プライマリキーを使って条件を絞る!番号に抜けがない時に使える小技ですね。sec)圧倒的にlimitのパフォーマンスが上がりました。by」を付与して使っても問題ありません。2010-06-12AmazonKindle楽天ブックスまとめMySQLで大量データを取り扱う局面ではこういった小技を知っておかないとサーバー処理はパンクしてしまいます。逆に数百件程度なら、目に見えるパフォーマンス低下が起こらないので、無駄な処理に気づきにくいかもしれません。インデックスやプライマリ、並べ替えなどクリーンにガシガシMySQLを使っていきたいですね。今日も知識欲は止まらない。LINKrockets関連記事Androidアプリのapkを解析してソースコードを見れるの?Androidアプリを解析する方法が気になって調べてみると、とても簡単に解析できてしまうことに驚きます。難読化といった処置を...PHPなどでDB不要のCMSブログがまだまだ使えそうデータベースまで利用してわざわざ作るほどでもないブログや、データベースが使えないサーバーだったり、とにかく軽量化されたブログを目指したり...MySQLのrand()ランダム関数の負荷問題を考えてみるMySQLで結構使う場面が多いランダム関数rand()ですが、間違った指定をするとデータベースに思わぬ負荷をかけることになります。有料版を含む検索APIが終了してしまいました・・・。APIを利用したウェブアプリケーションのリスクですね。recipien...MySQLでTAG機能としてタグ付けを実装するデータベース設計を考えるブログなどでも「タグ機能」って便利ですよね。カテゴライズとはまた違うタグ機能をMySQLを使って設計する時に、どのように実装するかを検討...PHPのjson_encodeがUTF-8がエラーになってしまう時に対処方法PHPでjson_encodeがUTF-8を指定していても、なぜか以下のエラーになる場合があります。LINKAbout何これ?どっちがいいの?という知識欲が止まらない性分の「ロケッツ」です。ウェブ業界に住み着いて長いです。靴に例えると78足ほど履き潰したぐらいです。