我有这个简单的查询:
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.希望我在电脑前.