當前位置:首頁 » 服務存儲 » mysql數據存儲的兩種類型
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

mysql數據存儲的兩種類型

發布時間: 2022-12-26 22:24:23

❶ mysql存儲引擎類型有哪些

1、MyISAM

使用這個存儲引擎,每個MyISAM在磁碟上存儲成三個文件。

(1)frm文件:存儲表的定義數據

(2)MYD文件:存放表具體記錄的數據

(3)MYI文件:存儲索引

frm和MYI可以存放在不同的目錄下。MYI文件用來存儲索引,但僅保存記錄所在頁的指針,索引的結構是B+樹結構。下面這張圖就是MYI文件保存的機制:

從這張圖可以發現,這個存儲引擎通過MYI的B+樹結構來查找記錄頁,再根據記錄頁查找記錄。並且支持全文索引、B樹索引和數據壓縮。

支持數據的類型也有三種:

(1)靜態固定長度表

這種方式的優點在於存儲速度非常快,容易發生緩存,而且表發生損壞後也容易修復。缺點是占空間。這也是默認的存儲格式。

(2)動態可變長表

優點是節省空間,但是一旦出錯恢復起來比較麻煩。

(3)壓縮表

上面說到支持數據壓縮,說明肯定也支持這個格式。在數據文件發生錯誤時候,可以使用check table工具來檢查,而且還可以使用repair table工具來恢復。

有一個重要的特點那就是不支持事務,但是這也意味著他的存儲速度更快,如果你的讀寫操作允許有錯誤數據的話,只是追求速度,可以選擇這個存儲引擎。

2、InnoDB

InnoDB是默認的資料庫存儲引擎,他的主要特點有:

(1)可以通過自動增長列,方法是auto_increment。

(2)支持事務。默認的事務隔離級別為可重復度,通過MVCC(並發版本控制)來實現的。

(3)使用的鎖粒度為行級鎖,可以支持更高的並發;

(4)支持外鍵約束;外鍵約束其實降低了表的查詢速度,但是增加了表之間的耦合度。

(5)配合一些熱備工具可以支持在線熱備份;

(6)在InnoDB中存在著緩沖管理,通過緩沖池,將索引和數據全部緩存起來,加快查詢的速度;

(7)對於InnoDB類型的表,其數據的物理組織形式是聚簇表。所有的數據按照主鍵來組織。數據和索引放在一塊,都位於B+數的葉子節點上;

當然InnoDB的存儲表和索引也有下面兩種形式:

(1)使用共享表空間存儲:所有的表和索引存放在同一個表空間中。

(2)使用多表空間存儲:表結構放在frm文件,數據和索引放在IBD文件中。分區表的話,每個分區對應單獨的IBD文件,分區表的定義可以查看我的其他文章。使用分區表的好處在於提升查詢效率。

對於InnoDB來說,最大的特點在於支持事務。但是這是以損失效率來換取的。

3、Memory

將數據存在內存,為了提高數據的訪問速度,每一個表實際上和一個磁碟文件關聯。文件是frm。

(1)支持的數據類型有限制,比如:不支持TEXT和BLOB類型,對於字元串類型的數據,只支持固定長度的行,VARCHAR會被自動存儲為CHAR類型;

(2)支持的鎖粒度為表級鎖。所以,在訪問量比較大時,表級鎖會成為MEMORY存儲引擎的瓶頸;

(3)由於數據是存放在內存中,一旦伺服器出現故障,數據都會丟失;

(4)查詢的時候,如果有用到臨時表,而且臨時表中有BLOB,TEXT類型的欄位,那麼這個臨時表就會轉化為MyISAM類型的表,性能會急劇降低;

(5)默認使用hash索引。

(6)如果一個內部表很大,會轉化為磁碟表。

在這里只是給出3個常見的存儲引擎。使用哪一種引擎需要靈活選擇,一個資料庫中多個表可以使用不同引擎以滿足各種性能和實際需求,使用合適的存儲引擎,將會提高整個資料庫的性能

❷ MySQL里存儲圖片的是什麼數據類型

varchar型,存圖片的路徑,一般不直接存圖片,非要存的話用blob。

❸ MySQL的數據類型和建庫策略詳解

無論是在小得可憐的免費資料庫空間或是大型電子商務網站 合理的設計表結構 充分利用空間是十分必要的 這就要求我們對資料庫系統的常用數據類型有充分的認識 下面我就將我的一點心得寫出來跟大家分享

一 數字類型

數字類型按照我的分類方法分為三類 整數類 小數類和數字類

我所謂的 數字類 就是指DECIMAL和NUMERIC 它們是同一種類型 它嚴格的說不是一種數字類型 因為他們實際上是將數字以字元串形式保存的 他的值的每一位(包括小數點)佔一個位元組的存儲空間 因此這種類型耗費空間比較大 但是它的一個突出的優點是小數的位數固定 在運算中不會 失真 所以比較適合用於 價格 金額 這樣對精度要求不高但准確度要求非常高的欄位

小數類 即浮點數類型 根據精度的不同 有FLOAT(單精度)和DOUBLE(雙精度)兩種 它們的優勢是精確度 FLOAT可以表示絕對值非常小 小到約 E ( 小數點後面有 個零)的小數 而DOUBLE更是可以表示絕對值小到約 E ( 小數點後面有 個零)的小數 FLOAT類型和DOUBLE類型佔用存儲空間分別是 位元組和 位元組 如果需要用到小數的欄位 精度要求不高的 當然用FLOAT了!可是說句實在話 我們 民用 的數據 哪有要求精度那麼高的呢?這兩種類型至今我沒有用過——我還沒有遇到適合於使用它們的事例

用的最多的 最值得精打細算的 是整數類型 從只佔一個位元組存儲空間的TINYINT到占 個位元組的BIGINT 挑選一個 夠用 並且佔用存儲空間最小的類型是設計資料庫時應該考慮的 TINYINT SMALLINT MEDIUMINT INT和BIGINT佔用存儲空間分別為 位元組 位元組 位元組 位元組和 位元組 就無符號的整數而言 這些類型能表示的最大整數分別為 和 如果用來保存用戶的年齡(舉例來說 資料庫中保存年齡是不可取的) 用TINYINT就夠了 九城的《縱橫》里 各項技能值 用SMALLINT也夠了 如果要用作一個肯定不會超過 行的表的AUTO_INCREMENT的IDENTIFY欄位 當然用 MEDIUMINT 不用 INT 試想 每行節約一個位元組 行可以節約 兆多呢!

二 日期時間類型

日期和時間類型比較簡單 無非是 DATE TIME DATETIME TIMESTAMP和YEAR等幾個類型 只對日期敏感 而對時間沒有要求的欄位 就用DATE而不用DATETIME是不用說的了 單獨使用時間的情況也時有發生——使用TIME 但最多用到的還是用DATETIME 在日期時間類型上沒有什麼文章可做 這里就不再詳述

三 字元(串)類型

不要以為字元類型就是 CHAR !CHAR和VARCHAR的區別在於CHAR是固定長度 只要你定義一個欄位是CHAR( ) 那麼不論你存儲的數據是否達到了 個位元組 它都要佔去 個位元組的空間 而VARVHAR則是可變長度的 如果一個欄位可能的值是不固定長度的 我們只知道它不可能超過 個字元 把它定義為 VARCHAR( )是最合算的 VARCHAR 類型的實際長度是它的值的(實際長度+ ) 為什麼 + 呢?這一個位元組用於保存實際使用了多大的長度呀!從這個 + 中也應該看到 如果一個欄位 它的可能值最長是 個字元 而多數情況下也就是用到了 個字元時 用VARCHAR就不合算了 因為在多數情況下 實際佔用空間是 個位元組 比用CHAR( )還多佔用一個位元組!

