JDBCでのLIMIT句について

このQ&Aのポイント
  • JDBC(mysql-connector-java-3.1.8-bin.jarを使用)にて、MySQLからデータを取得するプログラム中で、limitが500件までに設定しているにもかかわらず、whereでの条件に適合するデータが多いとクエリの実行に非常に時間がかかり、結局OutOfMemoryで止まってしまいます。
  • データ数20万件程のテーブルからデータ取得を行う際、JDBCを使ってselect文を実行し、where条件を設定した際に問題が発生しています。制限した件数までデータを取得するはずなのに実行時間が長く、最終的にはOutOfMemoryエラーが起きてしまいます。
  • JDBCを使ってMySQLのテーブルからデータを取得する際、データ数が多い場合にlimit句を使用しても正しく動作しない場合があります。where条件に合致するデータが多い場合、クエリ実行に非常に時間がかかり、メモリ不足エラーが発生します。この問題を解決する方法について教えてください。
回答を見る
  • ベストアンサー

JDBC(MySQL Connector J/)でのLIMIT句について

JDBC(mysql-connector-java-3.1.8-bin.jarを使用)にて、MySQLからデータを取得するプログラム中で、どうしても解決できない問題がありご質問させて頂きました。 初心者で申し訳ございませんがご教授お願い致します。 上記のJDBCを使ってデータ数20万件程のテーブルから select * from test_table where id>100 order by id asc limit 0,500 のような感じでデータ取得を行うと、limitが500件までに設定しているにもかかわらず、whereでの条件に適合するデータが多いと(例えばwhere id>1)クエリの実行に非常に時間がかかり、結局OutOfMemoryで止まってしまいます。OutOfMemoryで止まるということは返ってくるデータが大きすぎるのかとも思いましたが、LIMITで制限しているし、何故か分からず困り果てております。 私が仕組みを理解していないだけなのかもしれませんが、宜しければご教授頂けませんでしょうか?宜しくお願いいたします。

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

単純計算(1レコードあたりのバイト数×500)するとデータ量はどのくらいなんですか? Limit句を使っても500件のデータが大きければOutOfMemoryになりますよ。

chanter
質問者

お礼

ご回答ありがとうございます。それが、同様のデータから同様のクエリーでStatementのsetMaxRowsで500をセットするとOutOfMemoryは起きないのですが、私はどこか仕様を勘違いしているのかと心配になっています。

