2013-10-21 61 views
0

我有一個執行大量插入的mySQL存儲過程。 由於性能不佳,我決定不在每個循環中插入,而不是爲INSERT構建一個字符串,並且在過程結束時,我會對所有具有準備語句的值執行一個大的INSERT操作。準備好的聲明的最大長度是多少?

問題是我的語句會比VARCHAR大。它必須是TEXT。

問題是:我可以這樣做嗎?或者準備好的語句必須是VARCHAR? 準備好的聲明的最大長度是多少?

+1

它的價值:最大長度VARCHAR = 65535字節; TEXT的最大長度= 65535字節。 –

+0

怎麼樣批量更新?執行多個插入語句(每個語句都是一個預備語句),並在10次插入後批量應用它們。 –

+0

我選擇了臨時表的選項。我插入一切,最後我只有一個INSERT INTO mytable SELECT * FROM mytemp;它顯着提高了性能。性能明智的最佳選擇將是randiel的答案,因爲我讀到從文件加載數據是mysql中最優化的批量插入選項。另外@BillKarwin你的第一個評論基本上回答了我的問題。 –

回答

1

使用LOAD DATA。當在mySQL中進行大量插入時,這是具有最佳性能的選項,您也可以修改輸入數據。

0

檢查一下:http://dev.mysql.com/doc/refman/5.0/en/packet-too-large.html - 單查詢這個實際的限制

,但你的問題看起來更深,如果你需要進行過多的插入,你需要準備一個INSERT語句,並在循環值綁定到它,執行一個個

加快這個過程中,你將需要關閉自動提交設置,但那麼你就會有下一個問題:http://dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html

InnoDB的有創造撤消記錄1023個併發交易的限制通過修改數據。

innodb_log_file_size

這兩個設置會限制你的交易規模,所以基本上你需要補充提交的每個第N行(而不是每1行),第N是更好地確定方案

UPDATE :查看@BillKarwin的評論 - 基本上我們可以說交易規模沒有限制

+0

這不是限制的意思;它不是每筆交易的報表數量的限制。這是回滾段中佔用空間的事務數量(不是語句)的限制。無論如何,MySQL 5.5及更高版本的限制增加了128倍,並且在MySQL 5.6中,它的配置可高達128x1023。 http://dev.mysql.com/doc/refman/5.6/en/innodb-restrictions.html –

+0

@BillKarwin你是對的,正在更新 –

+1

一個小'innodb_log_fize_size'不限制事務的範圍。如果日誌填滿,未提交的更改將刷新到表空間,然後可以覆蓋日誌文件中的空間。這意味着如果您執行了大量事務然後回滾,則必須從回滾段中恢復先前版本的頁面,然後再刷新它們。因此,大量交易的回滾可能非常昂貴,因此您在推薦定期提交時是正確的。 –