【发布时间】:2016-11-30 05:52:38
【问题描述】:
我有一个大问题,我不太擅长 SQL...我在 mysql 中有一个数据库,当我执行此查询时,我的响应时间大约为 0.2 秒,所以当我调用它以获得列表时的用户(在 servlet 中)的响应时间大约是几秒..
查询:
SELECT visible,nlikes,nomecognome,profile_img,users_face.id
FROM users_face
LEFT OUTER JOIN `likes_face`
on (users_face.fb_id = likes_face.fb_id)
WHERE users_face.fb_id =? and users_face.token_valid=1
ORDER BY date DESC limit 1
有没有什么方法可以优化这段代码或者有什么好的资源来研究查询的优化?
代码
ArrayList<SocialMan> mans = new ArrayList<>();
PreparedStatement ps;
int nlikes, userid;
String nomeCogn, prof;
boolean visible;
FacebookClient facebookClient = new DefaultFacebookClient(token, Version.VERSION_2_6);
com.restfb.Connection<User> myFriends;
myFriends = facebookClient.fetchConnection("me/friends",User.class, Parameter.with("limit", 999));
for (User u : myFriends.getData()) {
nlikes = -1;
userid = -1;
nomeCogn = "ERROR";
prof = "ERROR";
visible = false;
try {
ps = con.prepareStatement("SELECT visible,nlikes,nomecognome,profile_img,users_face.id FROM users_face LEFT OUTER JOIN `likes_face` on (users_face.fb_id = likes_face.fb_id) WHERE users_face.fb_id =? and users_face.token_valid=1 ORDER BY date DESC limit 1");
ps.setString(1, "" + u.getId());
ResultSet rs = ps.executeQuery();
while (rs.next()) {
nlikes = rs.getInt("nlikes");
userid = rs.getInt("id");
nomeCogn = rs.getString("nomecognome");
prof = rs.getString("profile_img");
visible = rs.getBoolean("visible");
}
} catch (SQLException ex) {
Logger.getLogger(FaceLikes.class.getName()).log(Level.SEVERE, null, ex);
}
// System.out.println("NOMECOGNOME: "+nomeCogn);
if (userid != -1 && visible) {
mans.add(new SocialMan(nomeCogn, userid, prof, nlikes));
}
}
nlikes = -1;
userid = -1;
nomeCogn = "ERROR";
prof = "ERROR";
创建表代码
用户
CREATE TABLE IF NOT EXISTS `users_face` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fb_id` varchar(45) NOT NULL,
`fb_token` varchar(300) NOT NULL,
`nomecognome` varchar(100) NOT NULL,
`data_iscrizione` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`profile_img` varchar(255) NOT NULL,
`visible` int(11) NOT NULL DEFAULT '1',
`TOKEN` varchar(255) NOT NULL,
`locale` varchar(255) NOT NULL,
`token_valid` tinyint(1) NOT NULL,
PRIMARY KEY (`id`,`fb_id`),
UNIQUE KEY `fb_id` (`fb_id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=173 ;
喜欢
CREATE TABLE IF NOT EXISTS `likes_face` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`nlikes` int(11) NOT NULL,
`fb_id` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1182636 ;
【问题讨论】:
-
能否也给我们您的数据库结构?
-
这个查询返回了多少行?你确定你必须使用左外连接吗?
-
所以当我为用户列表调用它时和
LIMIT 1。你怎么称呼你的名单???向我们展示你在 mysql 之外的后端代码? -
你的
EXPLAIN是什么样的? -
我添加了结构。此查询返回 1 行。我在 servlet 上有一个从请求中获取的用户 ID 列表,我需要为每个用户检索这些数据。
标签: mysql sql optimization query-optimization