- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我使用大随机数作为键(来自另一个系统)。对相当小的(如几百万行)表进行插入和更新所花费的时间比我认为的合理时间要长得多。
我提炼了一个非常简单的测试来说明。在测试表中,我试图使其尽可能简单;我的真实代码没有这么简单的布局,并且有关系和附加索引等。但是,更简单的设置显示了相同的性能。
结果如下:
creating the MyISAM table took 0.000 seconds
creating 1024000 rows of test data took 1.243 seconds
inserting the test data took 6.335 seconds
selecting 1023742 rows of test data took 1.435 seconds
fetching 1023742 batches of test data took 0.037 seconds
dropping the table took 0.089 seconds
creating the InnoDB table took 0.276 seconds
creating 1024000 rows of test data took 1.165 seconds
inserting the test data took 3433.268 seconds
selecting 1023748 rows of test data took 4.220 seconds
fetching 1023748 batches of test data took 0.037 seconds
dropping the table took 0.288 seconds
将 1M 行插入 MyISAM 需要 6 秒;进入 InnoDB 需要 3433 秒!
我做错了什么?什么是错误配置? (MySQL 是默认的普通 Ubuntu 安装)
这是测试代码:
import sys, time, random
import MySQLdb as db
# usage: python script db_username db_password database_name
db = db.connect(host="127.0.0.1",port=3306,user=sys.argv[1],passwd=sys.argv[2],db=sys.argv[3]).cursor()
def test(engine):
start = time.time() # fine for this purpose
db.execute("""
CREATE TEMPORARY TABLE Testing123 (
k INTEGER PRIMARY KEY NOT NULL,
v VARCHAR(255) NOT NULL
) ENGINE=%s;"""%engine)
duration = time.time()-start
print "creating the %s table took %0.3f seconds"%(engine,duration)
start = time.time()
# 1 million rows in 100 chunks of 10K
data = [[(str(random.getrandbits(48)) if a&1 else int(random.getrandbits(31))) for a in xrange(10*1024*2)] for b in xrange(100)]
duration = time.time()-start
print "creating %d rows of test data took %0.3f seconds"%(sum(len(rows)/2 for rows in data),duration)
sql = "REPLACE INTO Testing123 (k,v) VALUES %s;"%("(%s,%s),"*(10*1024))[:-1]
start = time.time()
for rows in data:
db.execute(sql,rows)
duration = time.time()-start
print "inserting the test data took %0.3f seconds"%duration
# execute the query
start = time.time()
query = db.execute("SELECT k,v FROM Testing123;")
duration = time.time()-start
print "selecting %d rows of test data took %0.3f seconds"%(query,duration)
# get the rows in chunks of 10K
rows = 0
start = time.time()
while query:
batch = min(query,10*1024)
query -= batch
rows += len(db.fetchmany(batch))
duration = time.time()-start
print "fetching %d batches of test data took %0.3f seconds"%(rows,duration)
# drop the table
start = time.time()
db.execute("DROP TABLE Testing123;")
duration = time.time()-start
print "dropping the table took %0.3f seconds"%duration
test("MyISAM")
test("InnoDB")
最佳答案
InnoDB 具有事务支持,您没有使用显式事务,因此 innoDB 必须在每个语句之后执行提交 ("performs a log flush to disk for every insert")。
在循环之前执行此命令:
START TRANSACTION
循环之后这个
COMMIT
关于mysql - 为什么 MySQL InnoDB 插入这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9819271/
我已经在我的 windows7 机器上安装了 bugzilla4.2.5。当我运行 bugzilla 的 checksetup.pl 脚本时,它显示 Use of uninitialized valu
我正在使用 MySQL 5.1.56 我有一个包含大约 70 个表的数据库,我有一个特定损坏的表的问题,例如表_X 当我尝试访问表时mysql> 从 Table_x 中选择 *;ERROR 1105
我最近尝试将 MySQL 5.1 服务器升级到 5.7。当服务器无法启动时,我发现您必须先导出数据,然后再进行大量升级(二进制文件不再可用),所以我回滚到 5.1 进行导出。 问题是,回到 5.1,I
我正处于项目的开始阶段,到目前为止我一直在使用默认的 MySQL 数据库。 对了,默认的数据库有名字吗? 我的问题是如何在不删除当前表和创建新表的情况下将现有表更改为 utf-8 和 InnoDB。是
我最近尝试将 innodb 缓冲池大小增加到 8GB,但在我的 innodb 状态下,池大小看起来像之前配置的值(在我的例子中是 500MB)。 ---------------------- BUFF
我是一家网络酒店的幸运老板,店主会在不知情的情况下更改设置。当这么说时,我的数据库中有一些表正在使用 InnoDB 引擎运行。但是晚上主机禁用了 InnoDB,所以我无法使用 ALTER 命令将其转换
我刚刚将数据库从 MyISAM 引擎迁移到 InnoDB。我使用 mysqldump 备份我的 MyISAM 数据库,但是当我查看 MySQL docs ,对于 InnoDB 表,我还需要保存二进制文
环境: Windows 7(XAMPP 最新版) Apache 2.4.4PHP 5.5MySQL 5.6.11 我正在尝试从 MySQL 5.1 备份数据库并将其导入 MySQL 5.6。 在 My
我正在创建的应用程序主要使用选择,但也有一些是插入、更新等。我想知道在这些情况下哪种性能最好。 其次,当我在 innodb 中有两个相关的表时,如果它与另一个表中的行相关,我该如何删除它而不吐出错误?
我的意思是页面: https://dev.mysql.com/doc/internals/en/innodb-page-structure.html 这些 16KB 的 MySQL 页面会在内存或磁盘
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我阅读了本网站上的大部分 InnoDB 示例,但我对 InnoDB 的行为一无所知。 据我所知 START TRANSACTION; 声明这是一个事务连接。没关系到这里。现在我有 3 个表: 带有 I
我有一个包含混合表(MyISAM、InnoDB)的 MySQL 数据库。 如何通过 Linux 命令行使用 mysqldump 创建数据库的完整备份,我应该使用什么选项? 最佳答案 在下面使用- 所有
我有一张桌子:。我用Python在这个表中插入了大约400k行。以下是INSERT语句:。我在两个表tab1.col1和tab2.col2上都有一个索引。但是插入大约需要5分钟/1000行的时间。我从
我正在尝试使用 WAMP 在本地服务器上安装 Magento。 InnoDB 被设置为默认引擎,但它仍然向我显示消息: Database server does not support InnoDB
我最近将所有表从 MyISAM 移到了 InnoDB,因为我想摆脱大表上的表锁定。 在以下表上运行 UPDATE 或 INSERT 查询花费的时间比预期的要多很多。 (约 5 分钟) 我如何优化 in
我正在运行带有 XAMPP 的 Windows 10 和在本地主机上安装的几十个 Drupal 站点。几个月来一切都运行良好。 今天早上,我从两天前的还原点执行了 Windows 还原,以删除不需要的
Socialengine 4.8.6 - 启动时显示“白屏”,只能通过浏览器访问 sesystem.com/phpmyadmin 和 sesystem.com/install。 问题开始:我需要一个包
由于 InnoDB 在 B+ 树中组织其数据。树的高度影响 IO 次数,这可能是 DB 变慢的主要原因之一。 所以我的问题是如何断言或计算B+树的高度(例如根据可以通过行大小、页面大小和行号计算的页数
我尝试使用 mysqldump 从系统 A 使用 innodb 默认存储引擎将大约 40gb 的数据库 db1 转储到 sql 文件中,并尝试在另一个系统 B 上恢复它。两者都有默认存储引擎 inno
我是一名优秀的程序员,十分优秀!