共計(jì) 1841 個(gè)字符,預(yù)計(jì)需要花費(fèi) 5 分鐘才能閱讀完成。
自動(dòng)寫代碼機(jī)器人,免費(fèi)開通
如何在 MySQL 數(shù)據(jù)庫(kù)中優(yōu)化 insert 的性能?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
MySQL 的 insert 語句語法,關(guān)于 mysql 優(yōu)化 insert 性能 的相關(guān)介紹。
insert into `table`(`field1`,`field2`) values(value1 , value2
提高 insert 性能的方法
1. 一條 sql 語句插入多條數(shù)據(jù)
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);
可以寫成
INSERT INTO `insert_table` (`uid`, `content`, `type`) VALUES (userid_0 , content_0 , 0), (userid_1 , content_1 , 1);
2. 使用事務(wù)
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;
注意
1.sql 語句長(zhǎng)度有限制,合并 sql 語句時(shí)要注意。長(zhǎng)度限制可以通過 max_allowed_packet 配置項(xiàng)修改,默認(rèn)為 1M。
2. 事務(wù)太大會(huì)影響執(zhí)行效率,mysql 有 innodb_log_buffer_size 配置項(xiàng),超過這個(gè)值會(huì)使用磁盤數(shù)據(jù),影響執(zhí)行效率。
關(guān)于事務(wù)的配置項(xiàng)說明:
innodb_buffer_pool_size
如 果用 Innodb,那么這是一個(gè)重要變量。相對(duì)于 MyISAM 來說,Innodb 對(duì)于 buffer size 更敏感。MySIAM 可能對(duì)于大數(shù)據(jù)量使用默認(rèn)的 key_buffer_size 也還好,但 Innodb 在大數(shù)據(jù)量時(shí)用默認(rèn)值就感覺在爬了。Innodb 的緩沖池會(huì)緩存數(shù)據(jù)和索引,所以不需要給系統(tǒng)的緩存留空間,如果只用 Innodb,可以把這個(gè)值設(shè)為內(nèi)存的 70%-80%。和 key_buffer 相同,如果數(shù)據(jù)量比較小也不怎么增加,那么不要把這個(gè)值設(shè)太高也可以提高內(nèi)存的使用率。
innodb_additional_pool_size
這個(gè)的效果不是很明顯,至少是當(dāng)操作系統(tǒng)能合理分配內(nèi)存時(shí)。但你可能仍需要設(shè)成 20M 或更多一點(diǎn)以看 Innodb 會(huì)分配多少內(nèi)存做其他用途。
innodb_log_file_size
對(duì)于寫很多尤其是大數(shù)據(jù)量時(shí)非常重要。要注意,大的文件提供更高的性能,但數(shù)據(jù)庫(kù)恢復(fù)時(shí)會(huì)用更多的時(shí)間。我一般用 64M-512M,具體取決于服務(wù)器的空間。
innodb_log_buffer_size
默認(rèn)值對(duì)于多數(shù)中等寫操作和事務(wù)短的運(yùn)用都是可以的。如 果經(jīng)常做更新或者使用了很多 blob 數(shù)據(jù),應(yīng)該增大這個(gè)值。但太大了也是浪費(fèi)內(nèi)存,因?yàn)?1 秒鐘總會(huì) flush(這個(gè)詞的中文怎么說呢?)一次,所以不需要設(shè)到超過 1 秒的需求。8M-16M 一般應(yīng)該夠了。小的運(yùn)用可以設(shè)更小一點(diǎn)。
innodb_flush_log_at_trx_commit
抱怨 Innodb 比 MyISAM 慢 100 倍?那么你大概是忘了調(diào)整這個(gè)值。默認(rèn)值 1 的意思是每一次事務(wù)提交或事務(wù)外的指令都需要把日志寫入(flush)硬盤,這是很費(fèi)時(shí)的。特別是使用電 池供電緩存(Battery backed up cache)時(shí)。設(shè)成 2 對(duì)于很多運(yùn)用,特別是從 MyISAM 表轉(zhuǎn)過來的是可以的,它的意思是不寫入硬盤而是寫入系統(tǒng)緩存。日志仍然會(huì)每秒 flush 到硬 盤,所以你一般不會(huì)丟失超過 1 - 2 秒的更新。設(shè)成 0 會(huì)更快一點(diǎn),但安全方面比較差,即使 MySQL 掛了也可能會(huì)丟失事務(wù)的數(shù)據(jù)。而值 2 只會(huì)在整個(gè)操作系統(tǒng) 掛了時(shí)才可能丟數(shù)據(jù)。
看完上述內(nèi)容,你們掌握如何在 MySQL 數(shù)據(jù)庫(kù)中優(yōu)化 insert 的性能的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝各位的閱讀!
向 AI 問一下細(xì)節(jié)