舉個例子 就是一個存儲股票名稱和代碼的表 股票名稱絕大部分是四個字的 即 個位元組 股票代碼 上海的是六位數字 深圳的是四位數字 這些都是固定長度的 股票名稱當然要用 CHAR( ) 股票代碼雖然是不固定長度 但如果使用VARVHAR( ) 一個深圳的股票代碼實際佔用空間是 個位元組 而一個上海的股票代碼要佔用 個位元組!考慮到上海的股票數目比深圳的多 那麼用VARCHAR( )就不如CHAR( )合算了

雖然一個CHAR或VARVHAR的最大長度可以到 我認為大於 的CHAR是幾乎用不到的——很少有大於 個位元組長度的固定長度的東東吧?不是固定長度的就用VARCHAR!大於 的VARCHAR也是幾乎用不到的——比這更大的用TEXT就好了 TINYTEXT 最大長度為 佔用空間也是(實際長度+ ) TEXT 最大長度 佔用空間是(實際長度+ ) MEDIUMTEXT 最大長度 佔用空間是(實際長度+ ) LONGTEXT 最大長度 佔用空間是(實際長度+ ) 為什麼 + ? + ? + ? + ?你要是還不知道就該打PP了 這些可以用在論壇啊 新聞啊 什麼的 用來保存文章的正文 根據實際情況的不同 選擇從小到大的不同類型

四 枚舉和集合類型

枚舉(ENUM)類型 最多可以定義 種不同的字元串從中做出選擇 只能並且必須選擇其中一種 佔用存儲空間是一個或兩個位元組 由枚舉值的數目決定 集合(SET)類型 最多可以有 個成員 可以選擇其中的零個到不限定的多個 佔用存儲空間是一個到八個位元組 由集合可能的成員數目決定

舉個例子來說 在SQLServer中 你可以節約到用一個Bit類型來表示性別(男/女) 但MySQL沒有Bit 用TINTINT?不 可以用ENUM( 帥哥 美眉 )!只有兩種選擇 所以只需一個位元組——跟TINYINT一樣大 但卻可以直接用字元串 帥哥 和 美眉 來存取 真是太方便啦!

lishixin/Article/program/MySQL/201311/29648

❹ 「mysql」的存儲類型「bit」是什麼

Bit稱為位數據類型,其數據有兩種取值:0和1,長度為1位。在輸入0以外的其他值時,系統均把它們當1看待。這種數據類型常作為邏輯變數使用,用來表示真、假或是、否等二值選擇。

❺ MySQL 資料庫存儲類型

數值類型包含: int tinyint bigint float decimal

int 大整型(占 4 個位元組的存儲空間)

tinyint 微小整型(占 1 個位元組的存儲空間)

bigint 極大整型(占 8 個位元組的存儲空間)

float 佔4個位元組,最多顯示7個有效位。常用於成績。

float(5,2)取值范圍:

decimal 最多可以顯示 28 個有效位

存儲空間計算:整數部分和小數部分分開存儲,將 9 的倍數包裝成 4 個位元組,余數佔用的位元組數如下:

decimal 的整數位和小數位模9的余數和位元組對照表

例如: decimal(19,9)

整數部分:

小數部分:

char 定長:當列中存儲的字元串達不到最大長度時,使用空格進行補足。

varchar 變長

char 浪費存儲空間,但性能高。 varchar 節約存儲空間,但存儲性能低。

text / longtext(4G)

數值類型寬度為顯示寬度,和佔用存儲空間大小無關;字元類型的寬度,超過則無法存儲:

對於枚舉類型的欄位,欄位值只能在列舉的范圍內選擇。

日期時間類型: date time datetime timestamp
date 日期:

time 時間:

datetime 日期時間:

timestamp 日期時間:

日期時間函數: NOW() CURDATE() CURTIME()

NOW() 返回伺服器當前的時間:

