我有一個執行大量插入的mySQL存儲過程。 由於性能不佳,我決定不在每個循環中插入,而不是爲INSERT構建一個字符串,並且在過程結束時,我會對所有具有準備語句的值執行一個大的INSERT操作。準備好的聲明的最大長度是多少?
問題是我的語句會比VARCHAR大。它必須是TEXT。
問題是:我可以這樣做嗎?或者準備好的語句必須是VARCHAR? 準備好的聲明的最大長度是多少?
我有一個執行大量插入的mySQL存儲過程。 由於性能不佳,我決定不在每個循環中插入,而不是爲INSERT構建一個字符串,並且在過程結束時,我會對所有具有準備語句的值執行一個大的INSERT操作。準備好的聲明的最大長度是多少?
問題是我的語句會比VARCHAR大。它必須是TEXT。
問題是:我可以這樣做嗎?或者準備好的語句必須是VARCHAR? 準備好的聲明的最大長度是多少?
使用LOAD DATA。當在mySQL中進行大量插入時,這是具有最佳性能的選項,您也可以修改輸入數據。
檢查一下: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個併發交易的限制通過修改數據。
這兩個設置會限制你的交易規模,所以基本上你需要補充提交的每個第N行(而不是每1行),第N是更好地確定方案
UPDATE :查看@BillKarwin的評論 - 基本上我們可以說交易規模沒有限制
這不是限制的意思;它不是每筆交易的報表數量的限制。這是回滾段中佔用空間的事務數量(不是語句)的限制。無論如何,MySQL 5.5及更高版本的限制增加了128倍,並且在MySQL 5.6中,它的配置可高達128x1023。 http://dev.mysql.com/doc/refman/5.6/en/innodb-restrictions.html –
@BillKarwin你是對的,正在更新 –
一個小'innodb_log_fize_size'不限制事務的範圍。如果日誌填滿,未提交的更改將刷新到表空間,然後可以覆蓋日誌文件中的空間。這意味着如果您執行了大量事務然後回滾,則必須從回滾段中恢復先前版本的頁面,然後再刷新它們。因此,大量交易的回滾可能非常昂貴,因此您在推薦定期提交時是正確的。 –
它的價值:最大長度VARCHAR = 65535字節; TEXT的最大長度= 65535字節。 –
怎麼樣批量更新?執行多個插入語句(每個語句都是一個預備語句),並在10次插入後批量應用它們。 –
我選擇了臨時表的選項。我插入一切,最後我只有一個INSERT INTO mytable SELECT * FROM mytemp;它顯着提高了性能。性能明智的最佳選擇將是randiel的答案,因爲我讀到從文件加載數據是mysql中最優化的批量插入選項。另外@BillKarwin你的第一個評論基本上回答了我的問題。 –