पर MySQL क्वेरी को अनुकूलित करना मैं जेडीबीसी के साथ mysql का उपयोग कर रहा हूं।बड़ी तालिका
मेरे पास एक बड़ी उदाहरण तालिका है जिसमें 6.3 मिलियन पंक्तियां हैं जिन्हें मैं कुशल चुनिंदा प्रश्नों को करने की कोशिश कर रहा हूं। नीचे देखें:
मैं मेज पर तीन अतिरिक्त अनुक्रमणिका बनाया है, नीचे देखें:
एक SELECT
क्वेरी करने से इस SELECT latitude, longitude FROM 3dag WHERE timestamp BETWEEN "+startTime+" AND "+endTime+" AND HourOfDay=4 AND DayOfWeek=3"
की तरह एक रन टाइम 256,356 एमएस में अत्यंत उच्च, या एक छोटे से है कि है चार मिनट से ऊपर मेरा एक ही प्रश्न पर समझाने के लिए मुझे देता है यह:
डेटा पुन: प्राप्त करने के लिए मेरे कोड के नीचे है:
Connection con = null;
PreparedStatement pst = null;
Statement stmt = null;
ResultSet rs = null;
String url = "jdbc:mysql://xxx.xxx.xxx.xx:3306/testdb";
String user = "bigd";
String password = "XXXXX";
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(url, user, password);
String query = "SELECT latitude, longitude FROM 3dag WHERE timestamp BETWEEN "+startTime+" AND "+endTime+" AND HourOfDay=4 AND DayOfWeek=3";
stmt = con.prepareStatement("SELECT latitude, longitude FROM 3dag WHERE timestamp>=" + startTime + " AND timestamp<=" + endTime);
stmt = con.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
rs = stmt.executeQuery(query);
System.out.println("Start");
while (rs.next()) {
int tempLong = (int) ((Double.parseDouble(rs.getString(2))) * 100000);
int x = (int) (maxLong * 100000) - tempLong;
int tempLat = (int) ((Double.parseDouble(rs.getString(1))) * 100000);
int y = (int) (maxLat * 100000) - tempLat;
if (!(y > matrix.length) || !(y < 0) || !(x > matrix[0].length) || !(x < 0)) {
matrix[y][x] += 1;
}
}
System.out.println("End");
JSONObject obj = convertToCRS(matrix);
return obj;
}catch (ClassNotFoundException ex){
Logger lgr = Logger.getLogger(Database.class.getName());
lgr.log(Level.SEVERE, ex.getMessage(), ex);
return null;
}
catch (SQLException ex) {
Logger lgr = Logger.getLogger(Database.class.getName());
lgr.log(Level.SEVERE, ex.getMessage(), ex);
return null;
} finally {
try {
if (rs != null) {
rs.close();
}
if (pst != null) {
pst.close();
}
if (con != null) {
con.close();
}
} catch (SQLException ex) {
Logger lgr = Logger.getLogger(Database.class.getName());
lgr.log(Level.WARNING, ex.getMessage(), ex);
return null;
}
}
while(rs.next())
पाश में हर पंक्ति निकाला जा रहा है मुझे एक ही भयानक रन-टाइम देता है।
मेरा प्रश्न है कि मैं इस प्रकार की क्वेरी को अनुकूलित करने के लिए क्या कर सकता हूं? मैं .setFetchSize()
के बारे में उत्सुक हूं और यहां इष्टतम मूल्य क्या होना चाहिए। दस्तावेज़ीकरण से पता चलता है कि INTEGER.MIN_VALUE परिणाम पंक्ति-दर-पंक्ति लाने में परिणाम देता है, क्या यह सही है?
किसी भी मदद की सराहना की जाती है।
संपादित टाइमस्टैम्प पर एक नया सूचकांक बनाने के बाद, सप्ताह का दिन और HOUROFDAY मेरी क्वेरी 1 मिनट तेजी से चलाता है और समझाने मुझे इस देता है:
कृपया स्क्रीनशॉट से बचें और टेक्स्ट फॉर्म में अपनी जानकारी दिखाएं। पढ़ने और काम करने के लिए यह बहुत आसान है। –
ओह, मैंने सोचा कि यह चारों ओर एक और तरीका होगा। क्या यह एक एसई दिशानिर्देश है, या सिर्फ आपकी निजी वरीयता है? – kongshem
एक कारण यह है कि आप किसी छवि से प्रतिलिपि और पेस्ट नहीं कर सकते :-) –