以下的文章主要介紹的是MySQL text與blob字段類型的不同之處的比較,同時本文也有對MySQL text與blob字段類型的實際應用的介紹,如果你對MySQL text與blob字段類型相關的實際操作有興趣的話,你就可以對以下的文章點擊觀看了。
創新互聯公司是一家專注于網站建設、成都網站建設和內江機房主機托管的網絡公司,有著豐富的建站經驗和案例。
1.
blob是二進制大對象,可以容納可變量數量的數據,其中blob分為4中類型:TINYBLOB,BLOB,mediumblob和LongBlob,他們容納的長度是不同的.
Text同樣也分為四種類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT
2.
blob被視為二進制字符串,Text被視為非二進制字符串;
blob列沒有字符集,并且排序和比較基于列值字節的數值值。
TEXT列有一個字符集,并且根據字符集的校對規則對值進行排序和比較。
在MySQL TEXT或BLOB列的存儲或檢索過程中,不存在大小寫轉換,當未運行在嚴格模式時,如果你為BLOB或TEXT列分配一個超過該列類型的最大長度的值值,值被截取以保證適合。如果截掉的字符不是空格,將會產生一條警告。
使用嚴格SQL模式,會產生錯誤,并且值將被拒絕而不是截取并給出警告.在大多數方面,可以將BLOB列視為能夠足夠大的VARBINARY列。同樣,可以將TEXT列視為VARCHAR列。
3.
BLOB和TEXT在以下幾個方面不同于VARBINARY和VARCHAR.
BLOB和TEXT列不能有默認值.
當保存或檢索BLOB和TEXT列的值時不刪除尾部空格。(這與VARBINARY和VARCHAR列相同).
對于BLOB和TEXT列的索引,必須指定索引前綴的長度。對于CHAR和VARCHAR,前綴長度是可選的.
LONG和LONG VARCHAR對應MEDIUMTEXT數據類型。這是為了保證兼容性。如果TEXT列類型使用BINARY屬性,將為列分配列字符集的二元校對規則.
MySQL連接程序/ODBC將BLOB值定義為LONGVARBINARY,將MySQL TEXT值定義為LONGVARCHAR。由于BLOB和TEXT值可能會非常長,使用它們時可能遇到一些約束.
BLOB或TEXT對象的最大大小由其類型確定,但在客戶端和服務器之間實際可以傳遞的最大值由可用內存數量和通信緩存區大小確定。你可以通過更改max_allowed_packet變量的值更改消息緩存區的大小,但必須同時修改服務器和客戶端程序。例如,可以使用 MySQL和MySQLdump來更改客戶端的max_allowed_packet值.
朋友,據我所知varchar字段類型已經夠用了,char類型其長度是固定的,在創建表時就指定了,
但是varchar類型的長度是可變的,在建表的時候就制定了最大長度,其最大值可以取:0~65535之間的任意值(長度可以再0到最大值之間) 而且在這個最大范圍內,使用多少則分配多大的空間,例如varchar(100),并不是每條記錄都要占用100個字節哦!! 最后強調:varchar類型實際占用的空間為字符串的實際長度加1 如varchar(10):字段 ‘123’,他占的內存字節是4(3+1),而char(10)則占用了10個字節。 全手工,希望朋友采納
對于大篇幅的文本字段,一般推薦用text和blob數據類型定義字段, 有時候不必在于一點空間的消耗,只要我們在數據庫優化做好就夠了
關于mysql處理百萬級以上的數據時如何提高其查詢速度的方法
最近一段時間由于工作需要,開始關注針對Mysql數據庫的select查詢語句的相關優化方法。
由于在參與的實際項目中發現當mysql表的數據量達到百萬級時,普通SQL查詢效率呈直線下降,而且如果where中的查詢條件較多時,其查詢速度簡直無法容忍。曾經測試對一個包含400多萬條記錄(有索引)的表執行一條條件查詢,其查詢時間竟然高達40幾秒,相信這么高的查詢延時,任何用戶都會抓狂。因此如何提高sql語句查詢效率,顯得十分重要。以下是網上流傳比較廣泛的30種SQL查詢語句優化方法:
1、應盡量避免在 where 子句中使用!=或操作符,否則將引擎放棄使用索引而進行全表掃描。
2、對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
3、應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
可以在num上設置默認值0,確保表中num列沒有null值,然后這樣查詢:
select id from t where num=0
4、盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
5、下面的查詢也將導致全表掃描:(不能前置百分號)
select id from t where name like ‘%c%’
若要提高效率,可以考慮全文檢索。
6、in 和 not in 也要慎用,否則會導致全表掃描,如:
select id from t where num in(1,2,3)
對于連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
7、如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變量,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然 而,如果在編譯時建立訪問計劃,變量的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:
select id from t where num=@num
可以改為強制查詢使用索引:
select id from t with(index(索引名)) where num=@num
8、應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2=100
應改為:
select id from t where num=100*2
9、應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)=’abc’–name以abc開頭的id
select id from t where datediff(day,createdate,’2005-11-30′)=0–’2005-11-30′生成的id
應改為:
select id from t where name like ‘abc%’
select id from t where createdate=’2005-11-30′ and createdate’2005-12-1′
10、不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
11、在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使 用,并且應盡可能的讓字段順序與索引順序相一致。
12、不要寫一些沒有意義的查詢,如需要生成一個空表結構:
select col1,col2 into #t from t where 1=0
這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:
create table #t(…)
13、很多時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
14、并不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有字段 sex,male、female幾乎各一半,那么即使在sex上建了索引也對查詢效率起不了作用。
15、索引并不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。
16.應盡可能的避免更新 clustered 索引數據列,因為 clustered 索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引數據列,那么需要考慮是否應將該索引建為 clustered 索引。
17、盡量使用數字型字段,若只含數值信息的字段盡量不要設計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。這是因為引擎在處理查詢和連接時會 逐個比較字符串中每一個字符,而對于數字型而言只需要比較一次就夠了。
18、盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長字段存儲空間小,可以節省存儲空間,其次對于查詢來說,在一個相對較小的字段內搜索效率顯然要高些。
19、任何地方都不要使用 select * from t ,用具體的字段列表代替“*”,不要返回用不到的任何字段。
20、盡量使用表變量來代替臨時表。如果表變量包含大量數據,請注意索引非常有限(只有主鍵索引)。
21、避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。
22、臨時表并不是不可使用,適當地使用它們可以使某些例程更有效,例如,當需要重復引用大型表或常用表中的某個數據集時。但是,對于一次性事件,最好使 用導出表。
23、在新建臨時表時,如果一次性插入數據量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然后insert。
24、如果使用到了臨時表,在存儲過程的最后務必將所有的臨時表顯式刪除,先 truncate table ,然后 drop table ,這樣可以避免系統表的較長時間鎖定。
25、盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那么就應該考慮改寫。
26、使用基于游標的方法或臨時表方法之前,應先尋找基于集的解決方案來解決問題,基于集的方法通常更有效。
27、與臨時表一樣,游標并不是不可使用。對小型數據集使用 FAST_FORWARD 游標通常要優于其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數據時。在結果集中包括“合計”的例程通常要比使用游標執行的速度快。如果開發時 間允許,基于游標的方法和基于集的方法都可以嘗試一下,看哪一種方法的效果更好。
28、在所有的存儲過程和觸發器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF 。無需在執行存儲過程和觸發器的每個語句后向客戶端發送 DONE_IN_PROC 消息。
29、盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。
30、盡量避免大事務操作,提高系統并發能力。
最大上傳數也要改一下的,不然你那幾十萬字也估計超過你的最大上傳限制了,還有,如果你的那個只是文本的話,可以考慮用MYSQL的壓縮,怎么用我就不廢話了。主要是設定兩個東西:
服務器最大響應時間;最大上傳限制,這兩個高好了就行。其他一般不會有問題。你試一下。
補充:
在php.ini里有個參數叫“max_execution_time”,這個是最大響應時間,以秒為單位,改個大一點的,“post_max_size ”,這個是最大上傳的大小, 以M為單位。
上回忘了個了很重要的東西,就是要重啟你的服務進程(linux下),重啟APM(WIN下)
1.mysql在操作數據的時候,以page為單位
??不管是更新,插入,刪除一行數據,都需要將那行數據所在的page讀到內存中,然后在進行操作,這樣就存在一個命中率的問題,如果一個page中能夠相對的存放足夠多的行,那么命中率就會相對高一些,性能就會有提升
2.innodb的page大小默認為16kb
??innodb存儲引擎表為索引組織表,樹底層的葉子節點為一雙向鏈表,因此每個頁中至少應該有兩行記錄,這就決定了innodb在存儲一行數據的時候不能夠超過8k,但事實上應該更小,有一些InnoDB內部數據結構要存儲以及預留操作空間,
3.blob,text大字段
??innodb只會存放前768字節在數據頁中,而剩余的數據則會存儲在溢出段中(發生溢出情況的時候適用),最大768字節的作用是便于創建前綴索引/prefix index,其余更多的內容存儲在額外的page里,哪怕只是多了一個字節。因此,所有列長度越短越好
4.擴展存儲禁用了自適應哈希
??因為需要完整的比較列的整個長度,才能發現是不是正確的數據(哈希幫助InnoDB非常快速的找到“猜測的位置”,但是必須檢查“猜測的位置”是不是正確)。因為自適應哈希是完全的內存結構,并且直接指向Buffer Pool中訪問“最”頻繁的頁面,但對于擴展存儲空間卻無法使用Adaptive Hash
變長大字段類型包括blob,text,varchar,其中varchar列值長度大于某數N時也會存溢出頁,在latin1字符集下N值可以這樣計算:innodb的塊大小默認為16kb,由于innodb存儲引擎表為索引組織表,樹底層的葉子節點為一雙向鏈表,因此每個頁中至少應該有兩行記錄,這就決定了innodb在存儲一行數據的時候不能夠超過8k,減去其它列值所占字節數,約等于N。對于InnoDB,內存是極為珍貴的,如果把768字節長度的blob都放在數據頁,雖然可以節省部分IO,但是能緩存行數就變少,也就是能緩存的索引值變少了,降低了索引效率
Mysql把每個BLOB和TEXT值當作一個獨立的對象處理。存儲引擎在存儲時通常會做特殊處理。當BLOB和TEXT值太大時,InnoDB會使用專門的“外部”儲存區域來進行存儲,此時每個值在行內需要1~4個字節存儲一個指針,然后在內部存儲區域存儲實際的值。
Mysql不能將BLOB和TEXT列全部長度的字符串進行索引
mysql的 io 以page為單位,因此不必要的數據(大字段)也會隨著需要操作的數據一同被讀取到內存中來,這樣帶來的問題由于大字段會占用較大的內存(相比其他小字段),使得內存利用率較差,造成更多的隨機讀取。從上面的分析來看,我們已經看到性能的瓶頸在于由于大字段存放在數據頁中,造成了內存利用較差,帶來過多的隨機讀,那怎么來優化掉這個大字段的影響
5.6版本以后,新增選項 innodb_page_size 可以修改innodb的page默認大小,但并不推薦修改這個配置
5.6版本之后mysql新增索引FULLTEXT可用來增加大文本搜索速度
更改MYSQL 單字段存儲最大空間
具體的配置是my.ini。
將max_allowed_packet = 16M 拷貝到my.ini中的mysqld分類下,重啟服務,就將更改MYSQL 單字段存儲最大空間改為16M啦
MYSQL 默認單字段存儲最大空間為1M.
當前文章:mysql怎么存大字段,mysql存文章的字段設置為多大?
網頁路徑:http://m.kartarina.com/article8/hscdip.html
成都網站建設公司_創新互聯,為您提供靜態網站、微信小程序、Google、網站內鏈、標簽優化、搜索引擎優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