我在CentOS中有一个在MySQL 5.0.45上运行的InnoDB表。 更糟糕的是,它们都在虚拟机中运行。 有多个表格有很容易超过200万条logging的概率。 我注意到,从900K到1M纪录大关开始DB性能开始下降。
我有足够的权力来为未来作出一切改变,以便在这种情况下尽可能地保持这一点。 我应该使用MyIsam? 只有less数指标,我最担心的是写好performance。 将数据写入表的程序以每个表大约250个请求为一组进行批处理,并以每个表为基础执行它们以帮助解决问题。
我已经包含了一个较大的表的create table语句,是的,这是一个非常宽的表 – 我明白了。 我试图尽可能缩小列数,同时仍然能够可靠地容纳进入的数据。
编辑:
如果程序在运行过程中碰到了风扇,程序确实会使用事务来回滚这些变化,但是它基本上只是将数据抽入数据库的风格。 一个8小时的运行可以很容易地把400K线放在这个EACH表中。 这个表格是25个相似大小的指标之一。 它们全部通过LINE和RUN_ID进行查询。 阅读performance – 我不是特别担心。 我正在尽可能快地写入。
CREATE TABLE IF NOT EXISTS `TMD_INDATA_INVOICE` ( `ID` int(11) NOT NULL auto_increment, `LINE` int(11) NOT NULL, `RUN_ID` int(11) NOT NULL, `INDATA_INVOICE_ALLOCATION_GROUP_NAME` varchar(128) default NULL, `INDATA_INVOICE_ALLOCATION_GROUP_OWNER` varchar(128) default NULL, `INDATA_INVOICE_ALLOCATION_NAME` varchar(128) default NULL, `INDATA_INVOICE_IS_AUDITED` varchar(5) default NULL, `INDATA_INVOICE_BASIS_PERCENT` varchar(32) default NULL, `INDATA_INVOICE_COUNTRY_OF_ORIGIN` varchar(64) default NULL, `INDATA_INVOICE_CUSTOMER_GROUP_NAME` varchar(128) default NULL, `INDATA_INVOICE_CUSTOMER_GROUP_OWNER` varchar(128) default NULL, `INDATA_INVOICE_CUSTOMER_NAME` varchar(128) default NULL, `INDATA_INVOICE_CUSTOMER_TAX_CATEGORY` varchar(128) default NULL, `INDATA_INVOICE_DELIVERY_TERMS` varchar(128) default NULL, `INDATA_INVOICE_DEPARTMENT_OF_CONSIGN` varchar(128) default NULL, `INDATA_INVOICE_DOCUMENT_TYPE` varchar(128) default NULL, `INDATA_INVOICE_END_USE` varchar(128) default NULL, `INDATA_INVOICE_END_USER_NAME` varchar(128) default NULL, `INDATA_INVOICE_FILTER_GROUP_NAME` varchar(128) default NULL, `INDATA_INVOICE_FILTER_GROUP_OWNER` varchar(128) default NULL, `INDATA_INVOICE_FISCAL_DATE` varchar(32) default NULL, `INDATA_INVOICE_INPUT_RECOVERY_TYPE` varchar(50) default NULL, `INDATA_INVOICE_INVOICE_NUMBER` varchar(128) default NULL, `INDATA_INVOICE_IS_AUDITING_MESSAGES` varchar(5) default NULL, `INDATA_INVOICE_IS_AUDIT_UPDATE` varchar(5) default NULL, `INDATA_INVOICE_IS_BUSINESS_SUPPLY` varchar(5) default NULL, `INDATA_INVOICE_IS_CREDIT` varchar(5) default NULL, `INDATA_INVOICE_IS_EXEMPT` varchar(5) default NULL, `INDATA_INVOICE_IS_NO_TAX` varchar(5) default NULL, `INDATA_INVOICE_IS_REPORTED` varchar(5) default NULL, `INDATA_INVOICE_IS_REVERSED` varchar(5) default NULL, `INDATA_INVOICE_IS_ROUNDING` varchar(5) default NULL, `INDATA_INVOICE_IS_SIMPLIFICATION` varchar(5) default NULL, `INDATA_INVOICE_MODE_OF_TRANSPORT` varchar(128) default NULL, `INDATA_INVOICE_MOVEMENT_DATE` varchar(32) default NULL, `INDATA_INVOICE_MOVEMENT_TYPE` varchar(128) default NULL, `INDATA_INVOICE_NATURE_OF_TRANSACTION_CODE` varchar(128) default NULL, `INDATA_INVOICE_OVERRIDE_AMOUNT` varchar(128) default NULL, `INDATA_INVOICE_OVERRIDE_RATE` varchar(32) default NULL, `INDATA_INVOICE_PORT_OF_ENTRY` varchar(128) default NULL, `INDATA_INVOICE_PORT_OF_LOADING` varchar(128) default NULL, `INDATA_INVOICE_PRODUCT_MAPPING_GROUP_NAME` varchar(128) default NULL, `INDATA_INVOICE_PRODUCT_MAPPING_GROUP_OWNER` varchar(128) default NULL, `INDATA_INVOICE_REGIME` varchar(128) default NULL, `INDATA_INVOICE_SUPPLY_EXEMPT_PERCENT` varchar(32) default NULL, `INDATA_INVOICE_SUPPLY_TYPE` varchar(128) default NULL, `INDATA_INVOICE_TITLE_TRANSFER_LOCATION` varchar(128) default NULL, `INDATA_INVOICE_VENDOR_NAME` varchar(128) default NULL, `INDATA_INVOICE_VENDOR_NUMBER` varchar(128) default NULL, `INDATA_INVOICE_VENDOR_TAX` varchar(128) default NULL, `INDATA_INVOICE_VERSION` varchar(5) default NULL, `INDATA_INVOICE_CALCULATION_DIRECTION` varchar(5) default NULL, `INDATA_INVOICE_CALLING_SYSTEM_NUMBER` varchar(128) default NULL, `INDATA_INVOICE_COMPANY_NAME` varchar(128) default NULL, `INDATA_INVOICE_COMPANY_ROLE` varchar(20) default NULL, `INDATA_INVOICE_CUSTOMER_NUMBER` varchar(128) default NULL, `INDATA_INVOICE_CURRENCY_CODE` varchar(32) default NULL, `INDATA_INVOICE_EXTERNAL_COMPANY_ID` varchar(128) default NULL, `INDATA_INVOICE_HOST_SYSTEM` varchar(128) default NULL, `INDATA_INVOICE_INVOICE_DATE` varchar(32) default NULL, `INDATA_INVOICE_POINT_OF_TITLE_TRANSFER` varchar(32) default NULL, `INDATA_INVOICE_REGISTRATIONS_BUYER_ROLE` varchar(32) default NULL, `INDATA_INVOICE_REGISTRATIONS_MIDDLEMAN_ROLE` varchar(32) default NULL, `INDATA_INVOICE_REGISTRATIONS_SELLER_ROLE` varchar(32) default NULL, `INDATA_INVOICE_VAT_GROUP_REGISTRATION` varchar(32) default NULL, `INDATA_INVOICE_TRANSACTION_TYPE` varchar(5) default NULL, `INDATA_INVOICE_UNIQUE_INVOICE_NUMBER` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE1` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE2` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE3` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE4` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE5` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE6` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE7` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE8` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE9` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE10` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE11` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE12` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE13` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE14` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE15` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE16` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE17` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE18` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE19` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE20` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE21` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE22` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE23` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE24` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE25` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE26` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE27` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE28` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE29` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE30` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE31` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE32` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE33` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE34` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE35` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE36` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE37` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE38` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE39` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE40` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE41` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE42` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE43` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE44` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE45` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE46` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE47` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE48` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE49` varchar(128) default NULL, `INDATA_INVOICE_USER_ELEMENT_ATTRIBUTE50` varchar(128) default NULL, `INDATA_INVOICE_ORIGINAL_DOCUMENT_ID` varchar(128) default NULL, `INDATA_INVOICE_ORIGINAL_DOCUMENT_ITEM` varchar(128) default NULL, `INDATA_INVOICE_ORIGINAL_DOCUMENT_TYPE` varchar(128) default NULL, `INDATA_INVOICE_ORIGINAL_INVOICE_DATE` varchar(32) default NULL, `INDATA_INVOICE_ORIGINAL_INVOICE_NUMBER` varchar(128) default NULL, `INDATA_INVOICE_ORIGINAL_MOVEMENT_DATE` varchar(32) default NULL, PRIMARY KEY (`ID`), KEY `RUN_ID` USING BTREE (`RUN_ID`), KEY `LINE` (`LINE`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4011 ; -- -- Constraints for dumped tables -- -- -- Constraints for table `TMD_INDATA_INVOICE` -- ALTER TABLE `TMD_INDATA_INVOICE` ADD CONSTRAINT `TMD_INDATA_INVOICE_ibfk_1` FOREIGN KEY (`RUN_ID`) REFERENCES `RunHistory` (`id`) ON DELETE CASCADE;
从我看到的那个表看起来相当自包含(即你不需要做任何LOJ来取出规范化的数据),所以MyISAM肯定会对访问速度产生积极的影响。
其次,最重要的是,你有正确的索引你的查询? 200万行是less数,但并不是那么多。 您需要仔细检查所有的SELECT查询,并确保每个查询都有适当的索引。 这将消耗一点磁盘空间,但折衷是令人难以置信的快速查询时间。
第三,这只是一个个人喜好,而不是真正NDATA_INVOICE_USER_ELEMENT_ATTRIBUTE1你的具体问题,我不认为,但NDATA_INVOICE_USER_ELEMENT_ATTRIBUTE1到NDATA_INVOICE_USER_ELEMENT_ATTRIBUTE50 – 这可以devise很多更聪明的移动到一个名为DATA_INVOICE_USER_ELEMENT_ATTRIBUTES与INVID,ATTRIBUTEID并将它们垂直存储在那里,然后立即为每行节省了6.25kb的空间。
确保至less你的索引适合内存。 设置innodb_buffer_pool_size足够大。 如果你需要事务或者有很多并发的写入权限 – 坚持innodb。
如果它只是大部分读取和小更新 – myisam perheps +调整内存分配。
尝试mysqltuner.pl的一些通用的build议,并深入mysqlperformanceblog更深入的细节。
2毫米的行不是太多。 也许是为了你的VM大小?
你不应该担心行的数量与你的数据集的大小一样多。 随着数据集大小的增加,它将不适合缓冲池,并开始从磁盘读取数据。
这里是关于提高MySQL / InnoDB插入/更新性能的答案