我真的在這裏看到一個很大的問題。我正在使用MySQL在表格中存儲帶有詞性標記的句子。該表是這樣的:JDBC和MySQL讀取性能
+------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+-------+
| idTitle | varchar(25) | NO | PRI | NULL | |
| idReview | int(10) unsigned | NO | PRI | NULL | |
| idSentence | int(10) unsigned | NO | PRI | NULL | |
| content | text | NO | | NULL | |
| POSInfo | text | YES | | NULL | |
+------------+------------------+------+-----+---------+-------+
這些表上的索引:
+-----------------+------------+-----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------------+------------+-----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| reviewsentences | 0 | PRIMARY | 1 | idSentence | A | 23 | NULL | NULL | | BTREE | |
| reviewsentences | 0 | PRIMARY | 2 | idTitle | A | 32087 | NULL | NULL | | BTREE | |
| reviewsentences | 0 | PRIMARY | 3 | idReview | A | 2470720 | NULL | NULL | | BTREE | |
| reviewsentences | 1 | fk_ReviewSentences_Reviews1 | 1 | idTitle | A | 983 | NULL | NULL | | BTREE | |
| reviewsentences | 1 | fk_ReviewSentences_Reviews1 | 2 | idReview | A | 494144 | NULL | NULL | | BTREE | |
+-----------------+------------+-----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
我試圖讀取blong到一定的審查reviewsentences的將它們添加到審查對象。我正在通過JDBC訪問數據庫,並且這些讀取將永遠消失!我說26分鐘2分鐘!這是我使用來查詢數據庫中的Java代碼:如果我通過MySQL工作臺它需要0.296秒具有相同的查詢訪問相同的表
public List<Review> fillupReviews(List<Review> reviews, boolean tagged){
try {
Statement stmt = dbConnection.createStatement() ;
for (Review review : reviews) {
ResultSet rs=null;
if(tagged==true){
rs = stmt.executeQuery("SELECT idSentence, POSInfo FROM reviewsentences WHERE idTitle="+review.getMovieID()+" and idReview="+review.getReviewID()+";") ;
}else{
rs = stmt.executeQuery("SELECT idSentence, content FROM reviewsentences WHERE idTitle="+review.getMovieID()+" and idReview="+review.getReviewID()+";") ;
}
while(rs.next()){
review.addTaggedSentence(rs.getInt(1),rs.getString(2));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return reviews;
}
?所以我的猜測是必須有嚴重錯誤!但我真的不知道出了什麼問題或要改變什麼來加速這件事情。請有人給我一個提示?
這是我再次,我終於找到解決方案!被稱爲準備聲明! < - 誰會猜到!?這裏是代碼:
public List<Review> fillupReviews(List<Review> reviews, boolean tagged){
try {
PreparedStatement selectReview=null;
if(tagged==true){
selectReview = dbConnection.prepareStatement("SELECT idSentence, POSInfo FROM reviewsentences WHERE idTitle= ? AND idReview= ?;");
}else{
selectReview = dbConnection.prepareStatement("SELECT idSentence, Content FROM reviewsentences WHERE idTitle= ? AND idReview= ?;");
}
for (Review review : reviews) {
selectReview.setString(1, review.getMovieID());
selectReview.setInt(2, review.getReviewID());
ResultSet rs = selectReview.executeQuery();
while(rs.next()){
review.addTaggedSentence(rs.getInt(1),rs.getString(2));
}
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
return reviews;
}
現在這個洞的東西像地獄一樣運行(幾乎與MySQL Workbench的速度一樣[0.3秒])。我不明白爲什麼一個正常的陳述如此緩慢?有人有解釋嗎?
一箇舊的,但爲解釋。 preparedStatement只能由SGBD編譯一次,然後將參數設置到正確的位置(不是使用java,而是使用sgbd)。每個查詢執行都會編譯一條簡單的語句。這個編譯需要時間。 – AxelH 2016-07-05 10:56:56