詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

濰城網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,濰城網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為濰城近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的濰城做網(wǎng)站的公司定做!

目錄


    • 庫(kù)相關(guān)內(nèi)容

    • 表的詳細(xì)操作

    • 數(shù)據(jù)類型

    • 枚舉與集合

    • 存儲(chǔ)引擎(了解即可)

庫(kù)相關(guān)內(nèi)容


MySQL一些默認(rèn)庫(kù)

information_schema: 虛擬庫(kù),不占用磁盤空間,存儲(chǔ)的是數(shù)據(jù)庫(kù)啟動(dòng)后的一些參數(shù),如用戶表信息、列信息、權(quán)限信息、字符信息等
performance_schema: MySQL 5.5開始新增一個(gè)數(shù)據(jù)庫(kù):主要用于收集數(shù)據(jù)庫(kù)服務(wù)器性能參數(shù),記錄處理查詢請(qǐng)求時(shí)發(fā)生的各種事件、鎖等現(xiàn)象
mysql: 授權(quán)庫(kù),主要存儲(chǔ)系統(tǒng)用戶的權(quán)限信息
test: MySQL數(shù)據(jù)庫(kù)系統(tǒng)自動(dòng)創(chuàng)建的測(cè)試數(shù)據(jù)庫(kù)

ps:部分MySQL可能沒(méi)有test庫(kù),如筆者的8.0,用于sys代替了test庫(kù)

創(chuàng)建數(shù)據(jù)庫(kù)就不用說(shuō)了(在上一篇有提到),了解一下創(chuàng)建數(shù)據(jù)庫(kù)時(shí)的命名規(guī)則:

可以由字母、數(shù)字、下劃線、@、#、$
區(qū)分大小寫

不能使用關(guān)鍵字如 create select
不能單獨(dú)使用數(shù)字
最長(zhǎng)128位

通常命名都是字母、數(shù)字、下劃線、例如上面的@#$建議不要使用,后續(xù)我們?nèi)绻ㄟ^(guò)代碼連接庫(kù),里面的符號(hào)有可能會(huì)與代碼的語(yǔ)法沖突。

表的詳細(xì)操作


創(chuàng)建表的約束條件(詳細(xì)留到下一章講解)