関連するQ&A

  • Mysql5.5.22接続時のJDBCドライバ

    Mysql5.5.22にTomcat7を使用し接続を行っているのですが mysql-connector-java-5.5~.jar というようなJDBCドライバファイルが見つからずに mysql-connector-java-5.1.13-bin.jarを使用しているのですが問題ないでしょうか。 また、mysql-connector-java-5.5.22等は存在しないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQL と JDBCで・・・

    質問させてください。 windows98に ・j2sdk-1_4_1_07-windows-i586.exe ・mysql-4.0.25-win32.zip ・mysql-connector-java-3.1.10.zip をダウンロードしました。 環境変数を設定し javaソースコードを作成しました。 コンパイルは出来たのですが、実行すると コマンドプロンプトに java.sql.SQLException: Access denied for user: '@localhost' to database 'hellodb ' at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2921) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:770) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1228) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2544) at com.mysql.jdbc.Connection.<init>(Connection.java:1474) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java :264) at java.sql.DriverManager.getConnection(DriverManager.java:512) at java.sql.DriverManager.getConnection(DriverManager.java:193) at HelloWorldJDBCMySQL.main(HelloWorldJDBCMySQL.java:15) と表示されてしまいます。 過去ログを見させていただきましたが自分の求める回答を見つけきれませんでした。 どなたかご教授のほど、よろしくお願いします。

  • MySQLのLimit句によるページ分割について

    MySQL初級です。 PHP+MySQLで、検索ページを作成しています。 SELECT部を簡略して書くと・・ (ページ番号$get_pageNoをGETで渡して、10件ずつ検索結果を表示したい。) $sql = "SELECT Id FROM houjin WHERE (word LIKE '%${ワード}%')"; $sqlLimit .= "ORDER BY Id ASC limit " . ($get_pageNo*10) . ", 10"; 表示まではできていて、前へ、次へ、のリンクで、10件ずつ抽出できるところまでは、 できました。 さらに、抽出されたレコードに、チェックボックスをつけて、 ユーザーに選択させて、処理(削除など)を行いたいわけです。 表示されたあるレコードにチェックをつけて、 次のページのレコードにもチェックをつけて、 一括処理(削除など)ができる方法を探しています。 ページ番号をGETで渡してリロードさせているので、 チェックされたレコード番号もGETで渡す、しか方法はないでしょうか? Limitにこだわってはいません。 よい方法、アイデアがあれば教えてください。

    • ベストアンサー
    • PHP
  • JDBCドライバについて

    JavaからアクセスしたいのでJDBCドライバをインストール、設定しようとしたのですが、Tomcatに組み込むやり方がわかりません。このサイトを参考にしてやったのですが・・・ << db105.java >> データベース(0):JDBCドライバ JavaのプログラムからMySQLのデータベースへ接続するにはJDBCドライバが必要である。 ●JDBCドライバのダウンロードとインストール (1)Webブラウザで、http://www.mysql.com/downloads/に接続する。 ダウンロードするバージョン(MySQL Connector/J 3.0)をクリックする。 (2)http://dev.mysql.com/downloads/connector/j/3.0.htmlに切り替わる。Downloadをクリックする。 (3)ダウンロードが始まるので、保存先をデスクトップにする。ファイル(mysql-connector-java-3.0.15-ga.zip)がデスクトップに保存される。 (4)ZIP形式のファイル(mysql-connector-java-3.0.15-ga.zip)を解凍する。デスクトップ上のディレクトリ(mysql-connector-java-3.0.15-ga\mysql-connector-java-3.0.15-ga)内のファイル(mysql-connector-java-3.0.15-ga-bin.jar)にJDBCドライバが存在する。 (5)JDBCドライバを環境変数CLASSPATHに追加する。 SET CLASSPATH=%CLASSPATH%;c:\mysql-connector-java-3.0.15-ga\mysql-connector-java-3.0.15-ga-bin.jar;. ただし、JDBCドライバは、 c:\mysql-connector-java-3.0.15-ga\mysql-connector-java-3.0.15-ga-bin.jarに存在する。 ●Tomcatに組み込む。 ファイル(mysql-connector-java-3.0.15-ga-bin.jar)を %CATALINA%\shared\libの下にコピーする。その後、再起動する。 2番目の黒丸の%CATALINA%\shared\libが全くみつからないです。教えてください~;;

    • ベストアンサー
    • MySQL
  • JDBCについて…

    MySQLはMySQL Server 4.1 SDKはjdk1.5.0_11で JDBCはmysql-connector-java-5.0.4 を実行環境としているのですがクラスパスについてよくわかりません。 一応ユーザー環境変数は 変数名 CLASSPATH 変数値 .;jdk1.5.0_11\lib\tools.jar;mysql-connector-java-5.0.4-bin.jar 変数名 PATH 変数値 jdk1.5.0_11\bin を設定しました。 これでパスが通ってるか判断できない状態です。 もし通っていないならどのように変更したらよいのでしょうか? よろしくお願います。

  • MySQLでJDBC接続をTomcatで接続できないです。。。。

    JDBC接続を現在勉強しています。 そこで、eclipseの中にTomcatをプラグインして、javaからデータベースに接続を心みているのですが、エラーが出て自分なりにいろいろ試したのですが、どうしてもエラーが消えません。 ご指摘いただけたらと思います。 エラー内容 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 環境内容 windows xp professional Eclipse 3.3 (C:\eclipse) Tomcat 5.5 (C:\eclipse\servers\tomcat-5.5) java (C:\Program Files\Java\jdk1.6.0_06) MySQL (D:\mysql-5.0.67-win32 データベースはDドライブにおいています) JDBCドライバー mysql-connector-java-5.1.6-bin.jar(C:\eclipse\servers\tomcat-5.5\common\libの配下に設定) PATHの設定 CLASSPATH C:\eclipse\servers\tomcat-5.5\common\lib javaのソースコード import java.sql.*; public class JdbcMySQLTest { public static void main(String[] args) { try { // ドライバクラスをロード Class.forName("com.mysql.jdbc.Driver"); // MySQLの場合 // データベースへ接続 String url = "jdbc:mysql:///hellodb?useUnicode=true&characterEncoding=SJIS"; Connection con = DriverManager.getConnection(url); // ステートメントオブジェクトを生成 Statement stmt = con.createStatement(); String sql = "SELECT * FROM HELLO_WORLD_TABLE"; // クエリーを実行して結果セットを取得 ResultSet rs = stmt.executeQuery(sql); // 検索された行数分ループ while (rs.next()) { // NOを取得 int no = rs.getInt("NO"); // 言語を取得 String lang = rs.getString("LANGUAGE"); // メッセージを取得 String msg = rs.getString("MESSAGE"); // 表示 System.out.println(no + " " + lang + " " + msg); } // データベースから切断 stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } } 上記コードをEclipseから実行しますとコンソール上に java.lang.ClassNotFoundException: com.mysql.jdbc.Driver at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:169) at jp.co.Beas.JdbcMySQLTest.main(JdbcMySQLTest.java:11) になってしまいます。 JdbcMySQLTest.java:11からcom.mysql.jdbc.Driverが ないですよ~といっているのは理解しているのですが そこでいろいろドライバーの配置などを変更したのですが エラーがやはりかわりません。 ながながとなって申し訳ございませんが、ご教授いただけたらと思います。

  • MySQLのLIMITで指定通りに取得できない原因

    PHPとMySQLについて勉強しています。 ページ制御で各ページのボタンを押すと、 MySQLのLIMITで何番目~何番目のデータを取得して 表示させるものを作ってみたいと思っています。 作ったコードはこちらにあります。 PHP https://box.yahoo.co.jp/guest/viewer?sid=box-l-co4ivitvpdo32iqddqwd3piwfi-1001&uniqid=f76637ed-5a9b-4eff-8b84-b4c74045a0e6&viewtype=detail MySQL https://box.yahoo.co.jp/guest/viewer?sid=box-l-co4ivitvpdo32iqddqwd3piwfi-1001&uniqid=fdeb7fdb-3969-4a60-bbdc-3142d0982c9e&viewtype=detail $mysql_Code_Limit = $mysql_Code." LIMIT ".$limit_start.",".$limit_end; でecho $mysql_Code_Limit;とすると SELECT * FROM infotable LIMIT 0,2 や SELECT * FROM infotable LIMIT 12,14や SELECT * FROM infotable LIMIT 24,26 など ちゃんと思い通りになっているのですが、 実際に表示される内容は、 1ページ目:id1~id2:2行分取得 2ページ目:id4~id8:5行分取得 3ページ目:id7~id14:8行分取得 4ページ目:id10~id20:11行分取得 5ページ目:id13~id26:14行分取得 6ページ目:id16~id30:15行分取得 7ページ目:id19~id30:12行分取得 8ページ目:id22~id30:9行分取得 9ページ目:id25~id30:6行分取得 10ページ目:id28~id30:3行分取得 といったようにおかしくなります。 上記の特徴は、SELECT ~ Limit A , B;だとすると Aは3ずつ増加 Bは3+3増加 といった状態です。 なぜこのようなことになってしまうのでしょうか。

    • ベストアンサー
    • PHP
  • JDBCレルムによるFORMパスワード認証

    JDBCレルムによるFORMパスワード認証 以下のようなエラーが出てデータベースに接続できません: 2010/03/28 4:13:21 org.apache.catalina.realm.JDBCRealm start 致命的: データベース接続オープン中に例外が発生しました java.sql.SQLException: org.gjt.mm.mysql.Driver at org.apache.catalina.realm.JDBCRealm.open(JDBCRealm.java:704) at org.apache.catalina.realm.JDBCRealm.start(JDBCRealm.java:786) server.xmlのデータベースに関する部分は以下の通りです: <Realm className="org.apache.catalina.realm.JDBCRealm" connectionURL="jdbc:mysql://127.0.0.1/authorization" driverName="org.gjt.mm.mysql.Driver" connectionName="root" connectionPassword="" ←ここは空欄でいいですか? roleNameCol="role" userCredCol="password" userNameCol="username" userRoleTable="roles" userTable="users" /> …検索してみるとorg.gjt.mm.mysql.Driverは古いのでcom.mysql.jdbc.Driverを使うべき、とありました (http://www.javadrive.jp/servlet/auth/index5.html)。 しかし、org.gjt.mm.mysql.Driverをcom.mysql.jdbc.Driverに変えてみましたが、結果は変わりません。 本来、どちらが正しいのでしょうか? ←まずはこの質問の回答をお願いします あと、自分のMySQLはユーザー名は"root"で設定してあるのですが、パスワードは設定していません (つまり、MySQLをコマンドラインから起動するときはパスワードを空欄のままEnterを押して入れます)。 自分の場合、connectionNameとconnectionPasswordは上記の通りで良いのでしょうか?  ←次にこの質問の回答をお願いします Tomcatのライブラリは以下の通りです: Directory of C:\apache-tomcat-6.0.26\lib [.] [..] annotations-api.jar catalina-ant.jar catalina-ha.jar catalina-tribes.jar catalina.jar el-api.jar jasper-el.jar jasper-jdt.jar jasper.jar jsp-api.jar servlet-api.jar tomcat-coyote.jar tomcat-dbcp.jar tomcat-i18n-es.jar tomcat-i18n-fr.jar tomcat-i18n-ja.jar MySQLのデータはちゃんと入力されており、MySQL単体であれば、もちろん動作します: mysql> select * from roles; +----+----------+--------+ | id | username | role | +----+----------+--------+ | 1 | nakamura | member | | 2 | tanaka | member | +----+----------+--------+ mysql> select * from users; +----+----------+----------+ | id | username | password | +----+----------+----------+ | 1 | nakamura | 1234 | | 2 | tanaka | 5678 | +----+----------+----------+ …では、宜しくお願いします。

    • ベストアンサー
    • Java
  • JDBCドライバのインストール

    サーブレットからMySQLサーバにアクセスするために、MySQL用のJDBCドライバをインストールしようとして、 http://www.mysql.com/downloads/connector/j/から mysql-connector-java-5.0.4-bin JARファイルをダウンロード してきましたが、本には%CATALINA_HOME%/common/lib にコピーする ように書いてあるのですが、該当ディレクトリが存在しません。(古い本のせいでしょうか。)どこにコピーしたらよいのかわからず途方にくれています。どなたか教えてください。よろしくお願いします。

  • EclipseのJDBCドライバーについて

    Eclipse3.1、MySQL、Tomcat、をインストールして、JDBCドライバーをインストールしました。(features、pluginsをEclipseのフォルダ内に上書き保存) また、Javaのファイル\jdk1.5.0_05\lib\extと、\jre1.5.0_05\lib\extの\両方に(本当はどちから一方でいいのですが、わからなかったので)mysql-connector-java-3.1.11のフォルダとmysql-connector-java-3.1.11-bin.jarをコピーしました。 MySQLにてテーブルを作成して、これをEclipseから呼び出そうとしました。DbEditに切り替えてtableタグの中に新しいデータベースの設定を行い、呼び出そうとしましたが、エラーが出ました。サーバーのURLである、jdbc:mysql://host/MySQLdataに接続できないといったメッセージです。 どこを確認したらよろしいかを経験者の方ご教授お願いします。 Eclipse3.1、MySQL、Tomcatは書籍の付録CDからですので、バージョンの整合性は合っています。 Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION **... dbedit.core.DataException: Couldn't connect to:jdbc:mysql://host/MySQLdata com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.net.UnknownHostException MESSAGE: host: host STACKTRACE: java.net.UnknownHostException: host: host at java.net.InetAddress.getAllByName0(Unknown Source) at java.net.InetAddress.getAllByName0(Unknown Source) at java.net.InetAddress.getAllByName(Unknown Source) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:137) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:284) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2541) at com.mysql.jdbc.Connection.<init>(Connection.java:1474) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266) at dbedit.internal.core.JdbcManager.internalOpenConnection(JdbcManager.java:1751) at dbedit.internal.core.JdbcManager.openConnection(JdbcManager.java:804) at dbedit.internal.core.Dataspace.openConnection(Dataspace.java:217) at dbedit.internal.core.Database.connect(Database.java:61) at dbedit.ui.internal.ConfigureConnectionsAction$Opener.run(ConfigureConnectionsAction.java:185) ** END NESTED EXCEPTION ** Last packet sent to the server was 0 ms ago.

    • ベストアンサー
    • Java

専門家に質問してみよう