当前位置: 首页 > 面试题库 >

MySQL优化INSERT速度由于索引而减慢

晁文斌
2023-03-14
问题内容

MySQL文档说:

假设B树索引,表的大小会减慢日志N的索引插入速度。

这是否意味着对于每个新行的插入,插入速度将降低log N倍,其中N是行数?即使我只在一个查询中插入所有行?即:

INSERT INTO mytable VALUES (1,1,1), (2,2,2),  (3,3,3), .... ,(n,n,n)

其中n为〜70,000

我目前在一个表格中约有147万行,其结构如下:

CREATE TABLE mytable (
   `id` INT,
   `value` MEDIUMINT(5),
   `date` DATE,
   PRIMARY_KEY(`id`,`date`)
) ENGINE = InnoDB

当我以上述方式插入事务时,提交时间约为275秒。我该如何优化这一点,因为每天都会添加新数据,并且插入时间只会继续变慢。

此外,除了查询可能有什么帮助之外吗?也许一些配置设置?

我读到在插入之前删除索引可能有助于提高插入速度。在插入之后,我再次添加索引。但是这里唯一的索引是主键,我认为删除它不会有多大帮助。同样,当主键被 放下时
,所有的选择查询将变得缓慢。

我不知道任何其他可能的方法。

编辑: 这是关于在表中插入约60,000行以及约147万行的一些测试:

使用上述普通查询: 146秒

使用MySQL的LOAD DATA infile: 145秒

使用MySQL的LOAD DATA infile并按照David Jashi在他的回答中建议的方式拆分csv文件:
60个文件(每个1000行)136秒,6个文件(每个10,000行)136秒

删除和重新添加主键: 删除键花费了11秒,插入数据花费了0.8秒,但是插入 主键 花费了153秒,总共花费了165秒


问题答案:

如果要快速插入,首先需要的是合适的硬件。假定有足够的RAM,一个SSD而不是机械驱动器以及相当强大的CPU。

由于您使用InnoDB,因此默认设置是针对慢速和老式计算机设计的,因此您需要对其进行优化。

这是有关配置InnoDB的精彩读物

在那之后,您需要了解一件事-那就是数据库在内部如何执行其工作,硬盘如何工作等等。我将在以下描述中简化该机制:

MySQL是一个事务,它等待硬盘驱动器确认它已写入数据。这就是为什么机械驱动器上的事务处理很慢的原因,它们每秒可以执行200-400次输入输出操作。转换后,这意味着您可以在机械驱动器上使用InnoDB每秒获得200ish插入查询。自然,
这是简化的解释 ,只是为了概述正在发生的事情, 而不是事务背后的完整机制

由于查询(尤其是与表大小相对应的查询)的字节数相对较小-您实际上在单个查询上浪费了宝贵的IOPS。

如果在单个事务中包装多个查询(100或200或更多,没有确切的数字,则必须测试),然后提交它-您将立即每秒获得更多写入。

Percona家伙正在相对便宜的硬件上实现每秒15k插入。即使每秒插入5k也不错。像您这样的表格很小,我已经在类似的表格上进行了测试(多了3列),并且使用带有240GB
SSD的16GB内存计算机(1个驱动器,没有RAID,用于测试目的)。

TL;
DR:-按照上面的链接,配置服务器,获取SSD,在1次交易中包装多次插入并获利。而且不要关闭索引然后再打开,这并不总是适用的,因为在某些时候,您将花费处理和IO时间来构建它们。



 类似资料:
  • 本文向大家介绍mysql性能优化之索引优化,包括了mysql性能优化之索引优化的使用技巧和注意事项,需要的朋友参考一下   作为免费又高效的数据库,mysql基本是首选。良好的安全连接,自带查询解析、sql语句优化,使用读写锁(细化到行)、事物隔离和多版本并发控制提高并发,完备的事务日志记录,强大的存储引擎提供高效查询(表记录可达百万级),如果是InnoDB,还可在崩溃后进行完整的恢复,优点非常多

  • 本文向大家介绍MySQL如何优化索引,包括了MySQL如何优化索引的使用技巧和注意事项,需要的朋友参考一下 1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行。表越大,花费越多。如果表中有相关列的索引,MySQL可以快速确定要在数据文件中间查找的位置,而不必查看所有数据。这比顺序读取每一行要快得多。 大多数MyS

  • 本文向大家介绍浅谈MySQL索引优化分析,包括了浅谈MySQL索引优化分析的使用技巧和注意事项,需要的朋友参考一下 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字段的意义。助你了解索引,分析索引,使用索引,从而写出更高性能的sql语句。还在等啥子?撸起袖子就是干! 案例

  • 什么是索引? 数据库的索引与书籍的索引类似,有了索引就不需要翻转整本书。数据库的索引跟这个原理一样,首先在索引中找,在索引中找到条目以后,就可以直接跳转到目标文档的位置,从而使查询速度提高几个数据量级。 不使用索引的查询称为全表扫描(这个术语来源于关系型数据库),也就是说,服务器必须查找完一整本书才能找到查询结果。这个过程跟我们在一本没有索引(目录)的书中查找信息很像:从第一页开始一直读完整本书。

  • 本文向大家介绍MYSQL分页limit速度太慢的优化方法,包括了MYSQL分页limit速度太慢的优化方法的使用技巧和注意事项,需要的朋友参考一下 在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦。    当一个表数据有几百万的数据的时候成了问题!    如 * from table limit 0,10

  • 我想在数据库中得到一些电子邮件,每个电子邮件都有一个状态。所有可能的状态都是一个表中的stock,在该表中它们都有权限(如show、edit、delete等)。那些电子邮件不是用户通过一个站点的权限,而是一个用户添加的电子邮件列表。 下面是表的结构: 电子邮件表 状态表 谢谢