create table student(
	id int not null,
	name varchar(10) not null # 最后一個(gè)字段不能使用逗號(hào));

上面操作表示,約束了student這個(gè)表的id 和 name字段插入值時(shí),不能為空

insert student values(null,'jack');

產(chǎn)生報(bào)錯(cuò):ERROR 1048 (23000): Column ‘id’ cannot be null

告訴我們id不能為空

更改表的補(bǔ)充操作

約束條件是可有可無(wú)的,根據(jù)自身對(duì)表的需求。

修改表名

alter table 表名 rename 新表名;

增加字段

alter table 表名 add 字段名 數(shù)據(jù)類型 約束條件(根據(jù)需求添加);# 添加多個(gè)字段alter table 表名 add 字段名1 數(shù)據(jù)類型,add 字段名2 數(shù)據(jù)類型;# 在開頭增加字段alter table 表名 add 字段 數(shù)據(jù)類型 first;# 在某個(gè)字段后面增加字段alter table 表名 add 字段 數(shù)據(jù)類型 after 字段;

刪除字段

alter table 表名 drop 字段

修改字段

# 修改字段的類型或者約束條件alter table 表名 modify 新的數(shù)據(jù)類型 新的約束條件;# 修改整個(gè)字段alter table 表名 change 舊字段名 新字段名 新字段數(shù)據(jù)類型;# 修改字段名alter table 表名 rename column 原字段名 to 新字段名;

復(fù)制表

當(dāng)我們通過(guò)select查詢表的時(shí)候,呈現(xiàn)給我們的是一張:虛擬表,即存在內(nèi)存中的內(nèi)容,不能夠保存下來(lái),我們通過(guò)復(fù)制,可以拿到我們想要的表數(shù)據(jù)

創(chuàng)建一張表演示

insert student values(1,'jack'),(2,'tom'),(3,'jams'),(4,'rous');

詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法

我們需要將id大于2記錄的內(nèi)容保存到一張新的表

create table new_studnet select * from student where id > 2;

詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法
或者我們只是想復(fù)制表的數(shù)據(jù)結(jié)構(gòu),除了記錄(數(shù)據(jù))以外,其它所有信息

create table new_student2 select * from student where 0 > 1;

這種判斷永遠(yuǎn)為假,表示無(wú)法復(fù)制表的記錄,但是可以復(fù)制它的數(shù)據(jù)結(jié)構(gòu)
詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法

數(shù)據(jù)類型


1、整數(shù)類型:TINYINT SMALLINT MEDIUMINT INT BIGINT

作用:存儲(chǔ)年齡,等級(jí),id,各種號(hào)碼等

不同的整數(shù)類型,存儲(chǔ)的數(shù)值范圍不同。
詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法
比如:當(dāng)我們選擇int類型創(chuàng)建一個(gè)字段后,這張表就會(huì)多占用4個(gè)字節(jié)。我們需要根據(jù)自己存入值的范圍來(lái)選擇整數(shù)類型,可以節(jié)省空間。

2、浮點(diǎn)類型:float、double、decimal(可以寫成dec)

作用:存儲(chǔ)薪資、身高、體重、體質(zhì)參數(shù)等

float(255,30) :整數(shù)可以支持到255個(gè)數(shù)字個(gè)數(shù),并且支持30位以內(nèi)的小數(shù)
double(255,30) :整數(shù)可以支持到255范圍內(nèi),并且支持30位以內(nèi)的小數(shù)
dec(65,30) :整數(shù)可以支持到60范圍內(nèi),并且支持30位以內(nèi)的小數(shù)
單精度浮點(diǎn)數(shù)(非準(zhǔn)確小數(shù)值),m是數(shù)字總個(gè)數(shù),d是小數(shù)點(diǎn)后個(gè)數(shù)。m較大值為255,d較大值為30

那么這三個(gè)浮點(diǎn)類型的區(qū)別在于哪里?答案是:精準(zhǔn)度

實(shí)例:創(chuàng)建3張不同浮點(diǎn)類型的表

create table f1(id float(255,30));create table f2(id double(255,30));create table f3(id dec(66,30));

插入值

insert f1 values(1.1111111111111111111111111111111); # 小數(shù)點(diǎn)后31個(gè)1insert f2 values(1.1111111111111111111111111111111);insert f3 values(1.1111111111111111111111111111111);

效果
詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法
decaimal能夠存儲(chǔ)精確值的原因在于其內(nèi)部按照字符串存儲(chǔ)。

通常我們使用float就足夠了,要求再高一點(diǎn)使用double就可以了,如果對(duì)精準(zhǔn)度要求特別高那么就使用decaimal,但是decaimal整數(shù)長(zhǎng)度不如float與double

3、日期類型:DATE TIME DATETIME TIMESTAMP YEAR

作用:存儲(chǔ)用戶注冊(cè)時(shí)間,文章發(fā)布時(shí)間,員工入職時(shí)間,出生時(shí)間,過(guò)期時(shí)間等

在我們創(chuàng)建表字段時(shí),可以指定某個(gè)字段傳入的日期是什么,以下可選:

date # 1000-01-01/9999-12-31time # -838:59:59/838:59:59year # 支持1901/2155datetime # 日期時(shí)間 1000-01-01 00:00:00/9999-12-31 23:59:59timestamp # 日期時(shí)間 1970-01-01 00:00:00/2037 某時(shí)

實(shí)例:創(chuàng)建表

create table info( 
	id int, 
	name varchar(10),
	birth date,
	class_time time,
	reg_time datetime,
	born_year year);

插入記錄

nsert info values(
	1,
	'jack',
	'1999-01-01',
	'08:30:00',
	'2020-01-01 10:15:00',
	'1999');

詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法
MySQL提供的兩種日期時(shí)間都可以提供給我們使用,那它們之間的區(qū)別在哪里呢

datetime與timestamp的區(qū)別

首先占用空間:datetime占用8字節(jié)大小,timestamp占用4字節(jié)大小

在5.x以上版本,改動(dòng)表后使用timestamp可以自動(dòng)給我們填上當(dāng)前系統(tǒng)時(shí)間,筆者的8.0不能自動(dòng)填上系統(tǒng)時(shí)間,和datietime呈現(xiàn)的效果一樣了,只是上限的時(shí)間不同。我們?nèi)绻_(dá)到這個(gè)效果,可以創(chuàng)建時(shí)補(bǔ)充如下參數(shù)

