标签: innodb

如何使用 Doctrine 2 提高 LARGE 导入的性能

我有大约 100 万条记录需要导入。我一直在网上寻找改进和加速这一过程的方法。目前,我的应用程序连接到 1 个数据库,对大约 220 万行的表进行选择,此选择持续大约需要 10-13 秒。我使用此查询选择 10,000 行。

$results = $em->getRepository('...')->createQueryBuilder('x')
              ->where('...')
              ->setFirstResult($index)
              ->setMaxResults($maxResults)
              ->getQuery()
              ->getResult();
Run Code Online (Sandbox Code Playgroud)

然后,我继续迭代每一行,并在另一个数据库中进行 2 次查找,使用这些实体创建一个新实体,并使用事务一次插入所有 10,000 个新实体。

$secondEm->transactional(function($em){
    foreach($results as $result){
        $value1 = $em->getRepository('A')->findOneBy(array('value'=>$result->getValue()));
        $value2 = $em->getRepository('B')->findOneBy(array('value'->$result->getValue()));
        $newEntity = new Entity();
        $newEntity->setValue1($value1)->setValue2($value2);
        $em->persist($newEntity);
    }
    $em->flush();
});
$secondEm->clear();
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是每次后续插入的导入时间都会逐渐变长。前 10,000 个大约需要 60 秒,第二个需要 100 秒,然后从那里开始,每次新插入似乎都会增加大约 5-10 秒。

我读过,对于进行大型插入的 innodb 表,您应该禁用foreign_key_checks 和 unique_checks,但我不知道如何为原则事务插入做到这一点。

任何有关如何禁用这些检查或什至更好的方法来执行此导入的建议将不胜感激。

地位

选择查询现在似乎也在时间上增加。最后一个查询:

$maxResults = 10000;
$index = 470000;
Run Code Online (Sandbox Code Playgroud)

选择花了 97 秒,导入花了 173 秒。

重要 这个过程每个请求发生一次,我有一个 javascript 操作,它将自动提交空白表单,这一切都发生在 POST 上,我意识到这可能会更好地从命令运行,因为它都在同一服务器上,但在那里还有其他方法可以优化这个吗?

有趣的

现在已经插入了大约 …

php mysql innodb symfony doctrine-orm

1
推荐指数
1
解决办法
3477
查看次数

行大小太大(> 8126)我可以将 InnoDB 更改为 MyISAM

我有这个错误:

行大小太大 (> 8126)。将某些列更改为TEXTorBLOB或使用ROW_FORMAT=DYNAMICorROW_FORMAT=COMPRESSED可能会有所帮助。在当前的行格式中,BLOB768 字节的前缀是内联存储的。

为了解决这个问题,我可以将 InnoDB 更改为 MyISAM 吗?

mysql myisam innodb

1
推荐指数
1
解决办法
1223
查看次数

每秒超过100次插入查询使用哪个引擎

每秒超过100次插入查询使用哪个引擎

我阅读了 MYISAM 和 Innodb 的差异和优缺点。
但我仍然对表中的 100 多个插入查询(主要用于跟踪目的)感到困惑,我应该使用哪个数据库。

我参考了MyISAM和InnoDB有什么区别?
根据我的理解,对于每次插入,MYISAM 都会锁定表,因此应该使用 innodb 进行行锁定。
但另一方面,MYISAM 的性能要好 100 倍。


那么最佳且正确的选择应该是什么?为什么?

mysql myisam innodb

1
推荐指数
1
解决办法
1608
查看次数

插入重复键 - 跳过自动递增 ID

我目前有一个 SQL 执行脚本,它更新重复键上的行,如下所示。

    $stmt = $dbCon->prepare("INSERT INTO videos_rating (videos_rating_video_fk, "
            . " videos_rating_user_fk, "
            . " videos_rating_rating) "
            . " VALUES (:video_id, "
            . " :user_id, "
            . " :video_rating) "
            . " ON DUPLICATE KEY UPDATE videos_rating_rating = :video_rating");
Run Code Online (Sandbox Code Playgroud)

该脚本工作正常,但有没有办法防止自动增量列不同步?

假设我们从一个空表开始,然后我对一个视频进行评分,然后创建一个 id 为 1 的行,然后用户通过对同一视频评分较低或较高来再次执行 SQL,并且该行将被更新因为它现在是重复的密钥,所以肯定没问题。

问题是这样的。

下次另一个用户对新视频进行评分时,该行将从 id 3 而不是 2 开始?

表格将如下所示

id | videos_rating_user_fk | videos_rating_rating
1  | 1                     | 4
3  | 2                     | 5
Run Code Online (Sandbox Code Playgroud)

我无法找到类似的问题,即使我发现其他人不太可能对此感到困扰,如果是这样,请让我参考那篇文章。

我知道 ids 不应该“看起来不错”,但是 ids 从 30 - 51 - …

mysql sql database innodb

1
推荐指数
1
解决办法
4641
查看次数

MySQL 导入类型=InnoDB

我有一个巨大的 MySQL 备份文件(如 4-5 GB),类型为 InnoDB,但我要导入的数据库是更高版本,它不接受 ENGINE=InnoDB。有没有办法让我可以在 Linux 中通过命令行将 TYPE=InnoDB 替换为 ENGINE=InnoDB 。

mysql linux backup innodb sed

1
推荐指数
1
解决办法
454
查看次数

