1. 為什么讀這本書(shū)?
這個(gè)問(wèn)題可以分解為兩個(gè)問(wèn)題:首先,為什么要掌握數(shù)據(jù)庫(kù)內(nèi)部原理;其次,為什么是Mysql而不是其他數(shù)據(jù)庫(kù)。對(duì)于第一個(gè)問(wèn)題,掌握數(shù)據(jù)庫(kù)內(nèi)部原理幫助我們?cè)谌粘m?xiàng)目中,更好的設(shè)計(jì)數(shù)據(jù)庫(kù)、數(shù)據(jù)表和查詢語(yǔ)句;遇到數(shù)據(jù)庫(kù)性能問(wèn)題時(shí)知道如何排查;能夠應(yīng)對(duì)數(shù)據(jù)庫(kù)挑戰(zhàn)大的項(xiàng)目,比如高并發(fā)情況下有何合理使用數(shù)據(jù)庫(kù)等。那么為什么選擇Mysql的書(shū)呢?首先,我最近做過(guò)的幾個(gè)項(xiàng)目都是用的mysql;再者mysql確實(shí)很流行,如果我們關(guān)注數(shù)據(jù)庫(kù)排行榜,就會(huì)發(fā)現(xiàn)mysql常年占據(jù)第二的位置(第一是oracle);DB engines網(wǎng)站大概每季度發(fā)布一次數(shù)據(jù)庫(kù)排行榜,排名標(biāo)準(zhǔn)是數(shù)據(jù)庫(kù)在搜索引擎和各大技術(shù)論壇中的搜索熱度,比如最近發(fā)布的2020年的top 5就是oracle,mysql,微軟的sql server,postgresql和mangodb;前四個(gè)都是結(jié)構(gòu)型數(shù)據(jù)庫(kù);其實(shí)mysql和oracle同屬oracle甲骨文公司,mysql是被oracle收購(gòu)的,mysql開(kāi)源,oracle不是。在國(guó)內(nèi),mysql的應(yīng)用也很熱,比如阿里的淘寶就使用Mysql集群,實(shí)例數(shù)2000+,雙十一期間單庫(kù)承受6.5萬(wàn)QPS。
2. Mysql邏輯架構(gòu)
2.1 客戶端-服務(wù)端架構(gòu)
客戶端可以是我們開(kāi)發(fā)的應(yīng)用,或用于連接數(shù)據(jù)庫(kù)的client工具;服務(wù)端是安裝mysql了的機(jī)器??蛻舳讼蚍?wù)端建立連接時(shí)需要下列信息:1)host:用hostname或ip地址表示,hostname會(huì)經(jīng)過(guò)DNS解析得到ip地址;可配置SkipNameResolve禁用DNS查找,改用ip地址,避免由于DNS不可用導(dǎo)致無(wú)法建立連接。2)Port:默認(rèn)是3306,可配置;3)認(rèn)證:username/password/client host;4)其他參數(shù):比如字符編碼約定等。
客戶端與服務(wù)端之間的通信協(xié)議:采用半雙工方式,即發(fā)送請(qǐng)求和返回應(yīng)答不能同時(shí)發(fā)生。對(duì)應(yīng)的問(wèn)題是缺乏流量控制:客戶端發(fā)送請(qǐng)求時(shí),服務(wù)端必須等待請(qǐng)求發(fā)送完成才能響應(yīng);優(yōu)化方式是配置max allowed packet;同樣的,客戶端接受應(yīng)答也必須一直接收直到服務(wù)器發(fā)送完畢;優(yōu)化方式是使用limit。
配置use result來(lái)決定客戶端緩存查詢結(jié)果或者采用流處理;緩存有利于服務(wù)端盡快返回應(yīng)答,但結(jié)果過(guò)大時(shí)占用太多客戶端內(nèi)存;采用流處理,即邊接收數(shù)據(jù)邊處理,這樣服務(wù)器的資源會(huì)被請(qǐng)求長(zhǎng)時(shí)間占用。
2.2 服務(wù)端的存儲(chǔ)引擎架構(gòu)
存儲(chǔ)引擎架構(gòu)實(shí)現(xiàn)了查詢處理與數(shù)據(jù)存儲(chǔ)/提取相分離。
2.2.1 連接層、線程緩存
用于連接處理,認(rèn)證授權(quán);mysql運(yùn)行在服務(wù)器上是一個(gè)進(jìn)程,對(duì)每個(gè)連接創(chuàng)建一個(gè)線程,服務(wù)器會(huì)維護(hù)線程緩存threadCache,以減少新建/銷毀線程的開(kāi)銷,提高處理新連接的速度;創(chuàng)建新連接時(shí),首先查看線程緩存中是否存在空閑線程,存在則直接分配給新連接,否則創(chuàng)建新線程,連接關(guān)閉時(shí),查看線程緩存是否已滿,已滿則銷毀線程,否則把線程放回線程池。線程緩存過(guò)大會(huì)占用較多內(nèi)存,同時(shí)空閑線程數(shù)增多,空閑線程大約占256k內(nèi)存,因此當(dāng)連接線程數(shù)在150-175區(qū)間內(nèi)時(shí),可設(shè)置緩存大小為75。
2.2.2 服務(wù)層
服務(wù)層包含以下四個(gè)模塊,同時(shí)提供內(nèi)置函數(shù)如日期/數(shù)學(xué)函數(shù)的解析,并提供跨存儲(chǔ)引擎功能如存儲(chǔ)過(guò)程、觸發(fā)器和視圖等。
1)查詢緩存:key為SQL語(yǔ)句的hashcode;針對(duì)讀操作,計(jì)算SQL的hashcode,查看是否有緩存記錄,緩存命中則檢查用戶權(quán)限,權(quán)限信息也在緩存中,權(quán)限符合則直接返回?cái)?shù)據(jù)。
2)解析器&預(yù)處理器:解析器驗(yàn)證SQL關(guān)鍵字和引號(hào)匹配等問(wèn)題,并通過(guò)關(guān)鍵字把SQL解析為解析樹(shù);預(yù)處理器進(jìn)一步驗(yàn)證解析樹(shù)的合法性并驗(yàn)證權(quán)限,如表和數(shù)據(jù)列是否存在,別名是否有歧義等。
3)優(yōu)化器:輸入是合法的解析樹(shù),優(yōu)化器基于成本選擇最優(yōu)執(zhí)行計(jì)劃并交給執(zhí)行引擎。
4)執(zhí)行引擎:輸入是執(zhí)行計(jì)劃,通過(guò)API與存儲(chǔ)引擎交互。
2.2.3 存儲(chǔ)引擎層
負(fù)責(zé)數(shù)據(jù)存儲(chǔ)和提??;服務(wù)層通過(guò)API與存儲(chǔ)引擎通信,API屏蔽了存儲(chǔ)引擎的實(shí)現(xiàn)細(xì)節(jié),Mysql支持多種存儲(chǔ)引擎,用戶可以根據(jù)應(yīng)用場(chǎng)景選擇合適的存儲(chǔ)引擎:InnoDB為默認(rèn)存儲(chǔ)引擎。
一個(gè)SQL查詢的整體過(guò)程:客戶端發(fā)送請(qǐng)求到服務(wù)器;服務(wù)器首先查詢緩存,如果緩慢命中則直接返回;否則發(fā)送sql到解析器,解析器生成解析樹(shù)并交給預(yù)處理器;經(jīng)過(guò)預(yù)處理的解析樹(shù)發(fā)送到查詢優(yōu)化器,優(yōu)化器生成執(zhí)行計(jì)劃并交給執(zhí)行引擎;執(zhí)行引擎通過(guò)API調(diào)用存儲(chǔ)引擎,存儲(chǔ)引擎是數(shù)據(jù)的實(shí)際擁有者和維護(hù)者,返回檢索結(jié)果;檢索結(jié)果回到服務(wù)層進(jìn)行排序/分組等數(shù)據(jù)處理。查詢結(jié)果從服務(wù)端傳回到客戶端:即使沒(méi)有數(shù)據(jù)返回,如delete操作,也會(huì)返回查詢影響到的行數(shù)等信息;采用增量逐步返回的方式,即查詢產(chǎn)生第一條結(jié)果時(shí)就開(kāi)始向客戶端返回結(jié)果,好處是服務(wù)器端無(wú)需存儲(chǔ)大量結(jié)果,節(jié)約內(nèi)存,并且客戶端能更快的拿到結(jié)果?;赥CP傳輸,每行數(shù)據(jù)封裝為一個(gè)包,傳輸過(guò)程中網(wǎng)絡(luò)可能會(huì)對(duì)包進(jìn)行緩存批量傳輸。
服務(wù)器的數(shù)據(jù)存儲(chǔ)與分布:數(shù)據(jù)庫(kù)的數(shù)據(jù)包括表定義和具體數(shù)據(jù)與索引;表定義存儲(chǔ)在服務(wù)層,數(shù)據(jù)/索引存儲(chǔ)在存儲(chǔ)引擎層。文件系統(tǒng)中,Mysql將每個(gè)數(shù)據(jù)庫(kù)(schema)保存在數(shù)據(jù)目錄下的子目錄。建表時(shí),mysql在數(shù)據(jù)庫(kù)子目錄下創(chuàng)建與表同名的frm文件保存表定義。windows系統(tǒng)對(duì)文件系統(tǒng)大小寫不敏感,類unix系統(tǒng)則對(duì)大小寫敏感。
3.詳解優(yōu)化器
優(yōu)化器的輸入是合法的解析樹(shù),基于成本選擇最優(yōu)執(zhí)行計(jì)劃并交給執(zhí)行引擎。執(zhí)行計(jì)劃是指令樹(shù)的形式,其他關(guān)系型數(shù)據(jù)庫(kù)大多生成查詢字節(jié)碼。用戶可以用explain命令請(qǐng)求優(yōu)化器解釋優(yōu)化過(guò)程,查看生成的執(zhí)行計(jì)劃。
優(yōu)化分為靜態(tài)和動(dòng)態(tài)優(yōu)化:靜態(tài)優(yōu)化基于解析樹(shù),不依賴查詢參數(shù)值,又稱編譯時(shí)優(yōu)化;動(dòng)態(tài)優(yōu)化考慮查詢參數(shù)值和索引條目對(duì)應(yīng)的數(shù)據(jù)行數(shù),每次查詢時(shí)重新評(píng)估,又稱運(yùn)行時(shí)優(yōu)化。
3.1 成本
成本大致取決于完成查詢所需掃描的行數(shù)。成本單位是隨機(jī)讀取一個(gè)數(shù)據(jù)頁(yè)(大小4K)的成本,例如查詢A成本為1000,表示需要1000個(gè)數(shù)據(jù)頁(yè)隨機(jī)讀取才能完成查詢A。優(yōu)化器請(qǐng)求存儲(chǔ)引擎獲取存儲(chǔ)引擎中的統(tǒng)計(jì)信息,如數(shù)據(jù)/索引的頁(yè)面?zhèn)€數(shù),索引基數(shù),索引和數(shù)據(jù)行長(zhǎng)度,索引分布等;并基于這些信息計(jì)算成本。通過(guò)show status like ‘last query cost’查詢成本。
成本估算不準(zhǔn)確會(huì)導(dǎo)致無(wú)法得到最優(yōu)執(zhí)行計(jì)劃,導(dǎo)致成本估算不準(zhǔn)確的因素:1)存儲(chǔ)引擎提供的數(shù)據(jù)不準(zhǔn)確,如InnoDB由于其MVCC架構(gòu)無(wú)法維護(hù)數(shù)據(jù)表的準(zhǔn)確行數(shù);2)IO的不確定性,如數(shù)據(jù)頁(yè)可能存在于內(nèi)存/磁盤順序或隨機(jī)讀寫,導(dǎo)致成本高的執(zhí)行計(jì)劃實(shí)際可能更快。
優(yōu)化器不總是基于成本計(jì)算,如當(dāng)存在全文搜索的match子句且存在全文索引時(shí),優(yōu)先使用全文索引,即使存在更快的方式。
3.2 具體的優(yōu)化類型
1)關(guān)聯(lián)表順序重排:理想情況下第一個(gè)關(guān)聯(lián)表只需要掃描很少的行,這樣有利于執(zhí)行更少的循環(huán)和回溯;后續(xù)表可以根據(jù)索引查詢,也就是說(shuō)關(guān)聯(lián)列需要是索引列。Mysql采用嵌套循環(huán)關(guān)聯(lián)方式,例如select tbl1.col1, tbl2.col2 from tbl1 join tbl2 using col3 where tbl1.col1 in (5, 6);按聯(lián)表查詢的聲明順序遍歷,首先iterate over tbl1 where tbl1.col1 in (5, 6),針對(duì)每一行執(zhí)行iterate over tbl2 where tbl2.col3 = tbl1.col3,查詢出全部行。
2)min/max函數(shù)優(yōu)化:1. 能夠使用索引時(shí),通過(guò)查找B-tree的最左端/最右端優(yōu)化min/max函數(shù);執(zhí)行計(jì)劃顯示select tables optimized away,表示優(yōu)化器已經(jīng)在執(zhí)行計(jì)劃中把該表移除,用常數(shù)取代;2. 不能使用索引時(shí),如select min(actor_id) from actor where name=‘hahah’,且name沒(méi)有索引,此時(shí)需要全表掃描;或者M(jìn)ysql可以主鍵掃描,找到第一個(gè)滿足name條件的數(shù)據(jù)并返回。
3)提前終止查詢:1. 使用limit,當(dāng)mysql發(fā)現(xiàn)已經(jīng)滿足查詢需求,則立刻終止查詢;2. Mysql發(fā)現(xiàn)不成立的條件如1>2,則立即終止查詢;3. 對(duì)于distinct/not exist/left join,如select?film.id?from film left outer join actor using filmId where actor.filmId is null,用于查找所有沒(méi)有演員的電影,一個(gè)電影可以有很多演員,當(dāng)優(yōu)化器發(fā)現(xiàn)電影有一名演員則跳過(guò)該電影。
4)in(): 很多數(shù)據(jù)庫(kù)系統(tǒng)認(rèn)為in等同于多個(gè)or子句;mysql將in中的數(shù)據(jù)進(jìn)行排序,通過(guò)二分查找確定是否滿足條件,當(dāng)in子句包含大量值,mysql的速度更快。
5)表達(dá)式等價(jià)轉(zhuǎn)換:1. 使用等價(jià)變換規(guī)則規(guī)范表達(dá)式,如(a<b and b=c)and a=5可改寫為b>5 and b=c;2. 預(yù)估并轉(zhuǎn)化為常數(shù)表達(dá)式:如select?film.id,film_actor. id?from film join actor on?filmId where?film.id=1,簡(jiǎn)化為select id from actor where filmId=1;3. 等值傳播: select?film.id?from film join actor using filmed where filmed > 500,filmid> 500的條件同樣適用于film表和action表。
6)把子查詢優(yōu)化掉
7)將外連接轉(zhuǎn)化為內(nèi)連接:outer/inner join
3.3. 優(yōu)化器的局限性
1)避免在in中包含子查詢:如select * from film where filmId in (select filmId from film_actor where actorId=1),我們以為會(huì)首先執(zhí)行子循環(huán)查到filmId,然后再用filmId去查film;但事實(shí)上Mysql先對(duì)film表做全表掃描,對(duì)filmId逐個(gè)執(zhí)行子查詢,如果film是很大的表,則對(duì)性能影響更大。解決方式是改寫查詢語(yǔ)句:select film.* from film join film_actor using(film_id) where actorId=1;?
2)優(yōu)化器不考慮并發(fā),也無(wú)法利用多核特定來(lái)并行執(zhí)行查詢;
3)當(dāng)在同一個(gè)表上查詢和更新時(shí),通過(guò)用as生成臨時(shí)表的方式來(lái)解決。
3.4 hint
謹(jǐn)慎使用hint影響優(yōu)化器,容易在mysql升級(jí)后,讓新版的優(yōu)化策略失效。常用hint包括:
1)Delayed:用于日志系統(tǒng)的insert,mysql把要插入的數(shù)據(jù)放在緩存,等待表空閑時(shí)批量寫入,并立即返回應(yīng)答到客戶端;
2)Straight join:固定關(guān)聯(lián)表的順序;當(dāng)Mysql沒(méi)能選擇正確的關(guān)聯(lián)順序,或者可選順序太多導(dǎo)致Mysql花費(fèi)大量時(shí)間進(jìn)行成本計(jì)算時(shí),用于減少搜索空間。
3)Small/big result:small result告訴Mysql結(jié)果集很小,可在內(nèi)存中的創(chuàng)建臨時(shí)表或進(jìn)行排序;big result告訴Mysql結(jié)果集可能很大,建議用磁盤臨時(shí)表做排序。
4)Cache:告訴優(yōu)化器結(jié)果放在查詢緩存
5)Use/ignore index:告訴優(yōu)化器使用或者不用哪些索引
6)optimizer search depth:控制優(yōu)化器窮舉執(zhí)行計(jì)劃的限度
7)Switch <優(yōu)化器特性名稱>:開(kāi)啟/關(guān)閉優(yōu)化器特性,如索引合并
4. 詳解查詢緩存
查詢緩存的key是查詢語(yǔ)句、數(shù)據(jù)庫(kù)版本等元數(shù)據(jù)的哈希值,查詢語(yǔ)句中的空格/大小寫不一致都會(huì)導(dǎo)致緩存不命中,因此使用統(tǒng)一的編碼規(guī)則是一個(gè)好習(xí)慣;此外,包含不確定數(shù)據(jù)如now()的查詢不會(huì)被緩存。查詢緩存會(huì)跟蹤查詢中涉及的每個(gè)表,表數(shù)據(jù)發(fā)生變化則緩存失效;另外,內(nèi)存不夠也會(huì)把某些緩存條目逐出緩存。
查詢緩存完全存儲(chǔ)在內(nèi)存中,包括查詢結(jié)果數(shù)據(jù)塊及元數(shù)據(jù);每個(gè)數(shù)據(jù)塊存儲(chǔ)數(shù)據(jù)塊類型、大小、數(shù)據(jù)本身和指向前后數(shù)據(jù)塊的指針,數(shù)據(jù)塊類型包括查詢結(jié)果、查詢和數(shù)據(jù)表的映射和查詢文本;元數(shù)據(jù)記錄可用、已使用內(nèi)存,以及已使用內(nèi)存分別存儲(chǔ)哪種數(shù)據(jù)類型。查詢緩存大小可配置,元數(shù)據(jù)固定占用40K內(nèi)存。當(dāng)有查詢結(jié)果需要緩存時(shí),Mysql會(huì)申請(qǐng)一小塊內(nèi)存(緩存最小單位),此時(shí)由于查詢還未結(jié)束無(wú)法確切知道所需內(nèi)存大?。籑ysql把查詢結(jié)果放入緩存,空間不夠就再申請(qǐng)一塊,如果查詢完成后申請(qǐng)的內(nèi)存有剩余,則釋放空閑內(nèi)存。這個(gè)過(guò)程中會(huì)導(dǎo)致內(nèi)存碎片,選擇合適的緩存最小單位可以減少內(nèi)存碎片。
緩存的成本除了內(nèi)存,還有對(duì)于讀寫操作增加了額外步驟:讀操作增加讀取緩存的操作,返回結(jié)果時(shí)增加寫入緩存的操作;寫操作需要將對(duì)應(yīng)緩存設(shè)置為失效。另外,把緩存設(shè)置失效的操作需要對(duì)查詢緩存加鎖,如果有大量查詢其結(jié)果被緩存,那么這些查詢都需要等待鎖。
什么時(shí)候應(yīng)該開(kāi)啟查詢緩存?復(fù)雜的查詢語(yǔ)句適合用緩存,寫密集型應(yīng)用不適合,因?yàn)榫彺嬷饕岣咦x操作的效率,寫操作相反還要增加失效緩存的成本。建議通過(guò)性能測(cè)試,只在有明確收益時(shí)使用查詢緩存,在應(yīng)用中使用緩存或者使用redis可能是更靈活的緩存方案。考慮到表修改會(huì)觸發(fā)緩存清空,小數(shù)據(jù)表優(yōu)于大數(shù)據(jù)表;考慮到批量寫入只需要一次內(nèi)存清空,批量寫入優(yōu)于單條寫入。
查詢緩存有以下配置項(xiàng):1)queryCacheType:用于配置是否打開(kāi)緩存,可配置為on、off和onDemand,配置為onDemand表示查詢語(yǔ)句中寫明sql cache時(shí)才放入緩存;2)queryCacheSize和queryCacheMinResUnit:配置緩存大小和緩存最小單位;3)QueryCacheLimit:?jiǎn)螚l查詢的可緩存最大容量,如果查詢結(jié)果過(guò)大則不會(huì)被緩存,但直到所有查詢完成才能判定,此時(shí)已經(jīng)分配了部分內(nèi)存,因此,如果事先知道結(jié)果很大不用緩存,則通過(guò)sql no cache告訴查詢緩存。
5. 更多存儲(chǔ)引擎
5.1 常見(jiàn)存儲(chǔ)引擎
1)InnoDB:Mysql默認(rèn)事務(wù)型引擎,同樣被Oracle收購(gòu)。InnoDB把數(shù)據(jù)存儲(chǔ)在表空間tablespace,包含多個(gè)數(shù)據(jù)文件。每個(gè)表的數(shù)據(jù)和索引存放在單獨(dú)文件中。使用B+Tree存儲(chǔ)索引。對(duì)于讀操作支持可預(yù)測(cè)讀和自適應(yīng)哈希索引;對(duì)于寫操作,提供插入緩沖區(qū)來(lái)加速插入操作;支持熱備份,無(wú)需停止寫操作就可以獲取一致性視圖,而其他存儲(chǔ)引擎需要定時(shí)關(guān)閉服務(wù)器等來(lái)執(zhí)行備份。
2)Mysql的其他內(nèi)建存儲(chǔ)引擎:Archive引擎適合日志和數(shù)據(jù)采集類應(yīng)用,只支持select insert;Blackhole引擎丟棄所有數(shù)據(jù),僅記錄日志,不推薦;Csv引擎像訪問(wèn)數(shù)據(jù)表一樣訪問(wèn)放在mysql數(shù)據(jù)目錄下的csv文件;Fedarated聯(lián)邦引擎:作為代理把查詢請(qǐng)求發(fā)送到其他mysql服務(wù)器,不推薦;Memory引擎把數(shù)據(jù)存儲(chǔ)在內(nèi)存中,存取快,重啟數(shù)據(jù)丟失,用于代替臨時(shí)表保存中間結(jié)果;NDB集群引擎與mysql集群相關(guān),用于追求高可用的分布式系統(tǒng)。
3)第三方存儲(chǔ)引擎:Mysql提供插件式的存儲(chǔ)引擎API,可擴(kuò)展性強(qiáng)。如面向列的引擎,Mysql默認(rèn)面向行,每行數(shù)據(jù)一起存儲(chǔ),查詢也是以行為單位,但海量數(shù)據(jù)處理中面向列的方式效率更高:數(shù)據(jù)按照塊排序,每塊對(duì)應(yīng)一組元數(shù)據(jù);處理查詢時(shí),訪問(wèn)元數(shù)據(jù)決定是否跳過(guò)該塊。
5.2 如何選擇合適的存儲(chǔ)引擎?
選擇存儲(chǔ)引擎是以數(shù)據(jù)表為單元,因?yàn)榇鎯?chǔ)引擎是存儲(chǔ)表數(shù)據(jù)的地方,一個(gè)表的數(shù)據(jù)不會(huì)分散在多個(gè)存儲(chǔ)引擎。
1)優(yōu)先選擇InnoDB,除非需要用到InnoDB不具備的特性;2)不建議混合使用多種存儲(chǔ)引擎;3)日志型應(yīng)用:例如記錄網(wǎng)站的所有訪問(wèn)信息,對(duì)插入速度要求高,可選擇MyISAM或者Archive引擎。如果需要分析日志,建議把數(shù)據(jù)復(fù)制到備庫(kù),在備庫(kù)上進(jìn)行耗時(shí)的分析;4)大數(shù)據(jù)量超過(guò)10T則需要建立數(shù)據(jù)倉(cāng)庫(kù)。
5.3 如何修改數(shù)據(jù)表的存儲(chǔ)引擎?
1)Alter table <tableName> engine=<engine>;該語(yǔ)句執(zhí)行時(shí)間長(zhǎng),Mysql按行把數(shù)據(jù)從源數(shù)據(jù)表復(fù)制到新數(shù)據(jù)表,源表加上讀鎖;因此繁忙的表進(jìn)行該操作需要很謹(jǐn)慎。另外,有外鍵的InnoDB表轉(zhuǎn)換為不支持外鍵的MyISAM,再變回InnoDB后原有外鍵消失。
2)使用mysqldump把數(shù)據(jù)導(dǎo)出為文件,手動(dòng)修改create table的存儲(chǔ)引擎;之后再導(dǎo)入數(shù)據(jù)
3)先創(chuàng)建新的存儲(chǔ)引擎表,然后通過(guò)insert/select進(jìn)行數(shù)據(jù)導(dǎo)入。