create table d2(
	id int,
	name varchar(10),
	now timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

我們添加數(shù)據(jù)時(shí),可以根據(jù)前兩個(gè)來(lái)字段添加,最后一個(gè)讓它自動(dòng)補(bǔ)充。

# insert d2 values(1,'jack'); 錯(cuò)誤寫法,因?yàn)檫@個(gè)必須要給所有字段設(shè)置值insert d2(id,name) values(1,'jack'); # 正確寫法

詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法


4、字符串類型:char、varchar

char:簡(jiǎn)單粗暴,浪費(fèi)空間,存取速度快

  • 字符長(zhǎng)度范圍:0-255(一個(gè)中文是一個(gè)字符,是utf8編碼的3個(gè)字節(jié))

  • 存儲(chǔ)char類型的值時(shí),會(huì)往右填充空格來(lái)滿足長(zhǎng)度

    • 例如:指定長(zhǎng)度為10,存>10個(gè)字符則報(bào)錯(cuò),存<10個(gè)字符則用空格填充直到湊夠10個(gè)字符存儲(chǔ)

  • 在檢索或者說(shuō)查詢時(shí),查出的結(jié)果會(huì)自動(dòng)刪除尾部的空格,除非我們打開pad_char_to_full_length SQL模式(SET sql_mode = ‘PAD_CHAR_TO_FULL_LENGTH’;)

varchar類型:變長(zhǎng),精準(zhǔn),節(jié)省空間,存取速度慢

  • 字符長(zhǎng)度范圍:0-65535(如果大于21845會(huì)提示用其他類型 。mysql行較大限制為65535字節(jié)。

  • varchar類型存儲(chǔ)數(shù)據(jù)的真實(shí)內(nèi)容,不會(huì)用空格填充,如果’ab ',尾部的空格也會(huì)被存起來(lái)

  • 強(qiáng)調(diào):varchar類型會(huì)在真實(shí)數(shù)據(jù)前加1-2Bytes的前綴,該前綴用來(lái)表示真實(shí)數(shù)據(jù)的bytes字節(jié)數(shù)(1-2Bytes較大表示65535個(gè)數(shù)字,正好符合mysql對(duì)row的較大字節(jié)限制,即已經(jīng)足夠使用)

  • 如果真實(shí)的數(shù)據(jù)<255bytes則需要1Bytes的前綴(1Bytes=8bit 2**8較大表示的數(shù)字為255)

  • 如果真實(shí)的數(shù)據(jù)>255bytes則需要2Bytes的前綴(2Bytes=16bit 2**16較大表示的數(shù)字為65535)

  • 尾部有空格會(huì)保存下來(lái),在檢索或者說(shuō)查詢時(shí),也會(huì)正常顯示包含空格在內(nèi)的內(nèi)容

char(4)Storage Requiredvarchar(4)Storage Required
’        ’4字節(jié)‘’1字節(jié)
'ab   ’4字節(jié)‘a(chǎn)b’2字節(jié)
‘a(chǎn)bcd’4字節(jié)‘a(chǎn)bcd’5字節(jié)
‘a(chǎn)bcdef’報(bào)錯(cuò)‘a(chǎn)bcde’報(bào)錯(cuò)

區(qū)分介紹:

char類型定長(zhǎng),不管存多少數(shù)據(jù),如果未達(dá)到指定長(zhǎng)度,則空格補(bǔ)充
varchar類型變長(zhǎng):因?yàn)槿〉臅r(shí)候,不知道varchar類型取了多少個(gè)數(shù)據(jù),所以默認(rèn)會(huì)在開頭放入1個(gè)字節(jié)的頭部。(底層存儲(chǔ)機(jī)制,只要我們自身輸入的內(nèi)容沒(méi)有超過(guò)定義的長(zhǎng)度就不會(huì)報(bào)錯(cuò))

char一定比varchar更浪費(fèi)空間?

如果存儲(chǔ)內(nèi)容相同長(zhǎng)度的情況下,varchar占用大小會(huì)大于char

但是我們平常還是常使用varchar,因?yàn)槲覀兇鎯?chǔ)內(nèi)容時(shí),無(wú)法確定內(nèi)容的大小,所以通常使用varchar,也就多占那么1-2個(gè)字節(jié),而char的話,則占用更多的大小。

注意:

如果存儲(chǔ)的內(nèi)容是網(wǎng)頁(yè)或網(wǎng)絡(luò)上的某一篇文章,建議不要把文字全部保存到數(shù)據(jù)庫(kù),直接將鏈接放上去保存即可。


嚴(yán)格模式下的MySQL,如果存儲(chǔ)內(nèi)容超過(guò)了字符串類型定義的長(zhǎng)度,那么則會(huì)報(bào)錯(cuò),而非嚴(yán)格模式下的MySQL,則是不保存超出的內(nèi)容,并發(fā)出警告信息。

查看字符的個(gè)數(shù)

create table c1(x char(10));create table c2(x varchar(10));select char_length(x) as "內(nèi)容長(zhǎng)度" from c1;select char_length(x) as "內(nèi)容長(zhǎng)度" from c2;

詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法
很奇怪的就是,char類型并沒(méi)有占用10個(gè)字節(jié),是因?yàn)镸ySQL幫我們隱藏了,只呈現(xiàn)給我們自身存儲(chǔ)的內(nèi)容,調(diào)整一下就可以讓它顯出原形。

set sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';

詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法
查詢時(shí)候的問(wèn)題
詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法
很明顯,這兩個(gè)類型雖然內(nèi)容一樣,但是char占用字符更長(zhǎng)

枚舉與集合

通過(guò)enum函數(shù)與set函數(shù),在創(chuàng)建表時(shí),定義某個(gè)字段在插入值時(shí),值的內(nèi)容是否匹配。

create table test(
    id int,
    name varchar(10),
    gender enum('男','女','未知'),
    hobbies set('game','music','book','movie'));

enum:在向gender這個(gè)字段插入值時(shí),只能輸入其中一的值
set:在向hobbies這個(gè)字段插入值時(shí),可以輸入其中多個(gè)值,通過(guò)逗號(hào)隔開

insert test values(1,'jack','男','game,book');

詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法
如果我們輸入的內(nèi)容,與函數(shù)內(nèi)定義的不符,非嚴(yán)格模式發(fā)出警告信息,嚴(yán)格模式直接報(bào)錯(cuò)

詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法
筆者的MySQL為嚴(yán)格模式(利于開發(fā))

select @@sql_mode; # 查看當(dāng)前模式

存儲(chǔ)引擎(了解即可)

首先確定一點(diǎn),存儲(chǔ)引擎的概念是MySQL里面才有的,不是所有的關(guān)系型數(shù)據(jù)庫(kù)都有存儲(chǔ)引擎這個(gè)概念。

數(shù)據(jù)庫(kù)中的表也應(yīng)該有不同的類型,表的類型不同,會(huì)對(duì)應(yīng)mysql不同的存取機(jī)制,表類型又稱為存儲(chǔ)引擎。

show engines; # 查看MySQL內(nèi)的存儲(chǔ)引擎

詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法
但是我們創(chuàng)建表時(shí)并沒(méi)有指定存儲(chǔ)引擎吶。

因?yàn)镸ySQL默認(rèn)的是:InnoDB

查詢表的存儲(chǔ)引擎

show create table student;

詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法



從上至下查看:
詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法
圖片來(lái)源:秋月

MySQL架構(gòu)總共四層,在上圖中以虛線作為劃分。

1、首先,最上層的服務(wù)并不是MySQL獨(dú)有的,大多數(shù)給予網(wǎng)絡(luò)的客戶端/服務(wù)器的工具或者服務(wù)都有類似的架構(gòu)。比如:連接處理、授權(quán)認(rèn)證、安全等。
2、第二層的架構(gòu)包括大多數(shù)的MySQL的核心服務(wù)。包括:查詢解析、分析、優(yōu)化、緩存以及所有的內(nèi)置函數(shù)(例如:日期、時(shí)間、數(shù)學(xué)和加密函數(shù))。同時(shí),所有的跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn):存儲(chǔ)過(guò)程、觸發(fā)器、視圖等。
3、第三層包含了存儲(chǔ)引擎。存儲(chǔ)引擎負(fù)責(zé)MySQL中數(shù)據(jù)的存儲(chǔ)和提取。服務(wù)器通過(guò)API和存儲(chǔ)引擎進(jìn)行通信。這些接口屏蔽了不同存儲(chǔ)引擎之間的差異,使得這些差異對(duì)上層的查詢過(guò)程透明化。存儲(chǔ)引擎API包含十幾個(gè)底層函數(shù),用于執(zhí)行“開始一個(gè)事務(wù)”等操作。但存儲(chǔ)引擎一般不會(huì)去解析SQL(InnoDB會(huì)解析外鍵定義,因?yàn)槠浔旧頉](méi)有實(shí)現(xiàn)該功能),不同存儲(chǔ)引擎之間也不會(huì)相互通信,而只是簡(jiǎn)單的響應(yīng)上層的服務(wù)器請(qǐng)求。
4、第四層包含了文件系統(tǒng),所有的表結(jié)構(gòu)和數(shù)據(jù)以及用戶操作的日志最終還是以文件的形式存儲(chǔ)在硬盤上。

