MySQL兩千萬數據優化遷移

最近有一張2000W條記錄的數據表需要優化和遷移。2000W數據對于MySQL來說很尷尬,因為合理的創建索引速度還是挺快的,再怎么優化速度也得不到多大提升。不過這些數據有大量的冗余字段和錯誤信息,極不方便做統計和分析。所以我需要創建一張新表,把舊表中的數據一條一條取出來優化后放回新表;

一. 清除冗余數據,優化字段結構

2000W數據中,能作為查詢條件的字段我們是預知的。所以將這部分數據單獨創建新的字段,對于有規則的數據合理改變字段結構,比如身份證就是varchar(18)。對于不重要的數據我們合并后存在一個結構為text的字段。

對于一些有關聯的數據我們需要計算,常見的比如身份證種能獲取到準確的性別,出生地、生日、年齡。

二. 數據遷移

我們從數據庫中取出一條舊數據,再通過計算處理后得到想要的新數據,最后將新數據插入新表。不過在獲取新數據時遇到如下問題。

  1. 數據量太大,無法一次獲取(2000W數據扔到內存挺可怕的);

    我們可以通過MySQL的limit語法分批獲取。比如每次獲取50000,SQL語句如下:

    select * from table_name limit 15000000,50000;

    通過這種方法能解決數據量太大的問題,但是隨著limit的第一個參數越來越大,查詢速度會慢的嚇人(上面這條SQL執行會花35秒)。時間就是生命,于是我們開始優化SQL語句,優化后變成下面這樣:

    select * from table_name order by id desc limit 5000000,50000;

    可通過二分法拆分2000W數據,當執行到1000W數據時,將數據倒序。優化后SQL執行效率顯著提升,從35秒降到9秒;

    不過還是很慢,時間就是生命……還好我們有自增ID(創建數據表第一條定律,一定要有自增字段),優化后的SQl如下:

    1. select * from table_name where id>15000000 and id<15050000;
    2. select * from table_name where id>15000000 limit 50000; 

    為了直觀演示,我寫了兩條功能一樣的SQL。相比第一條,第二條的limit會導致SQL的索引命中變差,效率同樣也會下降。第一條SQL的執行時間是2毫秒,第二條執行時間5毫秒(我取的平均值)。每次數據的查詢速度直接從35秒降到2毫秒……

  2. 數據量太大并且數據無法預估,某些特殊數據會導致數據導入失敗;

    我們有三種方案去將新數據存入新表,分別如下:

    1. 一條一條插入數據;

    開始肯定會想這種方案一定不行,因為每次插入都會有一次數據庫IO操作。但是該方案有個好處是能及時發現有問題的數據,修改后再繼續執行; 在Oracle中使用『綁定變量』能帶來性能提升,正好MySQL也提供了『綁定變量』的功能。于是在不改變邏輯的情況下,嘗試優化數據存儲速度。代碼如下:

    public function actionTest(array $data)
    {$mysqli = new mysqli("192.168.1.106", "username", "password", "test");$sql = "insert into table_name(name,identity) values (?,?)";$stmt = $connection->prepare($sql);$name = "";$identity = "";//使用綁定變量$stmt->bind_param("si", $name, $identity);foreach($data as $val){$name = $val[name];$identity = $val[card_id];//執行$stmt->execute();}$stmt->close();
    }

    最后效果不怎么好,MySQL的『綁定變量』并沒帶來明顯的速度提升,不過能有效的防止SQL注入;

    1. 一次插入50000條數據;

    這是我最后選中的方案,一是能及時發現有問題的數據,二是導入數據非常穩定。就像支持斷點續傳一樣,每一步都能看到效果。在執行腳本時,也能同步開始寫分析邏輯;

    1. 組裝成SQL文件,最后統一導入;

    組裝一個大的SQL文件,最后通過MySQL自帶的工具導入也是極好的。但如果有一條SQL有問題,你可能需要重跑一次腳本。因為在9G大小的文本文件中修改一個符號是很痛苦的事情……

三. 總結

通過各種優化,最后將腳本執行時間縮短到了20分鐘內。優化后數據質量得到了較高保證,下次將嘗試2億數據的優化&遷移……