MySQL 使用具有新值的索引发生死锁

桌子:

create table properties
(
  id              int auto_increment primary key,
  other_id        int          null
);

create index index_properties_on_other_id
  on properties (other_id);
Run Code Online (Sandbox Code Playgroud)

TX 1:

start transaction;
SET @last_id = 1;
delete from `properties` WHERE `properties`.`other_id` = @last_id;
INSERT INTO `properties` (`other_id`) VALUES (@last_id);
commit
Run Code Online (Sandbox Code Playgroud)

发射2:

start transaction;
SET @last_id = 2;
delete from `properties` WHERE `properties`.`other_id` = @last_id;
INSERT INTO `properties` (`other_id`) VALUES (@last_id);
commit
Run Code Online (Sandbox Code Playgroud)

假设在运行事务之前表是空的。

我的应用程序有 2 个用例。有时last_id已经被另一行使用,因此它会被优先索引;但有时它会由先前的插入查询在同一事务中生成,在这种情况下我会遇到死锁。

我需要运行这两个事务,直到删除语句之后。当我在 tx1 上运行 insert 时,它会等待获取锁,然后我在 tx2 上运行 insert,tx2 会出现死锁并回滚。

mysql            | …
Run Code Online (Sandbox Code Playgroud)

mysql database deadlock innodb

1
推荐指数
1
解决办法
1303
查看次数

OPTIMIZE 表和 ANALYZE 表 MySQL 5.6 的查询性能

该网站上有很多与optimize table和相关的问题/答案analyze table.

问题:如果我们想快速执行 DDL/DML/SELECT,即使表上有碎片,也不考虑空间,我们可以只执行analyze table命令吗?因为我们有 500GB 大小的表和存储引擎,所以innodb它需要时间来optimize table指挥。

根据 MySQL 文档,优化表分析表

  1. Optimize table重新组织表数据和关联索引数据的物理存储,以减少存储空间并提高访问表时的I/O效率。
  2. Analyze table执行键分布分析并存储指定表的分布

我认为,如果我们不关心空块使用的空间,表统计信息是最新的,则无需优化表。

innodb mysql-5.6

1
推荐指数
1
解决办法
5681
查看次数

预览更新/插入查询的结果而不在MySQL中更改数据库?

我正在编写一个脚本来将CSV文件导入到我的数据库中的现有表中.我决定使用PHP和INSERT/UPDATE语句自己进行插入/更新操作,而不是使用MySQL的LOAD INFILE命令,我有充分的理由这样做.

我想要做的是模拟插入/更新操作并将结果显示给用户,然后为他们提供确认这是正常的选项,然后将更改提交到数据库.

我正在使用InnoDB数据库引擎来支持事务.不确定这是否有帮助,但是考虑插入/更新,查询数据,显示给用户,然后提交或回滚事务?

任何建议将不胜感激.

php mysql innodb transactions

0
推荐指数
1
解决办法
1436
查看次数

PDO事务提交而不是回滚

所以有2个InnoDB表,员工和公司.我使用try/catch块在事务中插入2个查询.然而,当我做出明确的错误在第一个查询(我把一个不正确的表名员工,而不是雇员),数据库不插入的当然是查询中的行,但第二个查询运行,并得到承诺的数据库而不是回滚(因为第一个查询未能插入).

结果是一个emply员工表,但公司表与新记录.我在这里错过了什么?它不应该回滚,因为没有插入第一个查询?

$employee_id = 2;
$employee_name = 'Marky Mark';

try {
   $dbh->beginTransaction();
   $query = "INSERT INTO employee (employee_name) VALUES (:employee_name)";
   $insert_emp = $dbh->prepare($query);
   $insert_emp->execute(array(':employee_name' => $employee_name));

   $Employee_id = $dbh->lastInsertId();


   $query = "INSERT INTO companies (company_name,employee_id) VALUES ('SO',:Employee_id)";
   $insert_emp_comp = $dbh->prepare($query);
   $insert_emp_comp->execute(array(':Employee_id' => $Employee_id));
   $dbh->commit();
} catch (Exception $e) {
   $dbh->rollBack();
   echo "Failed: " . $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)

mysql pdo innodb transactions commit

0
推荐指数
1
解决办法
321
查看次数

MYISAM分片与使用InnoDB相比

我有一个表具有非常高的插入率和更新率以及读取率.平均每秒插入和更新大约100行.每秒大约有1000个选择.

该表有大约1亿个元组.这是一个关系表,所以它只有大约5个字段.三个字段包含键,因此它们被索引.所有字段都是整数.

我正在考虑对数据进行分片,但是,它增加了很多复杂性,但确实提供了速度.另一种选择是使用innodb.

该数据库运行在256GB ssd的raid 1上,32GB 1600mhz的RAM和i7 3770k,时钟频率为4Ghz

数据库在高峰时间不断冻结,其中查询可以高达插入或更新200行,每秒2500次选择

你们可以指出我应该做什么吗?

mysql database myisam innodb

0
推荐指数
1
解决办法
888
查看次数

标签 统计

innodb ×10

mysql ×9

database ×3

myisam ×3

php ×2

transactions ×2

backup ×1

commit ×1

deadlock ×1

doctrine-orm ×1

linux ×1

mysql-5.6 ×1

pdo ×1

sed ×1

sql ×1

symfony ×1