MySQL存儲(chǔ)引擎介紹:

InnoDB 存儲(chǔ)引擎
支持事務(wù),其設(shè)計(jì)目標(biāo)主要面向聯(lián)機(jī)事務(wù)處理(OLTP)的應(yīng)用。其
特點(diǎn)是行鎖設(shè)計(jì)、支持外鍵,并支持類似 Oracle 的非鎖定讀,即默認(rèn)讀取操作不會(huì)產(chǎn)生鎖。 從 MySQL 5.5.8 版本開始是默認(rèn)的存儲(chǔ)引擎。
InnoDB 存儲(chǔ)引擎將數(shù)據(jù)放在一個(gè)邏輯的表空間中,這個(gè)表空間就像黑盒一樣由 InnoDB 存儲(chǔ)引擎自身來(lái)管理。從 MySQL 4.1(包括 4.1)版本開始,可以將每個(gè) InnoDB 存儲(chǔ)引擎的 表單獨(dú)存放到一個(gè)獨(dú)立的 ibd 文件中。此外,InnoDB 存儲(chǔ)引擎支持將裸設(shè)備(row disk)用 于建立其表空間。
InnoDB 通過(guò)使用多版本并發(fā)控制(MVCC)來(lái)獲得高并發(fā)性,并且實(shí)現(xiàn)了 SQL 標(biāo)準(zhǔn) 的 4 種隔離級(jí)別,默認(rèn)為 REPEATABLE 級(jí)別,同時(shí)使用一種稱為 netx-key locking 的策略來(lái) 避免幻讀(phantom)現(xiàn)象的產(chǎn)生。除此之外,InnoDB 存儲(chǔ)引擎還提供了插入緩沖(insert buffer)、二次寫(double write)、自適應(yīng)哈希索引(adaptive hash index)、預(yù)讀(read ahead) 等高性能和高可用的功能。
對(duì)于表中數(shù)據(jù)的存儲(chǔ),InnoDB 存儲(chǔ)引擎采用了聚集(clustered)的方式,每張表都是按 主鍵的順序進(jìn)行存儲(chǔ)的,如果沒(méi)有顯式地在表定義時(shí)指定主鍵,InnoDB 存儲(chǔ)引擎會(huì)為每一 行生成一個(gè) 6 字節(jié)的 ROWID,并以此作為主鍵。
InnoDB 存儲(chǔ)引擎是 MySQL 數(shù)據(jù)庫(kù)最為常用的一種引擎,Facebook、Google、Yahoo 等 公司的成功應(yīng)用已經(jīng)證明了 InnoDB 存儲(chǔ)引擎具備高可用性、高性能以及高可擴(kuò)展性。對(duì)其 底層實(shí)現(xiàn)的掌握和理解也需要時(shí)間和技術(shù)的積累。如果想深入了解 InnoDB 存儲(chǔ)引擎的工作 原理、實(shí)現(xiàn)和應(yīng)用,可以參考《MySQL 技術(shù)內(nèi)幕:InnoDB 存儲(chǔ)引擎》一書。

