首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL选择从300 ms跳到20秒,额外增加5行

问MySQL选择从300 ms跳到20秒,额外增加5行
EN

Stack Overflow用户
提问于 2015-03-21 20:23:43
回答 1查看 154关注 0票数 1

我的数据库表中有一个blob。如果我选择表的10行(每行包含1个blob),则需要300毫秒。但是,如果选择15行,则需要20秒。我不明白怎么回事。选择的文件是1MB的图像。

代码语言:javascript
复制
public void find() throws SQLException, IOException {
    ResultSet rs = stm.executeQuery();

    while (rs.next()) {
        FileOutputStream output = new FileOutputStream(new File(
                "C:\\Users\\test\\test.jpg"));
        InputStream input = rs.getBinaryStream("photo");
        byte[] buffer = new byte[8192];
        int count = 0;
        while ((count = input.read(buffer)) > 0) {
            output.write(buffer, 0, count);
        }
    }
}

老实说,我不知道为什么这么小的差别会占用这么多时间。任何帮助都是非常感谢的。

编辑额外笔记:

  • 是的,对同一图像的覆盖是有意的。(很抱歉没有指出这一点)
  • 使用rs.getBlob(“照片”).getBinaryStream()仍然有相同的效果。
  • 方法find()的执行时间正在通过JMH进行基准测试。上面的代码段保持不变。
  • 对于第一个测试有100行(其中10行被选中)和其他150行(其中15行被选中)的“contact”表,运行的代码和SQL完全相同。
  • blob在联系人表内。

SQL:

代码语言:javascript
复制
String query = "SELECT * FROM contact c INNER JOIN contact_address ca  ON c.id=ca.contact_id INNER JOIN groups_contact gc ON gc.contact_id=c.id INNER JOIN groups gr WHERE ca.country=? AND gr.name=? GROUP by c.id";
stm = conn.prepareStatement(query);
stm.setString(1, "NL");
stm.setString(2, "Friends");
stm.addBatch();

更新:

(测量方法已修改,请参阅上文)

代码语言:javascript
复制
 Selecting 10 rows: 239 ms.
 Selecting 15 rows: 26378 ms.
 Selecting 25 rows: 34888 ms.
 Selecting 50 rows: 73267 ms.
 Selecting 75 rows: 81885 ms.
 Selecting 100 rows: 106528 ms.

制作表格:

代码语言:javascript
复制
String createUserTable = "CREATE TABLE User (id INTEGER not NULL AUTO_INCREMENT, email VARCHAR(255), password VARCHAR(255), PRIMARY KEY (id))";
String createGroupTable = "CREATE TABLE Groups (id INTEGER not NULL AUTO_INCREMENT , name VARCHAR(255), user_id INTEGER not NULL, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES User(id))";
String createContactTable = "CREATE TABLE Contact (id INTEGER not NULL AUTO_INCREMENT , firstname VARCHAR(255), lastname VARCHAR(255), note VARCHAR(255), photo MEDIUMBLOB, user_id INTEGER, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES User(id))";
String createGroupContactTable = "CREATE TABLE Groups_Contact (id INTEGER not NULL AUTO_INCREMENT, contact_id INTEGER not NULL, group_id INTEGER not NULL, PRIMARY KEY (id), FOREIGN KEY (contact_id) REFERENCES Contact(id), FOREIGN KEY (group_id) REFERENCES Groups(id))";
String createContactAddressTable = "CREATE TABLE Contact_Address (id INTEGER not NULL AUTO_INCREMENT , street VARCHAR(255), number INTEGER, zipcode VARCHAR(255), city VARCHAR(255), country VARCHAR(255), addresstype VARCHAR(255), contact_id INTEGER not null, PRIMARY KEY (id), FOREIGN KEY (contact_id) REFERENCES Contact(id))";
String createContactPhoneTable = "CREATE TABLE Contact_Phone (id INTEGER not NULL AUTO_INCREMENT , type VARCHAR(255), number VARCHAR(255), contact_id INTEGER not null, PRIMARY KEY (id), FOREIGN KEY (contact_id) REFERENCES Contact(id))";
String createContactEmailTable = "CREATE TABLE Contact_Email (id INTEGER not NULL AUTO_INCREMENT , type VARCHAR(255), email VARCHAR(255), contact_id INTEGER not null, PRIMARY KEY (id), FOREIGN KEY (contact_id) REFERENCES Contact(id))";
EN

回答 1

Stack Overflow用户

发布于 2015-03-23 08:26:12

你确定不是联姻吗?有些联接可能非常慢,特别是多个联接。通常,我们不得不运行单独的查询,因为联接可能会减慢查询的速度。

还有你有什么样的索引?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29187641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档