MySQL筆記(一)之基礎知識

一、mysql數據類型

mysql支持的所有的數據類型。

1.1. 字符串類型

char(1)是固定長度,我們設置長度是多少,只能輸入多少。長度可以再0-255的任意值。

varchar類型的長度是可變的,例如,在創建表時指定了最大長度是100,當我們存儲數據之後可能不夠100個字符串,那麼對於varchar時,使用多少分配多少, varchar類型實際佔用的空間爲字符串的實際長度加一。這樣,即可有效節約系統的空間。

但是我們還要注意,當我們varchar(5)的時候,其實是在所佔用的字節數的實際長度的基礎上家1,最後一個字符串的結束標識符佔用了一個字節。

另外varchar類型將會hello_最後面的空格保留着,而char類型中hello_後面的空格自動刪除掉。(_標識空格)。

最後我們需要對blobtext做一個簡單的認識:

  1. text值對大小寫不敏感,可以將text列視爲varchar列,blobtext長度也是安裝實際佔用的;
  2. blob可以存儲圖片,text不行,只可以存儲純文本文件。
  3. 當保存或檢索BLOB和TEXT列的值時不刪除尾部空格 。

注意:我們需要慎用這兩個字段,mysql會將這兩個類型的值會當做一個獨立的對象處理,會建立一個單獨的區域進行存儲,每個值會採用1~4個指針,指向實際存儲位置;並且如果對這兩個字段進行排序,只能針對最前面的max_sort_length。 如果只需要對前面的更少的字節進行排序,那麼可以通過設置max_sort_length參數或者substring(value,length)來截取部分字符串; 創建臨時表的情況下,因爲如果臨時表大小超過max_heap_table_size或者tmp_table_size,就會將臨時表存儲在磁盤上,進而導致整體速度下降 。

1.2. 數值型類型

int/integer:當我們建表的時候:

create table table_name (
	id int,
    ......
)

我們設置字段是int/integer類型時,默認是帶符號型數據,數據範圍是(-2147483648, 2147483647),這是我們在去設置int(4)設置int類型的長度是沒啥用處的,而設置長度時候,並不是控制我們輸入數據的大小和輸入數據的長度,因爲當我們設置類型爲int/integer時,默認的長度就是11;所以那麼設置int/integer(5)這種又啥用呢?

其實是因爲我們使用的類型不對,我們需要這樣設置屬性:

create table table_name (
	id int(3) unsigned zerofill,
    ......
)

這時候我們設置的int(3)纔會其中用的,當我們填充字段的時候輸入1的時候,實際上會出現001這樣。這樣的意味着,當我們輸入的數據不夠三位時就會用0填充。另外如果設置無符號數據的時候id int(3) unsiend zerofill,這樣就可以了。

這裏我們需要注意下floatdoubledecimal三種類型:

float:最大的精度是6double:最大的精度是8,如果長度超過會丟失精度。floatdouble是非標準類型,在數據庫中保存近似值。建議使用decimal,這種數據類型是一字符串形式保存數值的。

最後我們說一下decimal類型,語法中column_name decimal(p, d)p表示有效數字數的精度,範圍是1~65d表示小數點後面的位數,範圍是0~30mysql要求d小於等於p

當我們設置decimal(5,2):取值範圍是-999.99999.99

實例 結果 原因
999.123 999.12 超出的部分四捨五入
12.3 12.30 位數不夠會補零
1000.00 報錯 超出範圍

1.3. 時間和日期類型

這些類型基本上就沒事可說的了。

1.4. 枚舉類型

enum類型又稱爲枚舉類型,在創建表時,enum類型的取值範圍就以列表的形式指定了。其基本形式如下:屬性名 enum('值1','值2',...,'值n'),其中屬性名參數指定字段的名稱,值n參數表示列表中的第n個值,這些值末尾的空格將會被系統直接刪除。

enum類型最多可枚舉65 535個元素。

create table table_name (
	sex enum('男', '女') ,
    ......
)