MyISAM 存儲(chǔ)引擎
不支持事務(wù)、表鎖設(shè)計(jì)、支持全文索引,主要面向一些 OLAP 數(shù) 據(jù)庫(kù)應(yīng)用,在 MySQL 5.5.8 版本之前是默認(rèn)的存儲(chǔ)引擎(除 Windows 版本外)。數(shù)據(jù)庫(kù)系統(tǒng) 與文件系統(tǒng)一個(gè)很大的不同在于對(duì)事務(wù)的支持,MyISAM 存儲(chǔ)引擎是不支持事務(wù)的。究其根 本,這也并不難理解。用戶在所有的應(yīng)用中是否都需要事務(wù)呢?在數(shù)據(jù)倉(cāng)庫(kù)中,如果沒(méi)有 ETL 這些操作,只是簡(jiǎn)單地通過(guò)報(bào)表查詢還需要事務(wù)的支持嗎?此外,MyISAM 存儲(chǔ)引擎的 另一個(gè)與眾不同的地方是,它的緩沖池只緩存(cache)索引文件,而不緩存數(shù)據(jù)文件,這與 大多數(shù)的數(shù)據(jù)庫(kù)都不相同。

NDB 存儲(chǔ)引擎
2003 年,MySQL AB 公司從 Sony Ericsson 公司收購(gòu)了 NDB 存儲(chǔ)引擎。 NDB 存儲(chǔ)引擎是一個(gè)集群存儲(chǔ)引擎,類似于 Oracle 的 RAC 集群,不過(guò)與 Oracle RAC 的 share everything 結(jié)構(gòu)不同的是,其結(jié)構(gòu)是 share nothing 的集群架構(gòu),因此能提供更高級(jí)別的 高可用性。NDB 存儲(chǔ)引擎的特點(diǎn)是數(shù)據(jù)全部放在內(nèi)存中(從 5.1 版本開始,可以將非索引數(shù) 據(jù)放在磁盤上),因此主鍵查找(primary key lookups)的速度極快,并且能夠在線添加 NDB 數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)(data node)以便線性地提高數(shù)據(jù)庫(kù)性能。由此可見(jiàn),NDB 存儲(chǔ)引擎是高可用、 高性能、高可擴(kuò)展性的數(shù)據(jù)庫(kù)集群系統(tǒng),其面向的也是 OLTP 的數(shù)據(jù)庫(kù)應(yīng)用類型。

Memory 存儲(chǔ)引擎
正如其名,Memory 存儲(chǔ)引擎中的數(shù)據(jù)都存放在內(nèi)存中,數(shù)據(jù)庫(kù)重 啟或發(fā)生崩潰,表中的數(shù)據(jù)都將消失。它非常適合于存儲(chǔ) OLTP 數(shù)據(jù)庫(kù)應(yīng)用中臨時(shí)數(shù)據(jù)的臨時(shí)表,也可以作為 OLAP 數(shù)據(jù)庫(kù)應(yīng)用中數(shù)據(jù)倉(cāng)庫(kù)的維度表。Memory 存儲(chǔ)引擎默認(rèn)使用哈希 索引,而不是通常熟悉的 B+ 樹索引。

Infobright 存儲(chǔ)引擎
第三方的存儲(chǔ)引擎。其特點(diǎn)是存儲(chǔ)是按照列而非行的,因此非常 適合 OLAP 的數(shù)據(jù)庫(kù)應(yīng)用。其官方網(wǎng)站是 http://www.infobright.org/,上面有不少成功的數(shù)據(jù) 倉(cāng)庫(kù)案例可供分析。

NTSE 存儲(chǔ)引擎
網(wǎng)易公司開發(fā)的面向其內(nèi)部使用的存儲(chǔ)引擎。目前的版本不支持事務(wù), 但提供壓縮、行級(jí)緩存等特性,不久的將來(lái)會(huì)實(shí)現(xiàn)面向內(nèi)存的事務(wù)支持。

BLACKHOLE
黑洞存儲(chǔ)引擎,可以應(yīng)用于主備復(fù)制中的分發(fā)主庫(kù)。

使用指定的存儲(chǔ)引擎,兩種方式:

1、創(chuàng)建表時(shí)指定

create table t2(id int)engine=innodb;

2、修改MySQL配置文件

# /etc/my.cnf [mysqld]default-storage-engine=INNODBinnodb_file_per_table=1

測(cè)試部分存儲(chǔ)引擎的效果,創(chuàng)建幾張表不同存儲(chǔ)引擎的表

create table t1(id int)engine=innodb;create table t2(id int)engine=myisam;create table t3(id int)engine=memory;create table t4(id int)engine=blackhole;

注意:筆者安裝的MySQL版本在8.0以上

進(jìn)入MySQL下面data找到對(duì)應(yīng)庫(kù)下面,查看創(chuàng)建后的表文件類型

詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法

