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

MySQL非常慢的更改表查询

皇甫心思
2023-03-14
问题内容

为什么简单地更新此表以添加列需要一个多小时?该表有1500万行。它具有2个索引和一个键主键。ALTER
TABLE查询现在已处于“复制到tmp表”状态1小时15分钟。

ALTER TABLE `frugg`.`item_catalog_map` 
ADD COLUMN `conversion_url` TEXT NULL DEFAULT NULL

表:

mysql> describe item_catalog_map;
+------------------------+---------------+------+-----+---------+-------+
| Field                  | Type          | Null | Key | Default | Extra |
+------------------------+---------------+------+-----+---------+-------+
| catalog_unique_item_id | varchar(255)  | NO   | PRI | NULL    |       |
| catalog_id             | int(11)       | YES  | MUL | NULL    |       |
| item_id                | int(11)       | YES  | MUL | NULL    |       |
| price                  | decimal(10,2) | YES  |     | 0.00    |       |
+------------------------+---------------+------+-----+---------+-------+

mysql> show index from item_catalog_map;
+------------------+------------+----------------------+--------------+------------------------+-----------+-------------+----------+--------+------+------------+---------+
| Table            | Non_unique | Key_name             | Seq_in_index | Column_name            | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+------------------+------------+----------------------+--------------+------------------------+-----------+-------------+----------+--------+------+------------+---------+
| item_catalog_map |          0 | PRIMARY              |            1 | catalog_unique_item_id | A         |    15485115 |     NULL | NULL   |      | BTREE      |         |
| item_catalog_map |          1 | IDX_ACD6184FCC3C66FC |            1 | catalog_id             | A         |          18 |     NULL | NULL   | YES  | BTREE      |         |
| item_catalog_map |          1 | IDX_ACD6184F126F525E |            1 | item_id                | A         |    15485115 |     NULL | NULL   | YES  | BTREE      |         |
+------------------+------------+----------------------+--------------+------------------------+-----------+-------------+----------+--------+------+------------+---------+

问题答案:

对于非常大的表,MySQL的ALTER
TABLE性能可能会成为问题。MySQL通过创建一个具有所需新结构的空表,将旧表中的所有数据插入新表中,然后删除旧表来执行大多数更改。这可能会花费很长的时间,特别是如果您的内存不足并且表很大并且有很多索引时。许多人都有需要数小时或数天才能完成的ALTER
TABLE操作的经验。

无论如何,如果您需要继续使用alter table,也许以下资源可以为您提供帮助:

  • https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html
  • https://github.com/soundcloud/lhm
  • https://githubengineering.com/gh-ost-github-s-online-migration-tool-for-mysql/


 类似资料:
  • 我正在对一个小表执行一个简单的查询 系统表只有三列(Id、Name、Progress)和1300行。 我获取数据的代码是: 这段代码在JTable中显示日期大约需要15秒,而如果在phpmyadmin中执行查询,则需要不到1秒。

  • 问题内容: 我已经开发了一个用户批量上传模块。有两种情况,当数据库有零条记录时,我批量上传了20000条记录。大约需要5个小时。但是,当数据库已经有大约30 000条记录时,上传速度将非常缓慢。上载2万条记录大约需要11个小时。我只是通过fgetcsv方法读取CSV文件。 下面是运行的查询。(我正在使用Yii框架) 如果存在,请更新用户: 如果用户不存在,请插入新记录。 表引擎类型为MYISAM。

  • 问题内容: 我有一个表,其中有一个索引(A列,B列)。我正在运行一个查询,如下所示: 这个查询很慢!该计划如下所示: Postgres似乎没有一次对5000个值进行一次索引扫描,而是一次对5000个值进行了一次索引扫描,这解释了为什么查询如此缓慢。 实际上,这样做是更快的方法: 获取结果,然后在应用程序内的B列上进行过滤(python)。 我真的更希望结果已经由Postgres在合理的运行时间下进

  • 问题内容: 在数据库表上运行sp_executesql时遇到一些问题。我使用的是ORM(NHibernate),在这种情况下,该ORM(NHibernate)生成查询一个表的SQL查询。该表中大约有700万条记录,并且已被高度索引。 当我运行没有sp_executesql的ORM吐出的查询时,它运行非常快,并且探查器显示它具有85次读取。当我使用sp_executesql运行相同的查询时,它的读取

  • 我正在处理一个需要JDBC调用Oracle数据库的项目。我已经设置了UCP池化来与SpringJDBC一起工作。我有一个相当简单的查询,我正在执行如下... 我的java代码来设置这个查询看起来像下面... 只要数组中只有一个id,这一切都可以正常运行。当我添加第二个ID时,查询需要将近5分钟的时间运行。如果我获取精确的查询并在SQLDeveloper中执行它,则需要.093秒。 我的代码或配置一