PS:原文地址 http://blog.it2048.cn/article_2000w-data.html 之后我會陸續把自己博客遷移到云棲社區,希望大家關注!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260750.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260750.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260750.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux Tomcat 6.0安裝配置實踐總結

系統環境&#xff1a; Red Hat Enterprise Linux Server release 5.7 (Tikanga) 64位 Tomcat下載 從官方網站 http://tomcat.apache.org/下載你需要的Tomcat版本&#xff0c;目前Tomcat主要版本有Tomcat 6.0、Tomcat 7.0、Tomcat 8.0三個版本&#xff0c;下面我們以6.0(6.0.39…

如何給FormPanel表單中的元素賦值以及獲取表單元素值

1.定義表單元素的name屬性如下 var HLV new Ext.form.TextField({fieldLabel: 匯率,name:EXCHANGERATE,anchor: 30%}); 2.定義數據源 var ExchangeRatestore new Ext.data.Store({proxy: new Ext.data.HttpProxy({ url: WsECOTAX01.asmx/SelectExchangeRate, method: "po…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波1 - 傅里葉級數和變換簡史

本章主要講解頻域域濾波的技術&#xff0c;主要技術用到是大家熟悉的傅里葉變換與傅里葉反變換。這里有比較多的篇幅講解的傅里葉的推導進程&#xff0c;用到Numpy傅里葉變換。本章理論基礎比較多&#xff0c;需要更多的耐心來閱讀&#xff0c;有發現有錯誤&#xff0c;可以與我…

python中str是什么函數_python str函數怎么用

展開全部 是將一個2113對象轉成字符串顯示5261&#xff0c;注意只是顯示用&#xff0c;有些對象4102轉成字符串沒有直1653接的意思。 str():將變量轉化為字符串類型 a 1 b [1, 2, 3] str_a str(a) print(a) print(type(a)) str_b str(b) print(b) print(type(b)) The str()…

[ofbiz]less-than (lt;) and greater-than (gt;) symbols

問題描述&#xff1a; In field [updateItemStr] less-than (<) and greater-than (>) symbols are not allowed 此處的field [updateItemStr]是services的一個IN參數&#xff0c;錯誤描述的意思是"<,>"不能出現在這個域內。 解決辦法&#xff1a; 在ser…

分頁探究--Filter+JSTL

最近卡了一個功能就是分頁&#xff0c;查了很多資料&#xff0c;分頁大概是兩種類型&#xff1a;一種是把數據庫的東西全部查出來然后放在session里&#xff0c;用list一頁一頁傳到頁面&#xff0c;這樣的消耗比較大;另一種就是使用sql語句的limit來進行數據庫分頁查詢。我使用…

iPhone開發資料之內存管理 ,循環引用導致的內存問題

iPhone開發資料之內存管理 ,循環引用導致的內存問題 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447 http://en.wikipedia.org/wiki/Reference_counting 【IT168 技術文檔】開…

python能做大型游戲嗎_python有做大型游戲的潛力嗎?

著作權歸作者所有。商業轉載請聯系作者獲得授權&#xff0c;非商業轉載請注明出處。 豈止是有潛力&#xff0c;簡直是很合適&#xff01; 豬廠兩大游戲客戶端引擎&#xff0c;NeoX 和 Messiah&#xff0c;都使用 Python 作為腳本語言。 你最近所了解的比較火的掛著豬廠旗號的&a…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波2 - 復數、傅里葉級數、連續單變量函數的傅里葉變換、卷積

目錄基本概念復數傅里葉級數沖激函數及其取樣&#xff08;篩選&#xff09;性質連續單變量函數的傅里葉變換卷積基本概念 復數 復數CCC的定義為 CRjI(4.3)C R jI \tag{4.3}CRjI(4.3) R,IR,IR,I為實數&#xff0c;RRR是實部&#xff0c;III是虛部&#xff0c;j?1j \sqrt{-…

不要迷失在技術的海洋中【轉】

轉自http://www.cnblogs.com/lovecherry/archive/2007/10/28/940555.html 不要迷失在技術的海洋中 技術就好像一片汪洋大海&#xff0c;越深入越望不到邊際。就拿自己的體驗來說吧&#xff0c;2000年的時候在學校搞ASP&#xff0c;覺得網頁開發就是這么簡單&#xff0c;把數據庫…

使用代碼設置Item級的權限(權限總結1)

itle in english:set Item Level Permission for SharePoint (MOSS/WSS) List/Document Library Programmatically 有些時候&#xff0c;我們需要為文檔庫里面某個文件設置特殊的權限&#xff0c;這個權限不繼承自列表權限&#xff0c;當然最簡單的最好是再創建一個列表&#…

echarts 4.0.4怎么下載_怎么讓ECharts的提示框tooltip自動輪播?

1. 怎么讓ECharts的提示框tooltip自動輪播?在用ECharts做大屏或者可視化展示項目的時候&#xff0c;讓提示框tooltip自動輪播是比較常見的需求&#xff0c;給大家推薦一個插件叫echarts-tooltip-auto-show,名字是有點長&#xff0c;但是挺好用的。在hover顯示tooltip之后&…

[React Native]高度自增長的TextInput組件

之前我們學習了從零學React Native之11 TextInput了解了TextInput相關的屬性。 在開發中,我們有時候有這樣的需求, 希望輸入區域的高度隨著輸入內容的長度而增長, 如下&#xff1a; 這時候我們需要自定義一個組件&#xff1a; 在項目中創建AutoExpandingTextInput.js import …

網站開啟Gzip壓縮-apache

找到并打開apache/conf目錄中的httpd.conf文件 httpd.conf中打開deflate_Module和headers_Module模塊&#xff0c;具體做法為將 如下兩句前面的#去掉&#xff1a;LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so 3.配置文…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波3 - 取樣和取樣函數的傅里葉變換、混疊

目錄取樣和取樣函數的傅里葉變換取樣取樣后的函數的傅里葉變換取樣定理混疊由取樣后的數據重建&#xff08;復原&#xff09;函數取樣和取樣函數的傅里葉變換 取樣 fˉ(t)f(t)sΔT(t)∑n?∞∞f(t)δ(t?nΔT)(4.27)\bar f(t) f(t)s_{\Delta T}(t) \sum_{n-\infty}^{\infty}…

[轉]Android開發,實現可多選的圖片ListView,便于批量操作

本文轉自&#xff1a;http://www.cnblogs.com/gergulo/archive/2011/06/14/2080629.html 之前項目需要實現一個可多選的圖片列表&#xff0c;用戶選中一到多張圖片后&#xff0c;批量上傳。但是網上有可多選普通列表的代碼、也有單純圖片列表的代碼&#xff0c;卻沒有兩者合并的…

個人信息安全影響評估指南_發布 | 網絡安全標準實踐指南—移動互聯網應用程序(App)收集使用個人信息自評估指南...

關于發布《網絡安全標準實踐指南—移動互聯網應用程序(App)收集使用個人信息自評估指南》的通知信安秘字[2020] 40號各有關單位&#xff1a;為落實《網絡安全法》相關要求&#xff0c;圍繞中央網信辦、工信部、公安部、市場監管總局聯合制定的《App違法違規收集使用個人信息行為…

Go的50度灰:Golang新開發者要注意的陷阱和常見錯誤

Go的50度灰&#xff1a;Golang新開發者要注意的陷阱和常見錯誤 http://colobu.com/2015/09/07/gotchas-and-common-mistakes-in-go-golang/

android intent和intent action大全

不管是頁面牽轉&#xff0c;還是傳遞數據&#xff0c;或是調用外部程序&#xff0c;系統功能都要用到intent。 在做了一些intent的例子之后&#xff0c;整理了一下intent&#xff0c;希望對大家有用。 由于intent內容太多&#xff0c;不可能真的寫全&#xff0c;難免會有遺落&a…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波4 - 單變量的離散傅里葉變換DFT

目錄標題單變量的離散傅里葉變換由取樣后的函數的連續變換得到DFT取樣和頻率間隔的關系單變量的離散傅里葉變換 由取樣后的函數的連續變換得到DFT 對原函數的變換取樣后的業的發展的變換F~(μ)\tilde F(\mu)F~(μ)&#xff0c;但未給出取樣后的函數f~(t)\tilde f(t)f~?(t)的…