暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[ACDU 翻译] MySQL 8.6.2 MyISAM 表的批量数据加载

原创 由迪 2021-06-01
427

这些性能提示补充了第 8.2.5.1 节“优化 INSERT 语句”中快速插入的一般准则。

  • 对于MyISAM表,SELECT如果数据文件中间没有删除的行,您可以在语句运行的同时使用并发插入来添加行 。见第 8.11.3 节,“并发插入”

  • 通过一些额外的工作,当表有很多索引时,可以使 表的LOAD DATA运行速度更快MyISAM。使用以下程序:

    1. 执行FLUSH TABLES 语句或mysqladmin flush-tables命令。
    2. 使用myisamchk --keys-used=0 -rq */path/to/db/tbl_name* 删除表的所有索引使用。
    3. 使用 将数据插入到表中 LOAD DATA。这不会更新任何索引,因此速度非常快。
    4. 如果以后只打算从表中读取,请使用myisampack 对其进行压缩。见 第 16.2.3.3 节,“压缩表特性”
    5. 使用myisamchk -rq */path/to/db/tbl_name*重新创建索引。这会在将索引树写入磁盘之前在内存中创建索引树,这比在此期间更新索引快得多,LOAD DATA因为它避免了大量的磁盘搜索。生成的索引树也是完美平衡的。
    6. 执行FLUSH TABLES 语句或mysqladmin flush-tables命令。

    LOAD DATA如果MyISAM插入数据的表为空,则自动执行上述优化 。自动优化和显式使用过程之间的主要区别在于,您可以让 myisamchk为索引创建分配比您希望服务器在执行LOAD DATA语句时为索引重新创建分配更多的临时内存 。

    您还可以MyISAM使用以下语句而不是myisamchk来禁用或启用表的非唯一索引 。如果使用这些语句,则可以跳过 FLUSH TABLES操作:

    ALTER TABLE tbl_name DISABLE KEYS; ALTER TABLE tbl_name ENABLE KEYS;
  • 要加快INSERT对非事务性表使用多条语句执行的操作,请锁定您的表:

    LOCK TABLES a WRITE; INSERT INTO a VALUES (1,23),(2,34),(4,33); INSERT INTO a VALUES (8,26),(6,29); ... UNLOCK TABLES;

    这有利于性能,因为索引缓冲区只在所有INSERT语句完成后刷新到磁盘一次 。通常,索引缓冲区刷新次数与INSERT 语句数一样多。如果您可以使用单个 .xml 文件插入所有行,则不需要显式锁定语句 INSERT

    锁定还降低了多连接测试的总时间,尽管单个连接的最长等待时间可能会因为它们等待锁定而增加。假设五个客户端尝试同时执行插入,如下所示:

    • 连接 1 进行 1000 次插入
    • 连接 2、3 和 4 执行 1 次插入
    • 连接 5 进行 1000 次插入

    如果不加锁,2、3、4连接比1和5先完成。如果用加锁,2、3、4连接可能不会在1、5之前完成,但总时间应该在40%左右快点。

    INSERTUPDATEDELETE操作在 MySQL 中非常快,但是您可以通过为执行超过大约 5 次连续插入或更新的所有内容添加锁来获得更好的整体性能。如果你这样做非常多的连续插入,你可以做一个LOCK TABLES接着一个 UNLOCK TABLES在一段时间(每1000行左右),一旦允许其他线程访问表。这仍然会带来不错的性能提升。

    INSERTLOAD DATA即使使用刚刚概述的策略,加载数据仍然比 慢得多。

  • 要提高MyISAM 表的性能,对于LOAD DATAINSERT,请通过增加key_buffer_size系统变量来扩大密钥缓存 。请参见第 5.1.1 节 “配置服务器”

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论