「MySQL」關於mysql 優化 insert 性能 的相關介紹

mysql 的 insert 語句語法,關於mysql 優化 insert 性能 的相關介紹。

insert into `table`(`field1`,`field2`) values('value1','value2');

提高insert 性能的方法

1.一條sql語句插入多條數據

INSERT INTO `insert_table` (`uid`, `content`, `type`) VALUES ('userid_0', 'content_0', 0);

INSERT INTO `insert_table` (`uid`, `content`, `type`) VALUES ('userid_1', 'content_1', 1);

「MySQL」關於mysql 優化 insert 性能 的相關介紹

可以寫成

INSERT INTO `insert_table` (`uid`, `content`, `type`) VALUES ('userid_0', 'content_0', 0), ('userid_1', 'content_1', 1);

2.使用事務

START TRANSACTION;

INSERT INTO `insert_table` (`uid`, `content`, `type`) VALUES ('userid_0', 'content_0', 0);

INSERT INTO `insert_table` (`uid`, `content`, `type`) VALUES ('userid_1', 'content_1', 1);

...

COMMIT;

「MySQL」關於mysql 優化 insert 性能 的相關介紹

注意

1.sql語句長度有限制,合併sql語句時要注意。長度限制可以通過max_allowed_packet配置項修改,默認為1M。

2.事務太大會影響執行效率,mysql有innodb_log_buffer_size配置項,超過這個值會使用磁盤數據,影響執行效率。

關於事務的配置項說明:

innodb_buffer_pool_size

如 果用Innodb,那麼這是一個重要變量。相對於MyISAM來說,Innodb對於buffer size更敏感。MySIAM可能對於大數據量使用默認的key_buffer_size也還好,但Innodb在大數據量時用默認值就感覺在爬了。 Innodb的緩衝池會緩存數據和索引,所以不需要給系統的緩存留空間,如果只用Innodb,可以把這個值設為內存的70%-80%。和 key_buffer相同,如果數據量比較小也不怎麼增加,那麼不要把這個值設太高也可以提高內存的使用率。

innodb_additional_pool_size

這個的效果不是很明顯,至少是當操作系統能合理分配內存時。但你可能仍需要設成20M或更多一點以看Innodb會分配多少內存做其他用途。

innodb_log_file_size

對於寫很多尤其是大數據量時非常重要。要注意,大的文件提供更高的性能,但數據庫恢復時會用更多的時間。我一般用64M-512M,具體取決於服務器的空間。innodb_log_buffer_size

默認值對於多數中等寫操作和事務短的運用都是可以的。如 果經常做更新或者使用了很多blob數據,應該增大這個值。但太大了也是浪費內存,因為1秒鐘總會 flush(這個詞的中文怎麼說呢?)一次,所以不需要設到超過1秒的需求。8M-16M一般應該夠了。小的運用可以設更小一點。innodb_flush_log_at_trx_commit

「MySQL」關於mysql 優化 insert 性能 的相關介紹

抱怨Innodb比MyISAM慢 100倍?那麼你大概是忘了調整這個值。默認值1的意思是每一次事務提交或事務外的指令都需要把日誌寫入(flush)硬盤,這是很費時的。特別是使用電 池供電緩存(Battery backed up cache)時。設成2對於很多運用,特別是從MyISAM錶轉過來的是可以的,它的意思是不寫入硬盤而是寫入系統緩存。日誌仍然會每秒flush到硬 盤,所以你一般不會丟失超過1-2秒的更新。設成0會更快一點,但安全方面比較差,即使MySQL掛了也可能會丟失事務的數據。而值2只會在整個操作系統 掛了時才可能丟數據。


分享到:


相關文章: