-3

Java (JDBC) を使用して MySQL データベースからレコードを取得しています。私はテーブルを持っています - 150 万レコードの Stop_Times と 1 lac レコードの Stops があります。

次のコードを使用しています

ResultSet rs = stm.executeQuery("select distinct(stop_id) from Stop_Times force index (idx_stop_times) where agency_id = '" + agency_id + "' and route_type = " + route_type + " order by stop_id");

while(rs.next())
{
  stop_id.add(rs.getString("stop_id"));               
}

JSONArray jsonResult = new JSONArray();

String sql = "select * from Stops force index (idx_Stops) where stop_id = ? and agency_id = ? and location_type = 0 order by stop_name";

                  PreparedStatement pstm = con.prepareStatement(sql);

                  int rid = 0;

                  for(int r = 0; r < stop_id.size(); r++)
                  {
                      pstm.setString(1, stop_id.get(r).toString());
                      pstm.setString(2, agency_id);
                      rs = pstm.executeQuery();

                      if(rs.next())
                      {
                          JSONObject jsonStop = new JSONObject();
                          jsonStop.put("str_station_id", rs.getString("stop_id"));
                          jsonStop.put("str_station_name", rs.getString("stop_name") + "_" + rs.getString("stop_id"));
                          jsonStop.put("str_station_code", rs.getString("stop_code"));
                          jsonStop.put("str_station_desc", rs.getString("stop_desc"));
                          jsonStop.put("str_station_lat", rs.getDouble("stop_lat"));
                          jsonStop.put("str_station_lon", rs.getDouble("stop_lon"));
                          jsonStop.put("str_station_url", rs.getString("stop_url"));
                          jsonStop.put("str_location_type", rs.getString("location_type"));
                          jsonStop.put("str_zone_id", rs.getString("zone_id"));

                          jsonResult.put((rid++), jsonStop);
                      }                               
                  }

最初のクエリは 6871 レコードを返します。しかし、時間がかかりすぎます。サーバー側では 8 ~ 10 秒、クライアント側では 40 ~ 45 秒かかります。

これらの時間をサーバー側で 300 ~ 500 ミリ秒、クライアント側で約 10 秒短縮したいと考えています。これを行う方法について誰か助けてもらえますか?

4

2 に答える 2

1

Your strategy is to use a first query to get IDs, and then loop over these IDs and execute another query for each of the IDs found by the first query. You're in fact doing a "manual" join instead of letting the database do it for you. You could rewrite everything in a single query:

select * from Stops stops
inner join Stop_Times stopTimes on stopTimes.stop_id = stops.stop_id
where stops.stop_id = ? 
  and stops.agency_id = ? 
  and stops.location_type = 0 
  and stopTimes.agency_id = ? 
  and stopTimes.route_type = ?
order by stops.stop_name
于 2012-05-14T07:34:55.727 に答える
0

Try to get the explain plan associated with your request (Cf. http://dev.mysql.com/doc/refman/5.0/en/using-explain.html) ; avoid full table scan (Explain join ALL). Then add relevant indexes. Then retry.

于 2012-05-14T07:33:36.327 に答える