1.5. set類型

set類型最多枚舉64個元素。

set是一個字符串對象,可以有零或多個值,其值來自表創建時規定的允許的一列值。指定包括多個set成員的set列值時各成員之間用逗號(‘,’)間隔開。所以set成員值本身不能包含逗號。

create table table_name (
	name set('1', '2', '3', '5') ,
    ......
)

二、MySQL引擎

mysql常用的引擎是三種:InnoDB存儲引擎、MyISAM存儲引擎Memory存儲引擎

2.1. InnoDB存儲引擎

InnoDBMySQL的表提供了事務處理、回滾、崩潰修復能力和多版本併發控制的事務安全。 後面版本的 MySQL的默認存儲引擎就是InnoDB

InnoDB支持自增主鍵和外鍵。

InnoDB中,創建的表的表結構存儲在frm文件。數據和索引存儲在innodb_data_home_dirinnodb_data_file_path定義的表空間中。

InnoDB的優勢在於提供了良好的事務處理、崩潰修復能力和併發控制。缺點是讀寫效率較差,佔用的數據空間相對較大。

2.2. MyISAM存儲引擎

MyISAMMySQL中常見的存儲引擎,曾經是MySQL的默認存儲引擎。

MyISAM的表存儲成3個文件。文件的名字與表名相同。拓展名爲frmmydmyi。其實,frm文件存儲表的結構;myd文件存儲數據,是myData的縮寫;myi文件存儲索引,是myIndex的縮寫。

MyISAM的優勢在於佔用空間小,處理速度快。缺點是不支持事務的完整性和併發性。

2.3. Memory存儲引擎

memoryMySQL中一類特殊的存儲引擎。它使用存儲在內存中的內容來創建表,而且數據全部放在內存中。

每個基於memory存儲引擎的表實際對應一個磁盤文件。該文件的文件名與表名相同,類型爲frm類型。該文件中只存儲表的結構。而其數據文件,都是存儲在內存中,這樣有利於數據的快速處理,提高整個表的效率。

memory默認使用哈希索引。速度比使用B型樹索引快。 想用B型樹索引,可以在創建索引時指定。

memory用到的很少,因爲它是把數據存到內存中,如果內存出現異常就會影響數據。如果重啓或者關機,所有數據都會消失。因此,基於memory的表的生命週期很短,一般是一次性的。

三、存儲引擎對比和選擇

特性 InnoDB MyISAM Memory
事物安全 支持 不支持 不支持
存儲限制 64TB 有限制 有限制
空間使用
內存使用
插入速度
外鍵支持 支持 不支持 不支持

***InnoDB***:支持事務處理,支持外鍵,支持崩潰修復能力和併發控制。如果需要對事務的完整性要求比較高(比如銀行),要求實現併發控制(比如售票),那選擇InnoDB有很大的優勢。如果需要頻繁的更新、刪除操作的數據庫,也可以選擇InnoDB,因爲支持事務的提交(commit)和回滾(rollback)。

***MyISAM***:插入數據快,空間和內存使用比較低。如果表主要是用於插入新記錄和讀出記錄,那麼選擇MyISAM能實現處理高效率。如果應用的完整性、併發性要求比 較低,也可以使用。

***MEMORY***:所有的數據都在內存中,數據的處理速度快,但是安全性不高。如果需要很快的讀寫速度,對數據的安全性要求較低,可以選擇MEMOEY。它對錶的大小有要求,不能建立太大的表。所以,這類數據庫只使用在相對較小的數據庫表。

同一個數據庫也可以使用多種存儲引擎的表。如果一個表要求比較高的事務處理,可以選擇InnoDB。這個數據庫中可以將查詢要求比較高的表選擇MyISAM存儲。如果該數據庫需要一個用於查詢的臨時表,可以選擇MEMORY存儲引擎。

參考文章: https://www.cnblogs.com/yuxiuyan/p/6511837.html (二、三部分參考文章鏈接,大家可以去自己看看)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章