CURDATE() 返回當前日期:

CURTIME() 返回當前時間:

插入日期時間:

語法格式:

示例:

查詢1天以內的記錄:

查詢2年前至今年的記錄:

❻ mysql存儲金額類型,用什麼數據類型比較可靠,一般企業數據用什麼數據類型

對於游戲幣等代幣,一般存儲為int類型是可行的。問題在於越界,int類型長度為11位。

在存儲人民幣相關的金額的時候,則只能存儲到9長度的人民幣,也就是說,最大隻能存儲999999999,不到10億的數值,如果業務增長很快的話,就會給自己留下隱患。

Decimal:Decimal為專門為財務相關問題設計的數據類型。

DECIMAL從MySQL5.1引入,列的聲明語法是DECIMAL(M,D)。在MySQL5.1中,參量的取值范圍如下:M是數字的最大數(精度)。其范圍為1~65(在較舊的MySQL版本中,允許的范圍是1~254),M的默認值是10。

D是小數點右側數字的數目(標度)。其范圍是0~30,但不得超過M。說明:float佔4個位元組,double佔8個位元組,decimail(M,D)佔M+2個位元組。

如DECIMAL(5,2)的最大值為9999.99,因為有7個位元組可用。能夠解決數據的范圍和精度的問題。

(6)mysql數據存儲的兩種類型擴展閱讀

MySQL數據類型DECIMAL用法:

MySQLDECIMAL數據類型用於在資料庫中存儲精確的數值。我們經常將DECIMAL數據類型用於保留准確精確度的列,例如會計系統中的貨幣數據。

要定義數據類型為DECIMAL的列,請使用以下語法:column_nameDECIMAL(P,D);

在上面的語法中:

P是表示有效數字數的精度。P范圍為1〜65。

D是表示小數點後的位數。D的范圍是0~30。MySQL要求D小於或等於(<=)P。

DECIMAL(P,D)表示列可以存儲D位小數的P位數。十進制列的實際范圍取決於精度和刻度。

與INT數據類型一樣,DECIMAL類型也具有UNSIGNED和ZEROFILL屬性。如果使用UNSIGNED屬性,則DECIMALUNSIGNED的列將不接受負值。

如果使用ZEROFILL,MySQL將把顯示值填充到0以顯示由列定義指定的寬度。另外,如果我們對DECIMAL列使用ZEROFILL,MySQL將自動將UNSIGNED屬性添加到列。

❼ mysql資料庫中有幾種數據類型

