Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
1、基礎(chǔ)知識(shí)
1.1、數(shù)據(jù)庫(kù)概述
- 簡(jiǎn)單地說:數(shù)據(jù)庫(kù)(Database或DB)是存儲(chǔ)、管理數(shù)據(jù)的容器;
- 嚴(yán)格地說:數(shù)據(jù)庫(kù)是“按照某種數(shù)據(jù)結(jié)構(gòu)對(duì)數(shù)據(jù)進(jìn)行組織、存儲(chǔ)和管理的容器”。
- 總結(jié):數(shù)據(jù)永遠(yuǎn)是數(shù)據(jù)庫(kù)的核心。
- 通過“數(shù)據(jù)庫(kù)管理系統(tǒng)”,數(shù)據(jù)庫(kù)用戶可以輕松地實(shí)現(xiàn)數(shù)據(jù)庫(kù)容器中各種數(shù)據(jù)庫(kù)對(duì)象的訪問(增、刪、改、查等操作),并可以輕松地完成數(shù)據(jù)庫(kù)的維護(hù)工作(備份、恢復(fù)、修復(fù)等操作)
- 數(shù)據(jù)庫(kù)用戶無法直接通過操作系統(tǒng)獲取數(shù)據(jù)庫(kù)文件中的具體內(nèi)容;
- 數(shù)據(jù)庫(kù)管理系統(tǒng)通過調(diào)用操作系統(tǒng)的進(jìn)程管理、內(nèi)存管理、設(shè)備管理以及文件管理等服務(wù),為數(shù)據(jù)庫(kù)用戶提供管理、控制數(shù)據(jù)庫(kù)容器中各種數(shù)據(jù)庫(kù)對(duì)象、數(shù)據(jù)庫(kù)文件的接口。
1.3、關(guān)系數(shù)據(jù)庫(kù)
??????? 關(guān)系數(shù)據(jù)庫(kù),是建立在關(guān)系數(shù)據(jù)庫(kù)模型基礎(chǔ)上的數(shù)據(jù)庫(kù),借助于集合代數(shù)等概念和方法來處理數(shù)據(jù)庫(kù)中的數(shù)據(jù),同時(shí)也是一個(gè)被組織成一組擁有正式描述性的表格,該形式的表格作用的實(shí)質(zhì)是裝載著數(shù)據(jù)項(xiàng)的特殊收集體,這些表格中的數(shù)據(jù)能以許多不同的方式被存取或重新召集而不需要重新組織數(shù)據(jù)庫(kù)表格。關(guān)系數(shù)據(jù)庫(kù)的定義造成元數(shù)據(jù)的一張表格或造成表格、列、范圍和約束的正式描述。每個(gè)表格(有時(shí)被稱為一個(gè)關(guān)系)包含用列表示的一個(gè)或更多的數(shù)據(jù)種類。 每行包含一個(gè)唯一的數(shù)據(jù)實(shí)體,這些數(shù)據(jù)是被列定義的種類。
基本特征
- 關(guān)系數(shù)據(jù)庫(kù)
??????? 在一個(gè)給定的應(yīng)用領(lǐng)域中,所有實(shí)體及實(shí)體之間聯(lián)系的集合構(gòu)成一個(gè)關(guān)系數(shù)據(jù)庫(kù)。
- 關(guān)系數(shù)據(jù)庫(kù)的型與值
??????? 關(guān)系數(shù)據(jù)庫(kù)的型稱為關(guān)系數(shù)據(jù)庫(kù)模式,是對(duì)關(guān)系數(shù)據(jù)庫(kù)的描述,若干域的定義,在這些域上定義的若干關(guān)系模式。
關(guān)系數(shù)據(jù)庫(kù)的值是這些關(guān)系模式在某一時(shí)刻對(duì)應(yīng)的關(guān)系的集合,通常簡(jiǎn)稱為關(guān)系數(shù)據(jù)庫(kù)。
1.4、結(jié)構(gòu)化查詢語言SQL?
??????? 結(jié)構(gòu)化查詢語言SQL(Structured Query Language)是一種介于關(guān)系代數(shù)與關(guān)系演算之間的語言,其功能包括查詢、操縱、定義和控制四個(gè)方面,是一個(gè)通用的功能極強(qiáng)的關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語言。目前,SQL語言已被確定為關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)的國(guó)際標(biāo)準(zhǔn),被絕大多數(shù)商品化關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)采用。在SQL語言中,指定要做什么而不是怎么做,不需要告訴SQL如何訪問數(shù)據(jù)庫(kù),只要告訴SQL需要數(shù)據(jù)庫(kù)做什么。可以在設(shè)計(jì)或運(yùn)行時(shí)對(duì)數(shù)據(jù)控件使用SQL語句。
1.5、SQL數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)
SQL數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)基本上也是三級(jí)模式結(jié)構(gòu)
??????? SQL術(shù)語與傳統(tǒng)的關(guān)系模型術(shù)語不同。在SQL中,外模式對(duì)應(yīng)于視圖,模式對(duì)應(yīng)于基本表,元組稱為行,屬性稱為列。內(nèi)模式對(duì)應(yīng)于存儲(chǔ)文件。SQL數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)具有如下特征:
- SQL模式(Schema)是表和約束的集合。
- 表(Table)是行(Row)的集合,每行是列(Column)的序列,每列對(duì)應(yīng)一個(gè)數(shù)據(jù)項(xiàng)。
- 表可以是一個(gè)基本表,也可以是一個(gè)視圖。基本表是實(shí)際存儲(chǔ)在數(shù)據(jù)庫(kù)中的表。視圖是從基本表或其他視圖中導(dǎo)出的表,它本身不獨(dú)立存儲(chǔ)在數(shù)據(jù)庫(kù)中,也就是說數(shù)據(jù)庫(kù)中只存放視圖的定義而不存放視圖的數(shù)據(jù),這些數(shù)據(jù)仍存放在導(dǎo)出視圖的基本表中,因此視圖是一個(gè)虛表。
- 一個(gè)基本表可以跨一個(gè)或多個(gè)存儲(chǔ)文件,一個(gè)存儲(chǔ)文件也可存放一個(gè)或多個(gè)基本表,一個(gè)表可以帶若干索引,索引也存放在存儲(chǔ)文件中。每個(gè)存儲(chǔ)文件與外部存儲(chǔ)器上一個(gè)物理文件對(duì)應(yīng),存儲(chǔ)文件的邏輯結(jié)構(gòu)組成了關(guān)系數(shù)據(jù)庫(kù)的內(nèi)模式。
- 用戶可以用SQL語句對(duì)視圖和基本表進(jìn)行查詢等操作。在用戶看來,視圖和基本表是一樣的,都是關(guān)系(即表格)。
- ? SQL用戶可以是應(yīng)用程序,也可以是終端用戶。SQL語句可嵌入在宿主語言的程序中使用,宿主語言有Fortran、Cobol、Pascal、PL/I、C和Ada等語言;SQL語言也能作為獨(dú)立的用戶接口,供交互環(huán)境下的終端用戶使用。
1.6、SQL的組成
- 數(shù)據(jù)定義 這一部分也稱為“SQL DDL”,用于定義SQL模式、基本表、視圖和索引。
- 數(shù)據(jù)操縱 這一部分也稱為“SQL DML”。數(shù)據(jù)操縱分成數(shù)據(jù)查詢和數(shù)據(jù)更新兩類。其中數(shù)據(jù)更新又分成插入、刪除和修改三種操作。
- 數(shù)據(jù)控制 這一部分也稱為“SQL DCL”。數(shù)據(jù)控制包括對(duì)基本表和視圖的授權(quán),完整性規(guī)則的描述,事務(wù)控制語句等。
嵌入式SQL使用 這一部分內(nèi)容涉及到SQL語句嵌入在宿主語言程序中的使用規(guī)則。
2、存儲(chǔ)引擎
??????? 關(guān)系數(shù)據(jù)庫(kù)表是用于存儲(chǔ)和組織信息的數(shù)據(jù)結(jié)構(gòu),可以將表理解為由行和列組成的表格,類似于Excel的電子表格的形式。有的表簡(jiǎn)單,有的表復(fù)雜,有的表根本不用來存儲(chǔ)任何長(zhǎng)期的數(shù)據(jù),有的表讀取時(shí)非常快,但是插入數(shù)據(jù)時(shí)去很差;而我們?cè)趯?shí)際開發(fā)過程中,就可能需要各種各樣的表,不同的表,就意味著存儲(chǔ)不同類型的數(shù)據(jù),數(shù)據(jù)的處理上也會(huì)存在著差異,那么。對(duì)于MySQL來說,它提供了很多種類型的存儲(chǔ)引擎,我們可以根據(jù)對(duì)數(shù)據(jù)處理的需求,選擇不同的存儲(chǔ)引擎,從而最大限度的利用MySQL強(qiáng)大的功能。
在mysql客戶端中,使用以下命令可以查看MySQL支持的引擎。
show engines;
可以看到MySQL有多種存儲(chǔ)引擎:
MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
平時(shí)用得最多的是MyISAM和InnoDB,下面主要來介紹這兩種。
2.1、MyISAM
MyISAM表是獨(dú)立于操作系統(tǒng)的,這說明可以輕松地將其從Windows服務(wù)器移植到Linux服務(wù)器;每當(dāng)我們建立一個(gè)MyISAM引擎的表時(shí),就會(huì)在本地磁盤上建立三個(gè)文件,文件名就是表明。例如,我建立了一個(gè)MyISAM引擎的tb_Demo表,那么就會(huì)生成以下三個(gè)文件:
1.tb_demo.frm,存儲(chǔ)表定義;
2.tb_demo.MYD,存儲(chǔ)數(shù)據(jù);
3.tb_demo.MYI,存儲(chǔ)索引。
MyISAM表無法處理事務(wù),這就意味著有事務(wù)處理需求的表,不能使用MyISAM存儲(chǔ)引擎。MyISAM存儲(chǔ)引擎特別適合在以下幾種情況下使用:
1.選擇密集型的表。MyISAM存儲(chǔ)引擎在篩選大量數(shù)據(jù)時(shí)非常迅速,這是它最突出的優(yōu)點(diǎn)。
2.插入密集型的表。MyISAM的并發(fā)插入特性允許同時(shí)選擇和插入數(shù)據(jù)。例如:MyISAM存儲(chǔ)引擎很適合管理郵件或Web服務(wù)器日志數(shù)據(jù)。
2.2、InnoDB
InnoDB是一個(gè)健壯的事務(wù)型存儲(chǔ)引擎,這種存儲(chǔ)引擎已經(jīng)被很多互聯(lián)網(wǎng)公司使用,為用戶操作非常大的數(shù)據(jù)存儲(chǔ)提供了一個(gè)強(qiáng)大的解決方案。InnoDB是作為默認(rèn)的存儲(chǔ)引擎。InnoDB還引入了行級(jí)鎖定和外鍵約束,在以下場(chǎng)合下,使用InnoDB是最理想的選擇:
1.更新密集的表。InnoDB存儲(chǔ)引擎特別適合處理多重并發(fā)的更新請(qǐng)求。
2.事務(wù)。InnoDB存儲(chǔ)引擎是支持事務(wù)的標(biāo)準(zhǔn)MySQL存儲(chǔ)引擎。
3.自動(dòng)災(zāi)難恢復(fù)。與其它存儲(chǔ)引擎不同,InnoDB表能夠自動(dòng)從災(zāi)難中恢復(fù)。
4.外鍵約束。MySQL支持外鍵的存儲(chǔ)引擎只有InnoDB。
5.支持自動(dòng)增加列AUTO_INCREMENT屬性。
一般來說,如果需要事務(wù)支持,并且有較高的并發(fā)讀取頻率,InnoDB是不錯(cuò)的選擇。
2.3、MEMORY
使用MySQL Memory存儲(chǔ)引擎的出發(fā)點(diǎn)是速度。為得到最快的響應(yīng)時(shí)間,采用的邏輯存儲(chǔ)介質(zhì)是系統(tǒng)內(nèi)存。雖然在內(nèi)存中存儲(chǔ)表數(shù)據(jù)確實(shí)會(huì)提供很高的性能,但當(dāng)mysqld守護(hù)進(jìn)程崩潰時(shí),所有的Memory數(shù)據(jù)都會(huì)丟失。獲得速度的同時(shí)也帶來了一些缺陷。它要求存儲(chǔ)在Memory數(shù)據(jù)表里的數(shù)據(jù)使用的是長(zhǎng)度不變的格式,這意味著不能使用BLOB和TEXT這樣的長(zhǎng)度可變的數(shù)據(jù)類型,VARCHAR是一種長(zhǎng)度可變的類型,但因?yàn)樗贛ySQL內(nèi)部當(dāng)做長(zhǎng)度固定不變的CHAR類型,所以可以使用。
一般在以下幾種情況下使用Memory存儲(chǔ)引擎:
1.目標(biāo)數(shù)據(jù)較小,而且被非常頻繁地訪問。在內(nèi)存中存放數(shù)據(jù),所以會(huì)造成內(nèi)存的使用,可以通過參數(shù)max_heap_table_size控制Memory表的大小,設(shè)置此參數(shù),就可以限制Memory表的最大大小。
2.如果數(shù)據(jù)是臨時(shí)的,而且要求必須立即可用,那么就可以存放在內(nèi)存表中。
3.存儲(chǔ)在Memory表中的數(shù)據(jù)如果突然丟失,不會(huì)對(duì)應(yīng)用服務(wù)產(chǎn)生實(shí)質(zhì)的負(fù)面影響。
Memory同時(shí)支持散列索引和B樹索引。B樹索引的優(yōu)于散列索引的是,可以使用部分查詢和通配查詢,也可以使用<、>和>=等操作符方便數(shù)據(jù)挖掘。散列索引進(jìn)行“相等比較”非常快,但是對(duì)“范圍比較”的速度就慢多了,因此散列索引值適合使用在=和<>的操作符中,不適合在<或>操作符中,也同樣不適合用在order by子句中。
可以在表創(chuàng)建時(shí)利用USING子句指定要使用的版本。例如:
復(fù)制代碼 代碼如下:
create table users(?
id smallint unsigned not null auto_increment,?
username varchar(15) not null,?
pwd varchar(15) not null,?
index using hash (username),
primary key (id))engine=memory;
上述代碼創(chuàng)建了一個(gè)表,在username字段上使用了HASH散列索引。下面的代碼就創(chuàng)建一個(gè)表,使用BTREE索引。
復(fù)制代碼 代碼如下:
create table users(
id smallint unsigned not null auto_increment,
username varchar(15) not null,?
pwd varchar(15) not null,
index using btree (username),?
primary key (id))engine=memory;
2.4、MERGE
MERGE存儲(chǔ)引擎是一組MyISAM表的組合,這些MyISAM表結(jié)構(gòu)必須完全相同,盡管其使用不如其它引擎突出,但是在某些情況下非常有用。說白了,Merge表就是幾個(gè)相同MyISAM表的聚合器;Merge表中并沒有數(shù)據(jù),對(duì)Merge類型的表可以進(jìn)行查詢、更新、刪除操作,這些操作實(shí)際上是對(duì)內(nèi)部的MyISAM表進(jìn)行操作。Merge存儲(chǔ)引擎的使用場(chǎng)景。
對(duì)于服務(wù)器日志這種信息,一般常用的存儲(chǔ)策略是將數(shù)據(jù)分成很多表,每個(gè)名稱與特定的時(shí)間端相關(guān)。例如:可以用12個(gè)相同的表來存儲(chǔ)服務(wù)器日志數(shù)據(jù),每個(gè)表用對(duì)應(yīng)各個(gè)月份的名字來命名。當(dāng)有必要基于所有12個(gè)日志表的數(shù)據(jù)來生成報(bào)表,這意味著需要編寫并更新多表查詢,以反映這些表中的信息。與其編寫這些可能出現(xiàn)錯(cuò)誤的查詢,不如將這些表合并起來使用一條查詢,之后再刪除Merge表,而不影響原來的數(shù)據(jù),刪除Merge表只是刪除Merge表的定義,對(duì)內(nèi)部的表沒有任何影響。
2.5、小結(jié)
InnoDB存儲(chǔ)引擎:用于事務(wù)處理應(yīng)用程序,具有眾多特性
MyISAM存儲(chǔ)引擎:主要用于管理費(fèi)事務(wù)表,它提供高速存儲(chǔ)和檢索,以及全文搜索能力
MEMORY存儲(chǔ)引擎:提供“內(nèi)存中”表,MEMORY存儲(chǔ)引擎的所有數(shù)據(jù)都在內(nèi)存中,數(shù)據(jù)的處理速度快,但安全性不高
3、名詞解釋
- 字段和數(shù)據(jù)類型
??????? 雖然所有這些引擎都支持通用的數(shù)據(jù)類型,例如整型、實(shí)型和字符型等,但是,并不是所有的引擎都支持其它的字段類型,特別是BLOG(二進(jìn)制大對(duì)象)或者TEXT文本類型。其它引擎也許僅支持有限的字符寬度和數(shù)據(jù)大小。
這些局限性可能直接影響到你可以存儲(chǔ)的數(shù)據(jù),同時(shí)也可能會(huì)對(duì)你實(shí)施的搜索的類型或者你對(duì)那些信息創(chuàng)建的索引產(chǎn)生間接的影響。這些區(qū)別能夠影響你的應(yīng)用程序的性能和功能,因?yàn)槟惚仨氁鶕?jù)你要存儲(chǔ)的數(shù)據(jù)類型選擇對(duì)需要的存儲(chǔ)引擎的功能做出決策。
- 鎖定
??????? 數(shù)據(jù)庫(kù)引擎中的鎖定功能決定了如何管理信息的訪問和更新。當(dāng)數(shù)據(jù)庫(kù)中的一個(gè)對(duì)象為信息更新鎖定了,在更新完成之前,其它處理不能修改這個(gè)數(shù)據(jù)(在某些情況下還不允許讀這種數(shù)據(jù))。
??????? 鎖定不僅影響許多不同的應(yīng)用程序如何更新數(shù)據(jù)庫(kù)中的信息,而且還影響對(duì)那個(gè)數(shù)據(jù)的查詢。這是因?yàn)椴樵兛赡芤L問正在被修改或者更新的數(shù)據(jù)。總的來說,這種延遲是很小的。大多數(shù)鎖定機(jī)制主要是為了防止多個(gè)處理更新同一個(gè)數(shù)據(jù)。由于向數(shù)據(jù)中插入信息和更新信息這兩種情況都需要鎖定,你可以想象,多個(gè)應(yīng)用程序使用同一個(gè)數(shù)據(jù)庫(kù)可能會(huì)有很大的影響。
??????? 不同的存儲(chǔ)引擎在不同的對(duì)象級(jí)別支持鎖定,而且這些級(jí)別將影響可以同時(shí)訪問的信息。得到支持的級(jí)別有三種:表鎖定、塊鎖定和行鎖定。支持最多的是表鎖定,這種鎖定是在MyISAM中提供的。在數(shù)據(jù)更新時(shí),它鎖定了整個(gè)表。這就防止了許多應(yīng)用程序同時(shí)更新一個(gè)具體的表。這對(duì)應(yīng)用很多的多用戶數(shù)據(jù)庫(kù)有很大的影響,因?yàn)樗舆t了更新的過程。
??????? 頁級(jí)鎖定使用Berkeley DB引擎,并且根據(jù)上載的信息頁(8KB)鎖定數(shù)據(jù)。當(dāng)在數(shù)據(jù)庫(kù)的很多地方進(jìn)行更新的時(shí)候,這種鎖定不會(huì)出現(xiàn)什么問題。但是,由于增加幾行信息就要鎖定數(shù)據(jù)結(jié)構(gòu)的最后8KB,當(dāng)需要增加大量的行,也別是大量的小型數(shù)據(jù),就會(huì)帶來問題。
行級(jí)鎖定提供了最佳的并行訪問功能,一個(gè)表中只有一行數(shù)據(jù)被鎖定。這就意味著很多應(yīng)用程序能夠更新同一個(gè)表中的不同行的數(shù)據(jù),而不會(huì)引起鎖定的問題。只有InnoDB存儲(chǔ)引擎支持行級(jí)鎖定。
- 建立索引
??????? 建立索引在搜索和恢復(fù)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的時(shí)候能夠顯著提高性能。不同的存儲(chǔ)引擎提供不同的制作索引的技術(shù)。有些技術(shù)也許會(huì)更適合你存儲(chǔ)的數(shù)據(jù)類型。
有些存儲(chǔ)引擎根本就不支持索引,其原因可能是它們使用基本表索引(如MERGE引擎)或者是因?yàn)閿?shù)據(jù)存儲(chǔ)的方式不允許索引(例如FEDERATED或者BLACKHOLE引擎)。
- 事務(wù)處理
事務(wù)處理功能通過提供在向表中更新和插入信息期間的可靠性。這種可靠性是通過如下方法實(shí)現(xiàn)的,它允許你更新表中的數(shù)據(jù),但僅當(dāng)應(yīng)用的應(yīng)用程序的所有相關(guān)操作完全完成后才接受你對(duì)表的更改。例如,在會(huì)計(jì)處理中每一筆會(huì)計(jì)分錄處理將包括對(duì)借方科目和貸方科目數(shù)據(jù)的更改,你需要要使用事務(wù)處理功能保證對(duì)借方科目和貸方科目的數(shù)據(jù)更改都順利完成,才接受所做的修改。如果任一項(xiàng)操作失敗了,你都可以取消這個(gè)事務(wù)處理,這些修改就不存在了。如果這個(gè)事務(wù)處理過程完成了,我們可以通過允許這個(gè)修改來確認(rèn)這個(gè)操作。
4、數(shù)據(jù)類型
- 字符串?dāng)?shù)據(jù)類型
1.char(n)和varchar(n)中括號(hào)中n代表字符的個(gè)數(shù),并不代表字節(jié)個(gè)數(shù),所以當(dāng)使用了中文的時(shí)候(UTF8)意味著可以插入m個(gè)中文,但是實(shí)際會(huì)占用m*3個(gè)字節(jié)。
2.同時(shí)char和varchar最大的區(qū)別就在于char不管實(shí)際value都會(huì)占用n個(gè)字符的空間,而varchar只會(huì)占用實(shí)際字符應(yīng)該占用的空間+1,并且實(shí)際空間+1<=n。
3.超過char和varchar的n設(shè)置后,字符串會(huì)被截?cái)唷?br /> 4.char的上限為255字節(jié),varchar的上限65535字節(jié),text的上限為65535。
5.char在存儲(chǔ)的時(shí)候會(huì)截?cái)辔膊康目崭?#xff0c;varchar和text不會(huì)。
6.varchar會(huì)使用1-3個(gè)字節(jié)來存儲(chǔ)長(zhǎng)度,text不會(huì)。
-
數(shù)值數(shù)據(jù)類型
整型
?上面定義的都是有符號(hào)的,當(dāng)然了,也可以加上unsigned關(guān)鍵字,定義成無符號(hào)的類型,那么對(duì)應(yīng)的取值范圍就要翻翻了,比如:
tinyint unsigned的取值范圍為0~255。
浮點(diǎn)型
?-
二進(jìn)制數(shù)據(jù)類型
??????? 二進(jìn)制類型可存儲(chǔ)任何數(shù)據(jù),如文字、圖像、多媒體等。具體類型描述如下:
- 數(shù)據(jù)類型的屬性
轉(zhuǎn)載于:https://www.cnblogs.com/zhanghaiyang/p/7213368.html
總結(jié)
以上是生活随笔為你收集整理的Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flex 布局教程:实例篇
- 下一篇: linux 内核调试方法