У меня действительно большая проблема.Я использую 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 | |
+-----------------+------------+-----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
Я пытаюсь прочитать рецензии, которые относятся к определенному рецензированию, и добавить их вобъект обзора.Я получаю доступ к базе данных через JDBC, и чтение занимает вечность!Я говорю 2 минуты на 26 строк!Это код Java, который я использую для запроса к базе данных:
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;
}
Если я получаю доступ к той же таблице с тем же запросом через MySQL Workbench, это займет 0,296 секунды ??Так что я думаю, что должно быть что-то серьезно не так!Но я действительно не могу видеть, что идет не так или что изменить, чтобы ускорить эту чертову вещь.Пожалуйста, может кто-нибудь дать мне подсказку?
Это снова я, я наконец нашел решение!Называется подготовленным заявлением !!<- кто бы мог догадаться !?Вот код: </p>
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 сек]).Что я не совсем понимаю, почему нормальное утверждение так медленно?У кого-нибудь есть объяснение этому?