MySQL數據類型之一字元型
VARCHAR VS CHAR
VARCHAR型和CHAR型數據的這個差別是細微的,但是非常重要。他們都是用來儲存字元串長度小於255的字元。
假如你向一個長度為四十個字元的VARCHAR型欄位中輸入數據Bill Gates。當你以後從這個欄位中取出此數據時,你取出的數據其長度為十個字元——字元串Bill Gates的長度。 現在假如你把字元串輸入一個長度為四十個字元的CHAR型欄位中,那麼當你取出數據時,所取出的數據長度將是四十個字元。字元串的後面會被附加多餘的空格。
當你建立自己的站點時,你會發現使用VARCHAR型欄位要比CHAR型欄位方便的多。使用VARCHAR型欄位時,你不需要為剪掉你數據中多餘的空格而操心。
VARCHAR型欄位的另一個突出的好處是它可以比CHAR型欄位佔用更少的內存和硬碟空間。當你的資料庫很大時,這種內存和磁碟空間的節省會變得非常重要
MySQL數據類型之二文本型
TEXT
使用文本型數據,你可以存放超過二十億個字元的字元串。當你需要存儲大串的字元時,應該使用文本型數據。
注意文本型數據沒有長度,而上一節中所講的字元型數據是有長度的。一個文本型欄位中的數據通常要麼為空,要麼很大。
當你從HTML form的多行文本編輯框(TEXTAREA)中收集數據時,你應該把收集的信息存儲於文本型欄位中。但是,無論何時,只要你能避免使用文本型欄位,你就應該不適用它。文本型欄位既大且慢,濫用文本型欄位會使伺服器速度變慢。文本型欄位還會吃掉大量的磁碟空間。
一旦你向文本型欄位中輸入了任何數據(甚至是空值),就會有2K的空間被自動分配給該數據。除非刪除該記錄,否則你無法收回這部分存儲空間。
MySQL數據類型之三數值型
SQL支持許多種不同的數值型數據。你可以存儲整數 INT 、小數 NUMERIC、和錢數 MONEY。
INT VS SMALLINT VS TINYINT
他們的區別只是字元長度:
INT型數據的表數范圍是從-2,147,483,647到2,147,483,647的整數
SMALLINT 型數據可以存儲從-32768到32768的整數
TINYINT 型的欄位只能存儲從0到255的整數,不能用來儲存負數
通常,為了節省空間,應該盡可能的使用最小的整型數據。一個TINYINT型數據只佔用一個位元組;一個INT型數據佔用四個位元組。這看起來似乎差別不大,但是在比較大的表中,位元組數的增長是很快的。另一方面,一旦你已經創建了一個欄位,要修改它是很困難的。因此,為安全起見,你應該預測以下,一個欄位所需要存儲的數值最大有可能是多大,然後選擇適當的數據類型。
MUNERIC
為了能對欄位所存放的數據有更多的控制,你可以使用NUMERIC型數據來同時表示一個數的整數部分和小數部分。NUMERIC型數據使你能表示非常大的數——比INT型數據要大得多。一個NUMERIC型欄位可以存儲從-1038到1038范圍內的數。NUMERIC型數據還使你能表示有小數部分的數。例如,你可以在NUMERIC型欄位中存儲小數3.14。
當定義一個NUMERIC型欄位時,你需要同時指定整數部分的大小和小數部分的大小。如:MUNERIC(23,0)
一個 NUMERIC型數據的整數部分最大隻能有28位,小數部分的位數必須小於或等於整數部分的位數,小數部分可以是零。
MONEY VS SMALLMONEY
你可以使用 INT型或NUMERIC型數據來存儲錢數。但是,專門有另外兩種數據類型用於此目的。如果你希望你的網點能掙很多錢,你可以使用MONEY型數據。如果你的野心不大,你可以使用SMALLMONEY型數據。MONEY型數據可以存儲從-922,337,203,685,477.5808到922,337,203,685,477.5807的錢數。如果你需要存儲比這還大的金額,你可以使用NUMERIC型數據。
SMALLMONEY型數據只能存儲從-214,748.3648到214,748.3647 的錢數。同樣,如果可以的話,你應該用SMALLMONEY型來代替MONEY型數據,以節省空間。
MySQL數據類型之四邏輯型
BIT
如果你使用復選框( CHECKBOX)從網頁中搜集信息,你可以把此信息存儲在BIT型欄位中。BIT型欄位只能取兩個值:0或1。
當心,在你創建好一個表之後,你不能向表中添加 BIT型欄位。如果你打算在一個表中包含BIT型欄位,你必須在創建表時完成。
MySQL數據類型之五日期型
DATETIME VS SMALLDATETIME
一個 DATETIME型的欄位可以存儲的日期范圍是從1753年1月1日第一毫秒到9999年12月31日最後一毫秒。
如果你不需要覆蓋這么大范圍的日期和時間,你可以使用SMALLDATETIME型數據。它與DATETIME型數據同樣使用,只不過它能表示的日期和時間范圍比DATETIME型數據小,而且不如DATETIME型數據精確。一個SMALLDATETIME型的欄位能夠存儲從1900年1月1日到2079年6月6日的日期,它只能精確到秒。
DATETIME型欄位在你輸入日期和時間之前並不包含實際的數據,認識這一點是重要的。