提高MySQL中資料裝載效率

來源:互聯網
上載者:User

相對來說,將資料裝入資料庫是直截了當的。然而,也存在可用來改善資料裝載操作效率的策略,其基本原理如下:

成批裝載較單行裝載更快,因為在裝載每個記錄後,不需要重新整理索引快取;可在成批記錄裝入後才重新整理。

在表無索引時裝載比索引後裝載更快。如果有索引,不僅必須增加記錄到資料檔案,而且還要修改每個索引以反映增加了的新記錄。

較短的SQL 陳述式比較長的SQL 陳述式要快,因為它們涉及伺服器方的分析較少,而且還因為將它們通過網路從客戶機發送到伺服器更快。這些因素中有一些似乎微不足道(特別是最後一個因素),但如果要裝載大量的資料,即使是很小的因素也會產生很大的不同結果。我們可以利用上述的一般原理推匯出幾個關於如何最快地裝載資料的實際結論:

LOAD DATA(包括其所有形式)比INSERT 效率高,因為其成批裝載行。索引重新整理較少,並且伺服器只需分析和解釋一條語句而不是幾條語句。

LOAD DATA 比LOAD DATA LOCAL 效率更高。利用LOAD DATA,檔案必須定位在伺服器上,而且必須具有FILE 許可權,但伺服器可從磁碟直接讀取檔案。利用LOAD DATA LOCAL,客戶機讀取檔案並將其通過網路發送給伺服器,這樣做很慢。

如果必須使用INSERT,應該利用允許在單個語句中指定多行的形式,例如:

可在語句中指定的行越多越好。這樣會減少所需的語句數目,降低索引重新整理量。如果使用mysqldump 產生Database Backup檔案,應該使用--extended-insert 選項,使轉儲檔案包含多行INSERT 語句。還可以使用- - o p t(最佳化) ,它啟用--extended-insert 選項。反之,應該避免使用mysqldump 的--complete-insert 選項;此選項會導致INSERT 語句為單行,執行時間更長,比不用--complete-insert 選項產生的語句需要更多的分析。

使用壓縮了的客戶機/伺服器協議以減少網路資料流量。對於大多數MySQL客戶機,可以用--compress 命令列選項來指定。它一般只用於較慢的網路,因為壓縮需要佔用大量的處理器時間。

讓MySQL插入預設值;不要在INSERT 語句中指定將以任意方式賦予預設值的列。平均來說,這樣做語句會更短,能減少通過網路傳送給伺服器的字元數。此外,語句包含的值較少,伺服器所進行的分析和轉換就會較少。

如果表是索引的,則可利用批量插入( LOAD DATA 或多行的INSERT 語句)來減少索引的開銷。這樣會最小化索引更新的影響,因為索引只需要在所有行處理過時才進行重新整理,而不是在每行處理後就重新整理。

如果需要將大量資料裝入一個新表,應該建立該表且在未索引時裝載,裝載資料後才建立索引,這樣做較快。一次建立索引(而不是每行修改一次索引)較快。

如果在裝載之前刪除或禁用索引,裝入資料後再重新建立或啟用索引可能使裝載更快。如果想對資料裝載使用刪除或禁用策略,一定要做一些實驗,看這樣做是否值得(如果將少量資料裝入一個大表中,重建和索引所花費的時間可能比裝載資料的時間還要長)。

可用DROP INDEX 和CREATE INDEX 來刪除和重建索引。另一種可供選擇的方法是利用myisamchk 或isamchk 禁用和啟用索引。這需要在MySQL伺服器主機上有一個帳戶,並對錶檔案有寫入權。為了禁用表索引,可進入相應的資料庫目錄,執行下列命令之一:

對具有.MYI 副檔名的索引檔案的MyISAM 表使用myisamchk,對具有.ISM 副檔名的索引檔案的ISAM 表使用isamchk。在向表中裝入資料後,按如下啟用索引:

如果決定使用索引禁用和啟用,應該使用第13章中介紹的表修複鎖定協議以阻止伺服器同時更改鎖(雖然此時不對錶進行修複,但要對它像表修複過程一樣進行修改,因此需要使用相同的鎖定協議)。

上述資料裝載原理也適用於與需要執行不同操作的客戶機有關的固定查詢。例如,一般希望避免在頻繁更新的表上長時間運行SELECT 查詢。長時間運行SELECT 查詢會產生大量爭用,並降低寫入程式的效能。一種可能的解決方案為,如果執行寫入的主要是INSERT 操作,那麼先將記錄存入一個暫存資料表,然後定期地將這些記錄加入主表中。如果需要立即訪問新記錄,這不是一個可行的方法。但只要能在一個較短的時間內不訪問它們,就可以使用這個方法。使用暫存資料表有兩個方面的好處。首先,它減少了與主表上SELECT 查詢語句的爭用,因此,執行更快。其次,從暫存資料表將記錄裝入主表的總時間較分別裝載記錄的總時間少;相應的索引快取只需在每個批量裝載結束時進行重新整理,而不是在每行裝載後重新整理。這個策略的一個應用是進入Web 服務器的Web 頁訪問MySQL資料庫。在此情形下,可能沒有保證記錄立即進入主表的較高許可權。

如果資料並不完全是那種在系統非正常關閉事件中插入的單個記錄,那麼減少索引重新整理的另一策略是使用MyISAM 表的DELAYED_KEY_WRITE 表建立選項(如果將MySQL用於某些資料錄入工作時可能會出現這種情況)。此選項使索引快取只偶爾重新整理,而不是在每次插入後都要重新整理。

如果希望在伺服器範圍內利用延遲索引重新整理,只要利用--delayed-key-write 選項啟動mysqld 即可。在此情形下,索引塊寫操作延遲到必須重新整理塊以便為其他索引值騰出空間為止,或延遲到執行了一個flush-tables 命令後,或延遲到該索引表關閉。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.