gpt4 book ai didi

MYSQL查询慢,如何优化?

转载 作者:可可西里 更新时间:2023-11-01 07:58:13 25 4
gpt4 key购买 nike

我有一个大问题,我不太擅长 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 ;

最佳答案

(“在开始采取行动之前阅读整个答案。”)

这没有意义:

PRIMARY KEY (`id`,`fb_id`),
UNIQUE KEY `fb_id` (`fb_id`),
UNIQUE KEY `id` (`id`)

暂定为

PRIMARY KEY(fb_id),
INDEX(id)

假设你平时是通过fb_id来查找记录的。

如果你说“用户列表”。你是说 WHERE fb_id IN ( ... )?可能不会,因为您有 LIMIT 1。或者你的意思是你重复调用 SELECT

堵嘴! likes_face 有一个您未使用的 ID,加上您正在使用未编入索引fb_id。对两个表使用相同 id:要么去掉 AUTO_INCREMENT 并更改 likes_face 的代码逻辑,要么去掉 id 并使 fb_id 成为两个表的 PK。

这些表是 1:1 的吗?

出了点问题。为什么likes_face 有AUTO_INCREMENT=1182636,而似乎只有173 个用户?如果表格是 1:1,您是否正在使用 REPLACE`?您将用完所有 ID!

正在重新启动...

如果表格是 1:1:

  • 完全摆脱两个表上的 id 并在两个表上都有 PRIMARY KEY(fb_id)
  • 如果 Facebook 将 id 限制为 ascii,则使 fb_id CHARACTER SET ascii
  • 两个表都不需要二级索引。

如果 likes_face 是每天的点赞数:

  • 去掉两个表上的id
  • 如果 Facebook 将 id 限制为 ascii,则使 fb_id CHARACTER SET ascii
  • likes_face PRIMARY KEY(fb_id, date)
  • 两个表都不需要二级索引。
  • 使用 IODKU 对每日点赞表进行递增/插入操作。

如果表是 1:many 以其他方式,我无法理解架构。

关于MYSQL查询慢,如何优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38592304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com