CentOSのMySQL5.0.45で実行されているInnoDBテーブルがあります。さらに悪いことに、それはすべて仮想マシンで実行されています。非常に簡単に200万レコードを超える可能性があるテーブルが複数あります。私は、900Kから1Mのレコードマークあたりから、DBのパフォーマンスが低下し始めていることに気づきました。
私には、このような状況下で可能な限り立ち上がるために、将来に向けてあらゆる変更を加えるために必要なすべての力があります。 MyIsamを使用する必要がありますか?インデックスは数個しかなく、書き込みパフォーマンスが良くなることを最も心配しています。テーブルにデータを書き込むプログラムは、テーブルごとに約250のリクエストのグループにデータをバッチ処理し、テーブルごとに実行して問題を解決します。
大きなテーブルの1つにcreatetableステートメントを含めましたが、それは非常に幅の広いテーブルです-理解しています。入ってくるデータに確実に対応できるようにしながら、列をできるだけ狭くしようとしました。
編集:
プログラムは、実行中に何かがファンに当たった場合に変更をロールバックするためのトランザクションを採用しますが、基本的にはデータベースのファイアホーススタイルにデータを送り込むだけです。 1回の8時間の実行で、このような各テーブルに400K行を簡単に配置できます。このテーブルは、同じサイズですべて同じインデックスを持つ25のテーブルの1つです。それらはすべて、LINEとRUN_IDによるクエリのために結合されます。読み取りパフォーマンス-私は特に心配していません。私は書き込みをできるだけ速くしようとしています。
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万行は少数ですが、実際にはそうではありませんthat多数です。すべてのSELECT
クエリを注意深く調べ、それぞれに適切なインデックスがあることを確認する必要があります。これは少しのディスクスペースを消費しますが、トレードオフは信じられないほど速いクエリ時間です。
第三に、これは個人的な好みであり、特定の問題とはあまり関係がないと思いますが、NDATA_INVOICE_USER_ELEMENT_ATTRIBUTE1
からNDATA_INVOICE_USER_ELEMENT_ATTRIBUTE50
-これは設計可能ですlot = PKがDATA_INVOICE_USER_ELEMENT_ATTRIBUTES
のINVID,ATTRIBUTEID
というテーブルに移動し、そこに垂直に格納することで、よりスマートになり、すぐに1行あたり6.25kbのスペースを節約できます。
少なくともインデックスがメモリに収まるようにしてください。 set innodb_buffer_pool_size 十分な大きさ。トランザクションが必要な場合、または同時書き込みアクセスが多い場合は、innodbに固執してください。
読み取り専用で更新がほとんどない場合-myisamperheps +調整されたメモリ割り当て。
mysqltuner.pl を試して一般的なアドバイスを確認し、 mysqlperformanceblog を参照して詳細を確認してください。
2mlnの行はそれほど多くありません。たぶんあなたのVMサイズ?
データセットのサイズほど行の数について心配する必要はありません。データセットのサイズが大きくなると、バッファプールに収まらず、ディスクからデータの読み取りを開始します。
これが私の答えです MySQL/InnoDBの挿入/更新のパフォーマンスの向上