みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

MySQLのLIMIT 1指定について。

JAVAで、MySQLを書いています。
(理由は不明ですが、たまに、言語がわからないと、SQL文を提示できないという方がいるので、「JAVAで」と書いてあります。MySQLは、言語に依存しないと思っているのですが。)

よくここで、どのように、SQL文を書いたらよいか質問しております。

それは、書き方がわからないときもあるし、
わかってはいるが、もっと簡潔、早い、見やすい、メモリの消費が少ない
などのSQLを求めているからです。


質問が的を得ていないときもあり、質問が難しいのですが、
テーブル例などを書くようにして、質問しています。

ご回答は、みなさん、それぞれ、色々なSQL文を書いてくれます。
難しいのやパッとみて、ああっ、それ簡単で早そう!!
というのとか、あります。

ところで、1行だけのレコードが欲しいと質問したときに、
SQL文に、LIMIT1 をつける方とつけない方がいます。

LIMIT 1 の有無による、速度や、メモリ使用量など、
メリット、デメリットを教えてください。

投稿日時 - 2015-07-16 09:26:34

QNo.9013114

困ってます

質問者が選んだベストアンサー

こんにちは。

ははぁ・・・なるほど。
以前の質問から順番に読んで、ご質問の意図がわかりました。

LIMIT句を付けた場合のオプティマイザの挙動については、公式ドキュメントを見る事が良い方法です。
MySQLがどのようにクエリーを解釈して実行するかが書かれています。
ご質問にあるメリットは、まさにコレです。

>常に少しでも最適、さらに最適な方法がないかを追求していくのが、
>面白い仕事のやり方だとも考えます。
同感ですね。
まぁ、追求できない(させてくれない)現場も多々ありますが・・・。

参考URL:http://dev.mysql.com/doc/refman/5.6/ja/limit-optimization.html

投稿日時 - 2015-07-16 15:19:10

補足

結局なにをしたいかといいますと、
当社も、「顧客第一主義」ですので、ユーザー様によりよりもののご提供、万が一の時の復旧の速度、などを考慮したものを、ご提供したいと考えて、ご質問させていただいております。
ですので、時々、バカみたいなSQLの質問で、馬鹿にされたり、けなされたり、もう質問するな!!、と言われ、気にはなりますが、お客様の為にとおもい。

みなさまのご回答のお手数をお借りしている次第です。

投稿日時 - 2015-07-16 15:48:01

お礼

ご回答ありがとうございます。
SQLは、同じ目的を達成することに対して、
書き方が人それぞれで、あっ、これは、簡単だし、早そう!!というのから、
in とか使ったり、サブクエリーを使ったりして、
難しそうだけど、早いのかな?
かっこよい理想的な書き方なのかな?

など、考察や実際にプログラムに埋め込んでいる日々です。

こんな書き方をすると、回答者の皆様に失礼ですが、
SQL文のコンテストみたいなものです。

いかにすばらしいSQL文を提示してくれる方があわられるかを
楽しみにしています。

私のプログラムは、勝手にですが、きれいに、スマートに、簡潔に、早く、読みやすく、バグをださない、出してもすぐに原因を追究でき復旧がはやい、を当たり前のことですが、それで行きたいと、
仕事=プロなので、当たり前のことですが、こだわっています。

投稿日時 - 2015-07-16 15:42:23

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

SELECT TOP 1 *
FROM food
WHERE food_id=1
ORDER BY entry_date DESC;

SELECT *
FROM food
WHERE food_ID=1 AND Entry_date=(Select Max(Entry_date) FROM food WHERE food_ID=1);

この2つのSQL文は同一の結果を返します。で、その実行速度ですが、当然に前者が速いと推測されます。

Option Compare Database
Option Explicit

Private Sub コマンド2_Click()
  Dim I As Integer
  Dim S As Single
  Dim E As Single
  Dim R As String
  Dim Q As String
  
  Q = "SELECT TOP 1 * FROM food WHERE food_id = 1 ORDER BY entry_date DESC;"
  S = Timer
  For I = 1 To 10000
    R = DBSelect(Q)
  Next I
  E = Timer
  Debug.Print R
  Debug.Print "E-S=" & E - S
End Sub

推測が当を得ているのかどうかは、上記のテストで証明できます。テストでは、添付図のように1万分の7.6秒ほどLIMIT句を用いた方が速いという結果が出ています。

PS、プログラミングにおいて速度や、メモリ使用量云々の考察する時代は過ぎ去った。

Javaプログラミング科に入学してMySQLのコマンドラインツールやCDレンタルシステムを作成した際の講師の話。

>プログラミングにおいて速度や、メモリ使用量云々の考察する時代は過ぎ去った。
>安直に簡単に書くのが一番。

私も、同感です。私が、最初にプログラミングしたPCのメインメモリは僅かに12K。とにかく、速度や、メモリ使用量を気にしたもんです。でも、今は、PCの性能は雲泥の差。仮に差があっても1万分の1秒の世界。「安直に簡単に!」が一番ですよ。

投稿日時 - 2015-07-16 10:11:04

補足

と思いましたが、
常に少しでも最適、さらに最適な方法がないかを追求していくのが、
面白い仕事のやり方だとも考えます。
特に、他の処理も当然うごくので、そこで微々たるものでも、
積もり積もって、何千人分もの処理をするとなることを考えると...

投稿日時 - 2015-07-16 13:19:27

お礼

ご回答ありあがとうございます。
速度やメモリに差が無い様なら、何千人が朝、一度にアクセスしてきても、
うちの会社のサーバーも負荷がかわらない。

あまり細かいことをきにせず、
見やすいSQL文(=バグの少ない&メンテナンス性の良い)を書くのがよさそうですね。

投稿日時 - 2015-07-16 10:48:28

あなたにオススメの質問