mysql-在InnoDB上进行简单的INSERT查询需要太多时间

我有这个简单的查询:

INSERT IGNORE INTO beststat (bestid,period,rawView) VALUES ( 4510724 , 201205 , 1 ) 

在桌子上:

CREATE TABLE `beststat` (
 `bestid` int(11) unsigned NOT NULL,
 `period` mediumint(8) unsigned NOT NULL,
 `view` mediumint(8) unsigned NOT NULL DEFAULT '0',
 `rawView` mediumint(8) unsigned NOT NULL DEFAULT '0',
 PRIMARY KEY (`bestid`,`period`),
) ENGINE=InnoDB AUTO_INCREMENT=2020577 DEFAULT CHARSET=utf8

大约需要1秒钟才能完成.

旁注:实际上并不总是需要1秒.有时甚至可以在0.05秒内完成.但通常需要1秒

该表(beststat)当前具有约500’000条记录,其大小为:40MB.我有4GB RAM和innodb缓冲池大小= 104,857,600,使用:Mysql:5.1.49-3

这是数据库中唯一的InnoDB表(其他是MyISAM)

ANALYZE TABLE beststat显示:确定

也许InnoDB设置有问题?

解决方法:

因此,表上有两个唯一索引.您的主键是一个自动编号.由于这并不是数据的真正组成部分,因此将其添加到数据中就是所谓的人工主键.现在,您有一个关于Bestid和Period的唯一索引.如果Bestid和Period被认为是唯一的,那将是主键的最佳选择.

Innodb将表存储为树或堆.如果您没有在innodb表上定义主键,那么如果您定义主键,它将被定义为磁盘上的一棵树.因此,在您的情况下,树根据自动编号键存储在磁盘上.因此,当您创建第二个索引时,它实际上在磁盘上创建了第二棵树,在索引中具有bestid和period值.该索引不包含表中的其他列,只有bestid,period和您的主键值.

好的,现在您自己插入数据是为了确保唯一索引始终唯一.因此,它读取索引以查看您是否要插入重复的值.这是放慢脚步的地方.首先必须确保唯一性,然后才能通过测试写入数据.然后,还必须将bestid,period和主键值插入唯一索引.因此,总操作将是为值1读取1个索引.将行插入表1中,将bestid和period插入索引中.总共进行三个操作.如果删除了自动编号,并且仅将唯一索引用作主键,则如果将唯一插入表中,它将读取表.在这种情况下,您将需要执行以下操作数1读取表以检查将值1插入表中.这是两个操作与三个操作.因此,通过删除冗余自动编号,您的工作量减少了33%.

我希望这很清楚,因为我正在从Android键入内容,并且自动更正功能不断将innodb更改为inborn.希望我在电脑前.

上一篇:uDock for Mac(Dock栏快速启动程序) v2.1激活版


下一篇:php-使用Instagram API请求在用户中循环非常慢