時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(3)
很多時(shí)候關(guān)心的是優(yōu)化SELECT 查詢,因?yàn)樗鼈兪亲畛S玫牟樵?,而且確定怎樣優(yōu)化它們并不總是直截了當(dāng)。相對(duì)來(lái)說(shuō),將數(shù)據(jù)裝入數(shù)據(jù)庫(kù)是直截了當(dāng)?shù)?。然而,也存在可用?lái)改善數(shù)據(jù)裝載操作效率的策略,其基本原理如下:
成批裝載較單行裝載更快,因?yàn)樵谘b載每個(gè)記錄后,不需要刷新索引高速緩存;可在成批記錄裝入后才刷新。
在表無(wú)索引時(shí)裝載比索引后裝載更快。如果有索引,不僅必須增加記錄到數(shù)據(jù)文件,而且還要修改每個(gè)索引以反映增加了的新記錄。
較短的SQL 語(yǔ)句比較長(zhǎng)的SQL 語(yǔ)句要快,因?yàn)樗鼈兩婕胺?wù)器方的分析較少,而且還因?yàn)閷⑺鼈兺ㄟ^(guò)網(wǎng)絡(luò)從客戶機(jī)發(fā)送到服務(wù)器更快。這些因素中有一些似乎微不足道(特別是最后一個(gè)因素),但如果要裝載大量的數(shù)據(jù),即使是很小的因素也會(huì)產(chǎn)生很大的不同結(jié)果。我們可以利用上述的一般原理推導(dǎo)出幾個(gè)關(guān)于如何最快地裝載數(shù)據(jù)的實(shí)際結(jié)論:
LOAD DATA(包括其所有形式)比INSERT 效率高,因?yàn)槠涑膳b載行。索引刷新較少,并且服務(wù)器只需分析和解釋一條語(yǔ)句而不是幾條語(yǔ)句。
LOAD DATA 比LOAD DATA LOCAL 效率更高。利用LOAD DATA,文件必須定位在服務(wù)器上,而且必須具有FILE 權(quán)限,但服務(wù)器可從磁盤(pán)直接讀取文件。利用LOAD DATA LOCAL,客戶機(jī)讀取文件并將其通過(guò)網(wǎng)絡(luò)發(fā)送給服務(wù)器,這樣做很慢。
如果必須使用INSERT,應(yīng)該利用允許在單個(gè)語(yǔ)句中指定多行的形式,例如:
可在語(yǔ)句中指定的行越多越好。這樣會(huì)減少所需的語(yǔ)句數(shù)目,降低索引刷新量。如果使用mysqldump 生成數(shù)據(jù)庫(kù)備份文件,應(yīng)該使用--extended-insert 選項(xiàng),使轉(zhuǎn)儲(chǔ)文件包含多行INSERT 語(yǔ)句。還可以使用- - o p t(優(yōu)化) ,它啟用--extended-insert 選項(xiàng)。反之,應(yīng)該避免使用mysqldump 的--complete-insert 選項(xiàng);此選項(xiàng)會(huì)導(dǎo)致INSERT 語(yǔ)句為單行,執(zhí)行時(shí)間更長(zhǎng),比不用--complete-insert 選項(xiàng)生成的語(yǔ)句需要更多的分析。
使用壓縮了的客戶機(jī)/服務(wù)器協(xié)議以減少網(wǎng)絡(luò)數(shù)據(jù)流量。對(duì)于大多數(shù)MySQL客戶機(jī),可以用--compress 命令行選項(xiàng)來(lái)指定。它一般只用于較慢的網(wǎng)絡(luò),因?yàn)閴嚎s需要占用大量的處理器時(shí)間。
讓MySQL插入缺省值;不要在INSERT 語(yǔ)句中指定將以任意方式賦予缺省值的列。平均來(lái)說(shuō),這樣做語(yǔ)句會(huì)更短,能減少通過(guò)網(wǎng)絡(luò)傳送給服務(wù)器的字符數(shù)。此外,語(yǔ)句包含的值較少,服務(wù)器所進(jìn)行的分析和轉(zhuǎn)換就會(huì)較少。
如果表是索引的,則可利用批量插入( LOAD DATA 或多行的INSERT 語(yǔ)句)來(lái)減少索引的開(kāi)銷(xiāo)。這樣會(huì)最小化索引更新的影響,因?yàn)樗饕恍枰谒行刑幚磉^(guò)時(shí)才進(jìn)行刷新,而不是在每行處理后就刷新。
如果需要將大量數(shù)據(jù)裝入一個(gè)新表,應(yīng)該創(chuàng)建該表且在未索引時(shí)裝載,裝載數(shù)據(jù)后才創(chuàng)建索引,這樣做較快。一次創(chuàng)建索引(而不是每行修改一次索引)較快。
如果在裝載之前刪除或禁用索引,裝入數(shù)據(jù)后再重新創(chuàng)建或啟用索引可能使裝載更快。如果想對(duì)數(shù)據(jù)裝載使用刪除或禁用策略,一定要做一些實(shí)驗(yàn),看這樣做是否值得(如果將少量數(shù)據(jù)裝入一個(gè)大表中,重建和索引所花費(fèi)的時(shí)間可能比裝載數(shù)據(jù)的時(shí)間還要長(zhǎng))。
可用DROP INDEX 和CREATE INDEX 來(lái)刪除和重建索引。另一種可供選擇的方法是利用myisamchk 或isamchk 禁用和啟用索引。這需要在MySQL服務(wù)器主機(jī)上有一個(gè)帳戶,并對(duì)表文件有寫(xiě)入權(quán)。為了禁用表索引,可進(jìn)入相應(yīng)的數(shù)據(jù)庫(kù)目錄,執(zhí)行下列命令之一:
對(duì)具有.MYI 擴(kuò)展名的索引文件的MyISAM 表使用myisamchk,對(duì)具有.ISM 擴(kuò)展名的索引文件的ISAM 表使用isamchk。在向表中裝入數(shù)據(jù)后,按如下激活索引:
如果決定使用索引禁用和激活,應(yīng)該使用第13章中介紹的表修復(fù)鎖定協(xié)議以阻止服務(wù)器同時(shí)更改鎖(雖然此時(shí)不對(duì)表進(jìn)行修復(fù),但要對(duì)它像表修復(fù)過(guò)程一樣進(jìn)行修改,因此需要使用相同的鎖定協(xié)議)。
上述數(shù)據(jù)裝載原理也適用于與需要執(zhí)行不同操作的客戶機(jī)有關(guān)的固定查詢。例如,一般希望避免在頻繁更新的表上長(zhǎng)時(shí)間運(yùn)行SELECT 查詢。長(zhǎng)時(shí)間運(yùn)行SELECT 查詢會(huì)產(chǎn)生大量爭(zhēng)用,并降低寫(xiě)入程序的性能。一種可能的解決方法為,如果執(zhí)行寫(xiě)入的主要是INSERT 操作,那么先將記錄存入一個(gè)臨時(shí)表,然后定期地將這些記錄加入主表中。如果需要立即訪問(wèn)新記錄,這不是一個(gè)可行的方法。但只要能在一個(gè)較短的時(shí)間內(nèi)不訪問(wèn)它們,就可以使用這個(gè)方法。使用臨時(shí)表有兩個(gè)方面的好處。首先,它減少了與主表上SELECT 查詢語(yǔ)句的爭(zhēng)用,因此,執(zhí)行更快。其次,從臨時(shí)表將記錄裝入主表的總時(shí)間較分別裝載記錄的總時(shí)間少;相應(yīng)的索引高速緩存只需在每個(gè)批量裝載結(jié)束時(shí)進(jìn)行刷新,而不是在每行裝載后刷新。這個(gè)策略的一個(gè)應(yīng)用是進(jìn)入Web 服務(wù)器的Web 頁(yè)訪問(wèn)MySQL數(shù)據(jù)庫(kù)。在此情形下,可能沒(méi)有保證記錄立即進(jìn)入主表的較高權(quán)限。
如果數(shù)據(jù)并不完全是那種在系統(tǒng)非正常關(guān)閉事件中插入的單個(gè)記錄,那么減少索引刷新的另一策略是使用MyISAM 表的DELAYED_KEY_WRITE 表創(chuàng)建選項(xiàng)(如果將MySQL用于某些數(shù)據(jù)錄入工作時(shí)可能會(huì)出現(xiàn)這種情況)。此選項(xiàng)使索引高速緩存只偶爾刷新,而不是在每次插入后都要刷新。
如果希望在服務(wù)器范圍內(nèi)利用延遲索引刷新,只要利用--delayed-key-write 選項(xiàng)啟動(dòng)mysqld 即可。在此情形下,索引塊寫(xiě)操作延遲到必須刷新塊以便為其他索引值騰出空間為止,或延遲到執(zhí)行了一個(gè)flush-tables 命令后,或延遲到該索引表關(guān)閉。
關(guān)鍵詞標(biāo)簽:MySQL
相關(guān)閱讀
熱門(mén)文章 Xbox Game Pass 10款MySQL數(shù)據(jù)庫(kù)客戶端圖形界面管理工具推薦 MySQL常用維護(hù)管理工具 MySQL數(shù)據(jù)庫(kù)啟動(dòng)失敗1067進(jìn)程意外終止的解決辦法總結(jié)
人氣排行 10款MySQL數(shù)據(jù)庫(kù)客戶端圖形界面管理工具推薦 MySQL數(shù)據(jù)庫(kù)啟動(dòng)失敗1067進(jìn)程意外終止的解決辦法總結(jié) Mysql 1045錯(cuò)誤解決辦法 MySQL服務(wù)器進(jìn)程CPU占用100%解決辦法 MySQL導(dǎo)出導(dǎo)入命令的用例 MySQL連接字符串的實(shí)際操作步驟匯總 MySQL無(wú)法啟動(dòng)、無(wú)法停止各種解決方法總結(jié) 三種常用的MySQL建表語(yǔ)句