繁体   English   中英

如何用最少的时间在mysql中转换约1600万行?

How to convert about 16 million rows in mysql with least time?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在一个只有两列的表中大约有160万行,一个是bigint唯一索引,另一个是在base64中有照片的longblob。 我需要尽快解码这些base64照片。 我尝试使用几个小时后中断的Java程序,速度也不好。 这是程序

Connection conn = null;
        Statement stmt = null;
        try {
            conn = DatabaseConnection.getConnection();
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_UPDATABLE);
            ResultSet uprs = stmt.executeQuery("SELECT uniqueid,photo FROM newphotodata");
            String query="insert into photo_data values (?,?)";
            PreparedStatement pstmt =  conn.prepareStatement(query);
            while (uprs.next()) {
                byte[] processed = Base64Utils.base64Decode(uprs.getString(2));
                pstmt.setString(1, uprs.getString(1));
                pstmt.setBytes(2, processed);
                pstmt.executeUpdate();
                uprs.deleteRow();
            }
            pstmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (stmt != null)
                    stmt.close();
                if(conn!=null)
                    conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

我采用的第二种方法是使用数据库触发器,该触发器使用我创建的base64_decode存储过程。 这是触发因素

DELIMITER $$

DROP TRIGGER `delete_photo`$$

CREATE TRIGGER `delete_photo` BEFORE DELETE ON `newphotodata`
FOR EACH ROW
BEGIN
    INSERT INTO `photo_data` SELECT OLD.`uniqueid`, BASE64_DECODE(OLD.`photo`);
END$$

DELIMITER ;

处理速度再次太慢。 还有其他方法可用于执行以下任务。 我在具有96GB RAM,intel Xeon x5672的Redhat Linux中运行Mysql版本5.0。

2 个回复

最好的方法是创建另一个表,并使用预制的mysql函数插入解码后的照片,以对base64上的编码进行解码。

插入比更新快。

INSERT INTO photo_data 
SELECT OLD.uniqueid, FROM_BASE64(OLD.`photo`);

但是,如果不每隔几行提交一次,该查询就会变得很长。 因此,最好的方法是创建一个每n行提交一次的过程。

不要退出mysql以获得最佳性能。 mysql外部进行的每个转换都需要额外的努力。

编辑:按uniqueId排序原始数据。 如果发生问题,您可以从最后插入的ID重新启动。 您无需删除原始数据。 它可以提高您的表现。

对于Java程序,您可以尝试使用sql批处理语句,这将大大提高插入语句的速度。 示例代码:

int batchLimit = 1000;
int currentBatchLimit = batchLimit;
while (rs.next())
{
    stmt.setInt(1, 123);
    stmt.addBatch();

    currentBatchLimit--;
    if (currentBatchLimit == 0)
    {
        stmt.executeBatch();
        stmt.clearBatch();
        currentBatchLimit = batchLimit;
    }
    stmt.clearParameters();
}
stmt.executeBatch();
stmt.close();
1 如何使用 node-mysql 在 MySQL 数据库中插入大约 100 万行?

我正在尝试构建一个应用程序,其中有两个给定的列表 - 一个是名字,另一个是姓氏。 我正在尝试使用名字和姓氏的每种组合创建一个数据库。 我正在生成组合,然后尝试将它们插入到我的数据库中。 但似乎内存不足以处理这个问题,即使我已将我的 fullNames (firstname+lastname) 数组切 ...

2 每 1 小时更新 MySQL 表中约 100 万行

我使用 Codeigniter 3.1.11 并有一个问题。 我需要通过 Cron 每 1 小时更新 MySQL 表中大约 100 万(将来会更多)的行。 但问题是,如果我使用此代码更新超过 200-300 行,我的服务器 CPU 已 100% 加载并且表在大约 200-300 行后停止更新。 而且 ...

3 关于使用索引时mysql只看一半的行感到困惑

我有一个表(location_data),其中包含300M行(并且还在不断增长)。 我想为foo_id的特定值找到最新条目的ID(MAX(id))。 查询是否低于最佳? 通常需要几秒钟。 “行”值561826是否表示MySQL正在读取并扫描所有行中的foo_id事件,尽 ...

4 关于使用大约 1600 万行的 python 读取巨大的 csv 文件

我是 python 的新手,我正在尝试对比特币的 twitter 推文进行情感分析,但我得到的数据非常庞大,大约有 1600 万行,大小约为 4 GB。 我不知道如何使用 python 读取这个文件。 这是一个csv文件 你能帮我解决这个问题吗? 数据集链接- https://www.kagg ...

2020-05-14 00:17:35 1 23   python
5 MySQL-如何快速插入百万行? [重复]

这个问题已经在这里有了答案: 如何尽快将2000万条记录插入MySql数据库中 4答案 因此,出于开发目的,我需要一个具有约100万至1亿个值的表,而我目前的方法根本不是很快。 开发人员通常要做什么以使其表具有百万行,以测试其程序可以多快地处理它们? 我 ...

2014-07-19 03:46:59 5 3740   mysql/ sql
8 MySQL中有3000万行

晚间, 我正在经历漫长的过程,将数据从受到重视的,已有15年历史的只读数据格式导入MySQL,以便从中构建一些较小的统计表。 我之前构建的最大的表是(我认为)3200万行,但我没想到它会变得那么大并且真的让MySQL变得紧张。 该表将如下所示: 所以,小的int和var ...

9 MySQL性能-500万行

我在Mamp上有一个本地数据库,用于性能测试。 我的问题表有大约500万行。 这是我遇到的问题表: 索引是User_ID和Skill_ID。 这是我使用的查询: 我在测试站点上选择的技能越多,查询所花的时间就越多。 目前大约需要 第一技能提高1秒钟 ,并提高约1 ...

10 如何检查/更新数据库中包含大约一百万行的列?

我的MYSQL数据库包含大约一百万(1,000,000)行,我想检查所有行并根据条件进行更新,例如,我运行这样的SQL语句: 然后,我获取所有ID并将其存储在变量中: 然后我生成一个4个字符的字符串0-9a-z: 然后,在检查生成的ID是否唯一之后,用生成的字符串更新现有 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM