在實際工作中,有時需要導入大容量sql文件到MySQL,通常有以下三種方法:
十余年的志丹網(wǎng)站建設經驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。營銷型網(wǎng)站的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調整志丹建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“志丹網(wǎng)站設計”,“志丹網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
(1)通過phpmyadmin,不推薦,有內存等的限制;
(2)通過Navicat Premium工具運行sql,不推薦,效率低;
(3)通過source命令導入,推薦,效率高,經測試,小編導入一個3.02G的文件耗時3分08秒;
下面,小編將整個過程進行重現(xiàn),希望對大家有幫助。
1.mysql在操作數(shù)據(jù)的時候,以page為單位
??不管是更新,插入,刪除一行數(shù)據(jù),都需要將那行數(shù)據(jù)所在的page讀到內存中,然后在進行操作,這樣就存在一個命中率的問題,如果一個page中能夠相對的存放足夠多的行,那么命中率就會相對高一些,性能就會有提升
2.innodb的page大小默認為16kb
??innodb存儲引擎表為索引組織表,樹底層的葉子節(jié)點為一雙向鏈表,因此每個頁中至少應該有兩行記錄,這就決定了innodb在存儲一行數(shù)據(jù)的時候不能夠超過8k,但事實上應該更小,有一些InnoDB內部數(shù)據(jù)結構要存儲以及預留操作空間,
3.blob,text大字段
??innodb只會存放前768字節(jié)在數(shù)據(jù)頁中,而剩余的數(shù)據(jù)則會存儲在溢出段中(發(fā)生溢出情況的時候適用),最大768字節(jié)的作用是便于創(chuàng)建前綴索引/prefix index,其余更多的內容存儲在額外的page里,哪怕只是多了一個字節(jié)。因此,所有列長度越短越好
4.擴展存儲禁用了自適應哈希
??因為需要完整的比較列的整個長度,才能發(fā)現(xiàn)是不是正確的數(shù)據(jù)(哈希幫助InnoDB非??焖俚恼业健安聹y的位置”,但是必須檢查“猜測的位置”是不是正確)。因為自適應哈希是完全的內存結構,并且直接指向Buffer Pool中訪問“最”頻繁的頁面,但對于擴展存儲空間卻無法使用Adaptive Hash
變長大字段類型包括blob,text,varchar,其中varchar列值長度大于某數(shù)N時也會存溢出頁,在latin1字符集下N值可以這樣計算:innodb的塊大小默認為16kb,由于innodb存儲引擎表為索引組織表,樹底層的葉子節(jié)點為一雙向鏈表,因此每個頁中至少應該有兩行記錄,這就決定了innodb在存儲一行數(shù)據(jù)的時候不能夠超過8k,減去其它列值所占字節(jié)數(shù),約等于N。對于InnoDB,內存是極為珍貴的,如果把768字節(jié)長度的blob都放在數(shù)據(jù)頁,雖然可以節(jié)省部分IO,但是能緩存行數(shù)就變少,也就是能緩存的索引值變少了,降低了索引效率
Mysql把每個BLOB和TEXT值當作一個獨立的對象處理。存儲引擎在存儲時通常會做特殊處理。當BLOB和TEXT值太大時,InnoDB會使用專門的“外部”儲存區(qū)域來進行存儲,此時每個值在行內需要1~4個字節(jié)存儲一個指針,然后在內部存儲區(qū)域存儲實際的值。
Mysql不能將BLOB和TEXT列全部長度的字符串進行索引
mysql的 io 以page為單位,因此不必要的數(shù)據(jù)(大字段)也會隨著需要操作的數(shù)據(jù)一同被讀取到內存中來,這樣帶來的問題由于大字段會占用較大的內存(相比其他小字段),使得內存利用率較差,造成更多的隨機讀取。從上面的分析來看,我們已經看到性能的瓶頸在于由于大字段存放在數(shù)據(jù)頁中,造成了內存利用較差,帶來過多的隨機讀,那怎么來優(yōu)化掉這個大字段的影響
5.6版本以后,新增選項 innodb_page_size 可以修改innodb的page默認大小,但并不推薦修改這個配置
5.6版本之后mysql新增索引FULLTEXT可用來增加大文本搜索速度
讀取mysql數(shù)據(jù)庫文本字段的值方法如下:
public void read() {
try {
//連接數(shù)據(jù)庫
conn = JdbcUtils.getConnection();
//查詢resume字段,text格式
String sql = "select resume from testclob where id=1";
pt = conn.prepareStatement(sql);
//執(zhí)行查詢并返回結果
rs = pt.executeQuery();
if (rs.next()) {
// rs.getCharacterStream讀取該字段
Reader reader = rs.getCharacterStream("resume");
//定義字符數(shù)組來存放讀取值
char buffer[] = new char[1024];
while ((reader.read(buffer)) != -1) {
//打印
System.out.println(buffer);
}
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn, pt, rs);
}
}
1、首先在設計數(shù)據(jù)庫時,需要設置一個表來保存圖片數(shù)據(jù)。
2、表中的一個列保存數(shù)據(jù)時,需要設置一個mediumblob的數(shù)據(jù)類型,這個類型每行可以保存16M大小的數(shù)據(jù),這對于一般的圖片來說,都已經夠用了。
3、如果有圖片比這個更大的,則可以使用longblob的類型。這個可以保存4G的大小。
4、接著在php代碼中,獲得上傳的圖片文件后,使用全局變量_Files來得到上傳文件的路徑。
5、然后使用file_get_contents方法獲得這個文件的二進制數(shù)據(jù)。
6、最后通過sql把二進制數(shù)據(jù)保存到對應的圖片表,就可以把圖片保存到mysql數(shù)據(jù)庫中了。
"select big_text from clob_test"
你只查詢了一列,rs.getClob(1); 肯定是取第一列了
for(int i=0;(i=reader.read(buff))0;){
writer.write(buff,0,i);
}
先從reader讀取,然后再寫入到wirter。
分享名稱:mysql大文本怎么處理,mysql大文本字段
文章來源:http://muchs.cn/article26/hcijjg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站建設、Google、品牌網(wǎng)站設計、搜索引擎優(yōu)化、域名注冊
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)