1.db.opt文件:用來(lái)記錄該庫(kù)的默認(rèn)字符集編碼和字符集排序規(guī)則用的。也就是說(shuō)如果你創(chuàng)建數(shù)據(jù)庫(kù)指定默認(rèn)字符集和排序規(guī)則,那么后續(xù)創(chuàng)建的表如果沒(méi)有指定字符集和排序規(guī)則,那么該新建的表將采用db.opt文件中指定的屬性。
2.后綴名為.frm的文件:這個(gè)文件主要是用來(lái)描述數(shù)據(jù)表結(jié)構(gòu)(id,name字段等)和字段長(zhǎng)度等信息
3.后綴名為.ibd的文件:這個(gè)文件主要儲(chǔ)存的是采用獨(dú)立表儲(chǔ)存模式時(shí)儲(chǔ)存數(shù)據(jù)庫(kù)的數(shù)據(jù)信息和索引信息;
4.后綴名為.MYD(MYData)的文件:從名字可以看出,這個(gè)是存儲(chǔ)數(shù)據(jù)庫(kù)數(shù)據(jù)信息的文件,主要是存儲(chǔ)采用獨(dú)立表儲(chǔ)存模式時(shí)存儲(chǔ)的數(shù)據(jù)信息;
5.后綴名為.MYI的文件:這個(gè)文件主要儲(chǔ)存的是數(shù)據(jù)庫(kù)的索引信息;
6.ibdata1文件:主要作用也是儲(chǔ)存數(shù)據(jù)信息和索引信息,這個(gè)文件在mysql安裝目錄的data文件夾下。
從上面可以看出,.ibd儲(chǔ)存的是數(shù)據(jù)信息和索引信息,ibdata1文件也是存儲(chǔ)數(shù)據(jù)信息和索引信息,.MYD和.MYI也是分別儲(chǔ)存數(shù)據(jù)信息和索引信息,那他們之間有什么區(qū)別呢?
主要區(qū)別是再于數(shù)據(jù)庫(kù)的存儲(chǔ)引擎不一樣,如果儲(chǔ)存引擎采用的是MyISAM,則生成的數(shù)據(jù)文件為表名.frm、表名.MYD、表名的MYI;而儲(chǔ)存引擎如果是innoDB,開啟了innodb_file_per_table=1,也就是采用獨(dú)立儲(chǔ)存的模式,生成的文件是表名.frm、表名.ibd,如果采用共存儲(chǔ)模式的,數(shù)據(jù)信息和索引信息都存儲(chǔ)在ibdata1(在里面進(jìn)行分類,從外面看是一個(gè)文件)中;
在進(jìn)行數(shù)據(jù)恢復(fù)的時(shí)候,如果用的是MYISAM數(shù)據(jù)引擎,那么數(shù)據(jù)很好恢復(fù),只要將相應(yīng).frm, .MYD, .MYI文件拷貝過(guò)去即可。但是如果是innodb的話,則每一個(gè)數(shù)據(jù)表都是一個(gè)單獨(dú)的文件,只將相應(yīng)的.frm和.ibd文件拷貝過(guò)去是不夠的,必須在你的ibd文件的tablespace id和ibdata1文件中的元信息的tablespace id一致才可以。

演示向不同存儲(chǔ)引擎的表插入數(shù)據(jù)

insert t1 values(1);insert t2 values(2);insert t3 values(3);insert t4 values(4);

t1:innodb、t2:myisam、t3:memory、t4:blackhole存儲(chǔ)引擎

t3的數(shù)據(jù)是存儲(chǔ)在內(nèi)存中的,t4寫入的數(shù)據(jù)會(huì)被丟到,因?yàn)槭呛诙匆?/p>

我們通過(guò)select都能查詢到內(nèi)容,t4怎么查詢都是空的,而t3在我們重啟MySQL服務(wù)后,內(nèi)容就會(huì)被清空,因?yàn)樗谴嫒雰?nèi)存中的,重啟等于釋放掉整個(gè)MySQL服務(wù)再開啟,

感謝各位的閱讀!關(guān)于“詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

網(wǎng)頁(yè)題目:詳細(xì)分析MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)用法-創(chuàng)新互聯(lián)
瀏覽地址:http://muchs.cn/article34/dsespe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)網(wǎng)站內(nèi)鏈、ChatGPT建站公司、品牌網(wǎng)站設(shè)計(jì)網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化