MySQL 數(shù)據(jù)庫(kù)管理

1 數(shù)據(jù)庫(kù)介紹

1.1 什么是數(shù)據(jù)庫(kù)

數(shù)據(jù)庫(kù)就是一個(gè)存放計(jì)算機(jī)數(shù)據(jù)的倉(cāng)庫(kù),這個(gè)倉(cāng)庫(kù)是按照一定的數(shù)據(jù)結(jié)構(gòu)(數(shù)據(jù)結(jié)構(gòu)是指數(shù)據(jù)的組織形式或數(shù)據(jù)之間的聯(lián)系)來(lái)對(duì)數(shù)據(jù)進(jìn)行組織和存儲(chǔ)的,可以通過(guò)數(shù)據(jù)庫(kù)提供的多種方法來(lái)管理其中的數(shù)據(jù)。

1.2 數(shù)據(jù)庫(kù)的種類

關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)。

1.3 常用數(shù)據(jù)庫(kù)

  • 關(guān)系型數(shù)據(jù)庫(kù): Oracle、Microsoft SQL Server、MySQL/MariaDB等。
  • 非關(guān)系型數(shù)據(jù)庫(kù): MongoDB Memcached Redis

1.4、關(guān)系型數(shù)據(jù)庫(kù)

關(guān)系型數(shù)據(jù)庫(kù)模型是把復(fù)雜的數(shù)據(jù)結(jié)構(gòu)歸結(jié)為簡(jiǎn)單的二元關(guān)系(即二維表格形式)。在關(guān)系型數(shù)據(jù)庫(kù)中,對(duì)數(shù)據(jù)的操作幾乎全部建立在一個(gè)或多個(gè)關(guān)系表格上,通過(guò)這些關(guān)聯(lián)的表格分類、合并、連接或選取等運(yùn)算來(lái)實(shí)現(xiàn)數(shù)據(jù)的管理。 關(guān)系型數(shù)據(jù)可以很好地存儲(chǔ)一些關(guān)系模型的數(shù)據(jù),比如一個(gè)老師對(duì)應(yīng)多個(gè)學(xué)生的數(shù)據(jù)(“一對(duì)多”),一本書(shū)對(duì)應(yīng)多個(gè)作者(“一對(duì)多”),一本書(shū)對(duì)應(yīng)一個(gè)出版日期(“一對(duì)一”) 關(guān)系型數(shù)據(jù)庫(kù)誕生距今已有 40 多年了,從理論產(chǎn)生到發(fā)展到實(shí)現(xiàn)產(chǎn)品,例如:常見(jiàn)的 MySQL 和 Oracle 數(shù)據(jù)庫(kù),Oracle 在數(shù)據(jù)庫(kù)領(lǐng)域里上升到了霸主地位,形成每年高達(dá)數(shù)百億美元的龐大產(chǎn)業(yè)市場(chǎng),而 MySQL 也是不容忽視的數(shù)據(jù)庫(kù),以至于被 Oracle 重金收購(gòu)了。

1.5、非關(guān)系型數(shù)據(jù)庫(kù)

非關(guān)系型數(shù)據(jù)庫(kù)也被稱為 NoSQL 數(shù)據(jù)庫(kù),NoSQL 的本意是 “Not Only SQL”,指的是非關(guān)系型數(shù)據(jù)庫(kù),而不是“NO SQL”的意思,NoSQL 的產(chǎn)生并不是要徹底否定關(guān)系型數(shù)據(jù)庫(kù),而是作為傳統(tǒng)數(shù)據(jù)庫(kù)的一個(gè)有效補(bǔ)充。NoSQL 數(shù)據(jù)庫(kù)在特定的場(chǎng)景下可以發(fā)揮難以想象的高效率和高性能。特別是對(duì)于規(guī)模日益擴(kuò)大的海量數(shù)據(jù),超大規(guī)模和高并發(fā)的微博、微信、SNS 類型的純動(dòng)態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問(wèn)題,例如:傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)IO瓶頸、性能瓶頸都難以有效突破,于是開(kāi)始出現(xiàn)了大批針對(duì)特定場(chǎng)景,以高性能和使用便利為目的功能特異化的數(shù)據(jù)庫(kù)產(chǎn)品。NoSQL(非關(guān)系型)類的數(shù)據(jù)庫(kù)就是這樣的情景中誕生并得到了非常迅速的發(fā)展。

NoSQL 是非關(guān)系型數(shù)據(jù)庫(kù)的廣義定義。它打破了長(zhǎng)久以來(lái)關(guān)系型數(shù)據(jù)庫(kù)與ACID理論大一統(tǒng)的局面。NoSQL數(shù)據(jù)存儲(chǔ)不需要固定的表結(jié)構(gòu),通常也不存在連續(xù)操作。

1.鍵值(Key-Value)存儲(chǔ)數(shù)據(jù)庫(kù)

  • 鍵值數(shù)據(jù)庫(kù)就類似傳統(tǒng)語(yǔ)言中使用的哈希表??梢酝ㄟ^(guò)key來(lái)添加、查詢或者刪除數(shù)據(jù),因?yàn)槭褂胟ey主鍵訪問(wèn),所以會(huì)獲得很高的性能及擴(kuò)展性。這個(gè)表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù)。Key-Value模型對(duì)于IT系統(tǒng)來(lái)說(shuō)的優(yōu)勢(shì)在于簡(jiǎn)單、易部署、高并發(fā)。
  • 典型產(chǎn)品:Memcached、Redis、MemcachedB

2、列存儲(chǔ)(Column-Oriented)數(shù)據(jù)庫(kù)

  • 列存儲(chǔ)數(shù)據(jù)庫(kù)將數(shù)據(jù)存儲(chǔ)存在列族(Column Family)中,一個(gè)列族存儲(chǔ)經(jīng)常被一起查詢的相關(guān)數(shù)據(jù)。舉個(gè)例子,如果有一個(gè) Person 類,通常會(huì)一起查詢他們的姓名和年齡而不是薪資。這種情況下,姓名和年齡就會(huì)被放入一個(gè)列族中,而薪資則在另一個(gè)列族中。這部分?jǐn)?shù)據(jù)庫(kù)通常用來(lái)應(yīng)對(duì)分布式存儲(chǔ)的海量數(shù)據(jù)。鍵仍然存在,但是他們的特點(diǎn)是指向了多個(gè)列。這些列是由列家族來(lái)安排的。
  • 典型產(chǎn)品:Cassandra,HBase

3、面向文檔(Document-Oriented)的數(shù)據(jù)庫(kù)

  • 面向文檔數(shù)據(jù)庫(kù)會(huì)將數(shù)據(jù)以文檔的形式存儲(chǔ),數(shù)據(jù)存儲(chǔ)的最小單位是文檔,同一個(gè)表中存儲(chǔ)的文檔屬性可以是不同的,數(shù)據(jù)可以使用XML、JSON等多種形式存儲(chǔ)。
  • 典型產(chǎn)品:MongDB、CouchDB

4、圖形(Graph)數(shù)據(jù)庫(kù)

  • 圖形數(shù)據(jù)庫(kù)允許我們將數(shù)據(jù)以圖的方式存儲(chǔ)。圖形結(jié)構(gòu)的數(shù)據(jù)庫(kù)同其他行列以及剛性結(jié)構(gòu)的 SQL 數(shù)據(jù)庫(kù)不同,它是使用靈活的圖形模型,并且能夠擴(kuò)展到多個(gè)服務(wù)器上。
  • 典型產(chǎn)品:Neo4J、InfoGr id

2 MySQL數(shù)據(jù)庫(kù)

2.1 MySQL簡(jiǎn)介

MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB 公司開(kāi)發(fā),目前屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) 應(yīng)用軟件之一。關(guān)系數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉(cāng)庫(kù)內(nèi),這樣就增加了速度并提高了靈活性。

MySQL所使用的 SQL 語(yǔ)言是用于訪問(wèn)數(shù)據(jù)庫(kù)的最常用標(biāo)準(zhǔn)化語(yǔ)言。MySQL 軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開(kāi)放源碼這一特點(diǎn),一般中小型網(wǎng)站的開(kāi)發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫(kù)。

RDBMS即關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(Relational Database Management System)

2.2 MySQL安裝方式

2.3 MySQL數(shù)據(jù)庫(kù)存儲(chǔ)引擎

數(shù)據(jù)庫(kù)存儲(chǔ)引擎是數(shù)據(jù)庫(kù)底層軟件組織,數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)使用數(shù)據(jù)引擎進(jìn)行創(chuàng)建、查詢、更新和刪除數(shù)據(jù)。不同的存儲(chǔ)引擎提供不同的存儲(chǔ)機(jī)制、索引、鎖表等功能,使用不同的存儲(chǔ)引擎,還可以 獲得特定的功能?,F(xiàn)在許多不同的數(shù)據(jù)庫(kù)管理系統(tǒng)都支持多種不同的數(shù)據(jù)引擎。MySQL的核心就是存儲(chǔ)引擎。

1、InnoDB存儲(chǔ)引擎:默認(rèn)引擎,最常用的。 InnoDB是事務(wù)型數(shù)據(jù)庫(kù)的首選引擎,支持事務(wù)安全表(ACID),支持行鎖定;InnoDB是默認(rèn)的MySQL引擎

InnoDB特點(diǎn): 支持事務(wù)處理,支持崩潰修復(fù)和并發(fā)控制。如果需要對(duì)事務(wù)的完整性要求比較高(比如銀行),要求實(shí)現(xiàn)并發(fā)控制(比如售票),那選擇InnoDB有很大的優(yōu)勢(shì)。如果需要頻繁的更新、刪除操作的數(shù)據(jù)庫(kù),也可以選擇InnoDB,因?yàn)橹С质聞?wù)的提交(commit)和回滾(rollback)。

2、MyISAM存儲(chǔ)引擎:(了解)MyISAM基于ISAM存儲(chǔ)引擎,并對(duì)其進(jìn)行擴(kuò)展。它是在Web、數(shù)據(jù)倉(cāng)儲(chǔ)和其他應(yīng)用環(huán)境下最常使用的存儲(chǔ)引擎之一。MyISAM擁有較高的插入、查詢速度,但不支持事務(wù)。

MyISAM特點(diǎn): 插入數(shù)據(jù)快,空間和內(nèi)存使用比較低。如果表主要是用于插入新記錄和讀出記錄,那么選擇MyISAM能實(shí)現(xiàn)處理高效率。如果應(yīng)用的完整性、并發(fā)性要求比較低,也可以使用。

12306查詢 只生成一條數(shù)據(jù)這種適合。

3、MEMORY內(nèi)存型引擎(了解)MEMORY存儲(chǔ)引擎將表中的數(shù)據(jù)存儲(chǔ)到內(nèi)存中,為查詢和引用其他表數(shù)據(jù)提供快速訪問(wèn)

MEMORY特點(diǎn): 所有的數(shù)據(jù)都在內(nèi)存中,數(shù)據(jù)的處理速度快,但是安全性不高。如果需要很快的讀寫(xiě)速度,對(duì)數(shù)據(jù)的安全性要求較低,可以選擇MEMOEY。它對(duì)表的大小有要求,不能建立太大的表。所以,這類數(shù)據(jù)庫(kù)只使用在相對(duì)較小的數(shù)據(jù)庫(kù)表。

4、Archive(歸檔引擎)

如何選擇引擎:如果要提供提交、回滾、并要求實(shí)現(xiàn)并發(fā)控制,InnoDB是一個(gè)好的選擇;如果數(shù)據(jù)表主要用來(lái)插入和查詢記錄,則MyISAM引擎能提供較高的處理效率;如果只是臨時(shí)存放數(shù)據(jù),數(shù)據(jù)量不大,并且不需要較高的數(shù)據(jù)安全性,可以選擇將數(shù)據(jù)保存在內(nèi)存中的Memory引擎;MySQL中使用該引擎作為臨時(shí)表,存放查詢的中間結(jié)果;

使用哪一種引擎需要靈活選擇,一個(gè)數(shù)據(jù)庫(kù)中多個(gè)表可以使用不同引擎以滿足各種性能和實(shí)際需求,使用合適的存儲(chǔ)引擎,將會(huì)提高整個(gè)數(shù)據(jù)庫(kù)的性能。

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

MySQL支持多種類型,大致可以分為三類:數(shù)值、日期/時(shí)間和字符串(字符)類型。

3.1 MySQL數(shù)值類型

MySQL支持所有標(biāo)準(zhǔn)SQL數(shù)值數(shù)據(jù)類型。

這些類型包括嚴(yán)格數(shù)值數(shù)據(jù)類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數(shù)值數(shù)據(jù)類型(FLOAT、REAL和DOUBLE PRECISION)。

關(guān)鍵字INT是INTEGER的同義詞,關(guān)鍵字DEC是DECIMAL的同義詞。

BIT數(shù)據(jù)類型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

作為SQL標(biāo)準(zhǔn)的擴(kuò)展,MySQL也支持整數(shù)類型TINYINT、MEDIUMINT和BIGINT。下面的表顯示了需要的每個(gè)整數(shù)類型的存儲(chǔ)和范圍。

|

類型

|

大小

|

范圍(有符號(hào))

|

范圍(無(wú)符號(hào))

|

用途

|
|

TINYINT

|

1 字節(jié)

|

(-128,127)

|

(0,255)

|

小整數(shù)值

|
|

SMALLINT

|

2 字節(jié)

|

(-32 768,32 767)

|

(0,65 535)

|

大整數(shù)值

|
|

MEDIUMINT

|

3 字節(jié)

|

(-8 388 608,8 388 607)

|

(0,16 777 215)

|

大整數(shù)值

|
|

INT或INTEGER

|

4 字節(jié)

|

(-2 147 483 648,2 147 483 647)

|

(0,4 294 967 295)

|

大整數(shù)值

|
|

BIGINT

|

8 字節(jié)

|

(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)

|

(0,18 446 744 073 709 551 615)

|

極大整數(shù)值

|
|

FLOAT

|

4 字節(jié)

|

(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)

|

0,(1.175 494 351 E-38,3.402 823 466 E+38)

|

單精度 浮點(diǎn)數(shù)值

|
|

DOUBLE

|

8 字節(jié)

|

(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

|

0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

|

雙精度 浮點(diǎn)數(shù)值

|
|

DECIMAL

|

對(duì)DECIMAL(M,D) ,如果M>D,為M+2否則為D+2

|

依賴于M和D的值

|

依賴于M和D的值

|

小數(shù)值

|

3.2 MySQL日期和時(shí)間類型

表示時(shí)間值的日期和時(shí)間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每個(gè)時(shí)間類型有一個(gè)有效值范圍和一個(gè)"零"值,當(dāng)指定不合法的MySQL不能表示的值時(shí)使用"零"值。

TIMESTAMP類型有專有的自動(dòng)更新特性,將在后面描述。

|

類型

|

大小(字節(jié))

|

范圍

|

格式

|

用途

|
|

DATE

|

3

|

1000-01-01/9999-12-31

|

YYYY-MM-DD

|

日期值

|
|

TIME

|

3

|

'-838:59:59'/'838:59:59'

|

HH:MM:SS

|

時(shí)間值或持續(xù)時(shí)間

|
|

YEAR

|

1

|

1901/2155

|

YYYY

|

年份值

|
|

DATETIME

|

8

|

1000-01-01 00:00:00/9999-12-31 23:59:59

|

YYYY-MM-DD HH:MM:SS

|

混合日期和時(shí)間值

|
|

TIMESTAMP

|

4

|

1970-01-01 00:00:00/2038

結(jié)束時(shí)間是第 2147483647 秒,北京時(shí)間 2038-1-19 11:14:07,格林尼治時(shí)間 2038年1月19日 凌晨 03:14:07

|

YYYYMMDD HHMMSS

|

混合日期和時(shí)間值,時(shí)間戳

|

3.3 MySQL字符串類型

字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節(jié)描述了這些類型如何工作以及如何在查詢中使用這些類型。

|

類型

|

大小

|

用途

|
|

CHAR

|

0-255字節(jié)

|

定長(zhǎng)字符串

|
|

VARCHAR

|

0-65535 字節(jié)

|

變長(zhǎng)字符串

|
|

TINYBLOB

|

0-255字節(jié)

|

不超過(guò) 255 個(gè)字符的二進(jìn)制字符串

|
|

TINYTEXT

|

0-255字節(jié)

|

短文本字符串

|
|

BLOB

|

0-65 535字節(jié)

|

二進(jìn)制形式的長(zhǎng)文本數(shù)據(jù)

|
|

TEXT

|

0-65 535字節(jié)

|

長(zhǎng)文本數(shù)據(jù)

|
|

MEDIUMBLOB

|

0-16 777 215字節(jié)

|

二進(jìn)制形式的中等長(zhǎng)度文本數(shù)據(jù)

|
|

MEDIUMTEXT

|

0-16 777 215字節(jié)

|

中等長(zhǎng)度文本數(shù)據(jù)

|
|

LONGBLOB

|

0-4 294 967 295字節(jié)

|

二進(jìn)制形式的極大文本數(shù)據(jù)

|
|

LONGTEXT

|

0-4 294 967 295字節(jié)

|

極大文本數(shù)據(jù)

|

CHAR 和 VARCHAR 類型類似,但它們保存和檢索的方式不同。它們的最大長(zhǎng)度和是否尾部空格被保留等方面也不同。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫(xiě)轉(zhuǎn)換。

BINARY 和 VARBINARY 類似于 CHAR 和 VARCHAR,不同的是它們包含二進(jìn)制字符串而不要非二進(jìn)制字符串。也就是說(shuō),它們包含字節(jié)字符串而不是字符字符串。這說(shuō)明它們沒(méi)有字符集,并且排序和比較基于列值字節(jié)的數(shù)值值。

BLOB 是一個(gè)二進(jìn)制大對(duì)象,可以容納可變數(shù)量的數(shù)據(jù)。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區(qū)別在于可容納存儲(chǔ)范圍不同。

有 4 種 TEXT 類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對(duì)應(yīng)的這 4 種 BLOB 類型,可存儲(chǔ)的最大長(zhǎng)度不同,可根據(jù)實(shí)際情況選擇。

4 MySQL表完整性約束

  • PRIMARY KEY (PK) 標(biāo)識(shí)該字段為該表的主鍵,可以唯一的標(biāo)識(shí)記錄,不可以為空 UNIQUE + NOT NULL
  • FOREIGN KEY (FK) 標(biāo)識(shí)該字段為該表的外鍵,實(shí)現(xiàn)表與表之間的關(guān)聯(lián)
  • NULL 標(biāo)識(shí)是否允許為空,默認(rèn)為NULL。
  • NOT NULL 標(biāo)識(shí)該字段不能為空,可以修改。
  • UNIQUE KEY (UK) 標(biāo)識(shí)該字段的值是唯一的,可以為空,一個(gè)表中可以有多個(gè)UNIQUE KEY
  • AUTO_INCREMENT 標(biāo)識(shí)該字段的值自動(dòng)增長(zhǎng)(整數(shù)類型,而且為主鍵)
  • DEFAULT 為該字段設(shè)置默認(rèn)值
  • UNSIGNED 無(wú)符號(hào),正數(shù)

5 MySQL 索引

5.1 MySQL 索引的分類

  • 普通索引(INDEX):索引列值可重復(fù)
  • 唯一索引(UNIQUE):索引列值必須唯一,可以為NULL
  • 主鍵索引(PRIMARY KEY):索引列值必須唯一,不能為NULL,一個(gè)表只能有一個(gè)主鍵索引
  • 全文索引(FULL TEXT):給每個(gè)字段創(chuàng)建索引

5.2 MySQL 不同類型索引用途和區(qū)別

  • 普通索引常用于過(guò)濾數(shù)據(jù)。例如,以商品種類作為索引,檢索種類為“手機(jī)”的商品。
  • 唯一索引主要用于標(biāo)識(shí)一列數(shù)據(jù)不允許重復(fù)的特性,相比主鍵索引不常用于檢索的場(chǎng)景。
  • 主鍵索引是行的唯一標(biāo)識(shí),因而其主要用途是檢索特定數(shù)據(jù)。
  • 全文索引效率低,常用于文本中內(nèi)容的檢索。

5.3 MySQL 索引操作

5.3.1 創(chuàng)建索引

5.3.1.1 普通索引(INDEX)

<pre data-language="sql" id="IHGDa" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># 在創(chuàng)建表時(shí)指定
mysql> create table student1(id int not null, name varchar(100) not null, birthdy date, sex char(1) not null, index nameindex (name(50)));
Query OK, 0 rows affected (0.02 sec)

基于表結(jié)構(gòu)創(chuàng)建

mysql> create table student2(id int not null, name varchar(100) not null, birthday date, sex char(1) not null);
Query OK, 0 rows affected (0.01 sec)

mysql> create index nameindex on student2(name(50));

修改表結(jié)構(gòu)創(chuàng)建

mysql> create table student3(id int not null, name varchar(100) not null, birthday date, sex char(1) not null);
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE student3 ADD INDEX nameIndex(name(50));

mysql> show index from student3; //查看某個(gè)表格中的索引</pre>

5.3.1.2 唯一索引(UNIQUE)

<pre data-language="sql" id="ln9Np" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># 在創(chuàng)建表時(shí)指定
mysql> create table student4(id int not null, name varchar(100) not null, birthday date, sex char(1) not null, unique index id_idex (id));
Query OK, 0 rows affected (0.00 sec)

基于表結(jié)構(gòu)創(chuàng)建

mysql> create table student5(id int not null, name varchar(100) not null, birthday date, sex char(1) not null);
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE unique INDEX idIndex ON student5(id);

基于表結(jié)構(gòu)創(chuàng)建

mysql> create table student18(id int not null, name varchar(100) not null, birthday date, sex char(1) not null);

mysql> alter table student18 add unique index idIndex(id);
Query OK, 0 rows affected (0.02 sec)</pre>

5.3.1.3 主鍵索引(PRIMARY KEY)

<pre data-language="sql" id="agTAC" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># 創(chuàng)建表時(shí)時(shí)指定
mysql> create table student6(id int not null, name varchar(100) not null, birthday date, sex char(1) not null, primary key (id));
Query OK, 0 rows affected (0.01 sec)

修改表結(jié)構(gòu)創(chuàng)建

mysql> create table student7(id int not null, name varchar(100) not null, birthday date, sex char(1) not null);
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE student7 ADD PRIMARY KEY (id);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0</pre>

5.3.2 刪除索引

5.3.2.1 普通索引(INDEX)

<pre data-language="plain" id="52f4fbd7" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># 直接刪除
mysql> DROP INDEX nameIndex ON student1;

修改表結(jié)構(gòu)刪除

mysql> ALTER TABLE student2 DROP INDEX nameIndex;</pre>

5.3.2.2 唯一索引(UNIQUE)

<pre data-language="plain" id="bad7d820" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># 直接刪除
mysql> drop index id_idex on student4;

修改表結(jié)構(gòu)刪除

mysql> ALTER TABLE student5 DROP INDEX idIndex;</pre>

5.3.2.3 主鍵索引(PRIMARY KEY)

<pre data-language="sql" id="e3caa170" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">mysql> ALTER TABLE student7 DROP PRIMARY KEY;</pre>

主鍵不能采用直接刪除的方式刪除。

5.3.3 查看索引

<pre data-language="sql" id="6b2d4e3d" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">mysql> SHOW INDEX FROM tab_name;</pre>

5.4 選擇索引的原則

  • 常用于查詢條件的字段較適合作為索引,例如WHERE語(yǔ)句和JOIN語(yǔ)句中出現(xiàn)的列
  • 唯一性太差的字段不適合作為索引,例如性別,年齡
  • 更新過(guò)于頻繁(更新頻率遠(yuǎn)高于檢索頻率)的字段不適合作為索引
  • 使用索引的好處是索引通過(guò)一定的算法建立了索引值與列值直接的聯(lián)系,可以通過(guò)索引直接獲取對(duì)應(yīng)的行數(shù)據(jù),而無(wú)需進(jìn)行全表搜索,因而加快了檢索速度
  • 但由于索引也是一種數(shù)據(jù)結(jié)構(gòu),它需要占據(jù)額外的內(nèi)存空間,并且讀取索引也加會(huì)大IO資源的消耗,因而索引并非越多越好,且對(duì)過(guò)小的表也沒(méi)有添加索引的必要

6 MySQL 數(shù)據(jù)備份與恢復(fù)

備份:能夠防止由于機(jī)械故障以及人為誤操作帶來(lái)的數(shù)據(jù)丟失,例如將數(shù)據(jù)庫(kù)文件保存在了其它地方。

冗余: 數(shù)據(jù)有多份冗余,但不等備份,只能防止機(jī)械故障帶來(lái)的數(shù)據(jù)丟失,例如主備模式、數(shù)據(jù)庫(kù)集群。

6.1 數(shù)據(jù)庫(kù)備份內(nèi)容

備份內(nèi)容 databases Binlog my.cnf

所有備份數(shù)據(jù)都應(yīng)放在非數(shù)據(jù)庫(kù)本地,而且建議有多份副本。

測(cè)試環(huán)境中做日?;謴?fù)演練,恢復(fù)較備份更為重要。

6.2 數(shù)據(jù)庫(kù)備份類型

<pre data-language="sql" id="rmW8X" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">1.物理備份: 直接復(fù)制數(shù)據(jù)庫(kù)文件,適用于大型數(shù)據(jù)庫(kù)環(huán)境,不受存儲(chǔ)引擎的限制,但不能恢復(fù)到不同的MySQL版本。

1、熱備(hot backup)

在線備份,數(shù)據(jù)庫(kù)處于運(yùn)行狀態(tài),這種備份方法依賴于數(shù)據(jù)庫(kù)的日志文件

  • 對(duì)應(yīng)用基本無(wú)影響(但是性能還是會(huì)有下降,所以盡量不要在主庫(kù)上做備份,在從庫(kù)上做)

2、冷備(cold backup)

備份數(shù)據(jù)文件,需要停機(jī),是在關(guān)閉數(shù)據(jù)庫(kù)的時(shí)候進(jìn)行的

  • 備份 datadir 目錄下的所有文件

3、溫備(warm backup)

  • 針對(duì)myisam的備份(myisam不支持熱備),備份時(shí)候?qū)嵗蛔x不可寫(xiě),數(shù)據(jù)庫(kù)鎖定表格(不可寫(xiě)入但可讀)的狀態(tài)下進(jìn)行的
  • 對(duì)應(yīng)用影響很大
  • 通常加一個(gè)讀鎖

2.邏輯備份: 備份的是建表、建庫(kù)、插入等操作所執(zhí)行SQL語(yǔ)句(DDL DML DCL),適用于中小型數(shù)據(jù)庫(kù),效率相對(duì)較低。

3.物理和邏輯備份的區(qū)別

邏輯備份 物理備份
備份方式 備份數(shù)據(jù)庫(kù)建表、建庫(kù)、插入sql語(yǔ)句 備份數(shù)據(jù)庫(kù)物理文件
優(yōu)點(diǎn) 備份文件相對(duì)較小,只備份表中的數(shù)據(jù)與結(jié)構(gòu) 恢復(fù)速度比較快
缺點(diǎn) 恢復(fù)速度較慢(需要重建索引,存儲(chǔ)過(guò)程等) 備份文件相對(duì)較大(備份表空間,包含數(shù)據(jù)與索引)
對(duì)業(yè)務(wù)影響 I/O負(fù)載加大 I/O負(fù)載加大
代表工具 mysqldump ibbackup、xtrabackup,mysqlbackup</pre>

6.3 MySQL 備份工具

6.3.1 ibbackup

  • 官方備份工具
  • 收費(fèi)
  • 物理備份

6.3.2 xtrabackup

  • 開(kāi)源社區(qū)備份工具
  • 開(kāi)源免費(fèi),上面的免費(fèi)版本(老版本有問(wèn)題,備份出來(lái)的數(shù)據(jù)可能有問(wèn)題)
  • 物理備份

6.3.3 mysqldump

  • 官方自帶備份工具 開(kāi)源免費(fèi)
  • 邏輯備份(速度慢)

6.3.4 mysqlbackup

  • mysql 官方備份工具
  • innodb 引擎的表mysqlbackup可以進(jìn)行熱備
  • 非innodb表mysqlbackup就只能溫備
  • 物理備份,備份還原速度快
  • 適合大規(guī)模數(shù)據(jù)使用

6.4 備份數(shù)據(jù)庫(kù)

語(yǔ)法:*mysqldump -h 主機(jī) -P 端口 -u 用戶名 -p 密碼 --databases 數(shù)據(jù)庫(kù) > 文件名.sql*

mysqldump命令參數(shù)

|

參數(shù)

|

描述

|

備注

|
|

-h

|

目標(biāo)主機(jī)

|

可選參數(shù)

|
|

-P

|

端口

|

可選參數(shù),默認(rèn)3306

|
|

-u

|

用戶名

| |
|

-p

|

密碼

| |
|

-database

|

指定單個(gè)數(shù)據(jù)庫(kù)

|

高版本可能會(huì)廢棄,使用databases替代

|
|

--databases

|

指定多個(gè)數(shù)據(jù)庫(kù)

|

導(dǎo)出SQL文件支持庫(kù)操作語(yǔ)法,多個(gè)庫(kù)之間使用空格分隔

|
|

--socket

|

mysql.sock路徑

|

執(zhí)行命令提示sock錯(cuò)誤時(shí),通過(guò)netstat命令獲取mysql.sock路徑

|
|

--add-drop-table

|

表操作語(yǔ)法

|

可省略,使用--databases參數(shù)即可

|
|

|

備份文件

|

指定備份文件路勁及文件名

|

6.4.1 普通備份

導(dǎo)出可執(zhí)行SQL腳本文件

<pre data-language="sql" id="EoN02" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">mysqldump -uroot -proot --databases db_test > db_back.sql</pre>

6.4.2 壓縮備份

導(dǎo)出GZIP壓縮格式SQL腳本文件

<pre data-language="sql" id="re4WH" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">mysqldump -uroot -proot --databases db_test | gzip > db_back.sql.gz</pre>

6.4.3 多庫(kù)備份

多個(gè)庫(kù)腳本導(dǎo)出到一個(gè)SQL文件,多個(gè)庫(kù)之間使用空格分隔

<pre data-language="sql" id="wGb00" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">mysqldump -uroot -proot --databases db_test db_test1 > db_back.sql</pre>

6.4.4 多表備份

備份數(shù)據(jù)庫(kù)中的指定表,多個(gè)表之間使用空格分隔

<pre data-language="sql" id="UL8E4" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">mysqldump -uroot -proot db_test tb_user tb_admin > back_user_admin.sql</pre>

6.4.5 備份所有庫(kù)

備份服務(wù)器上所有數(shù)據(jù)庫(kù)

<pre data-language="sql" id="T8v8e" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">mysqldump -uroot -proot --all-databases > db_back.sql</pre>

6.4.6 備份表結(jié)構(gòu)

僅備份表結(jié)構(gòu),不備份數(shù)據(jù)

<pre data-language="sql" id="GtUIK" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">mysqldump -uroot -proot --no-data --databases db_test > db_back.sql</pre>

6.5 還原數(shù)據(jù)庫(kù)

語(yǔ)法:*mysql -h 主機(jī) -P 端口 -u 用戶名 -p 密碼 數(shù)據(jù)庫(kù)名稱 < SQL文件*

6.5.1 普通還原

還原原備份SQL文件,如果數(shù)據(jù)庫(kù)不存在需要先創(chuàng)建

<pre data-language="sql" id="Uw67o" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">mysql -uroot -proot db_test < db_back.sql</pre>

6.5.2 數(shù)據(jù)庫(kù)還原

使用source命令還原數(shù)據(jù)庫(kù),不需要先創(chuàng)建數(shù)據(jù)庫(kù),首先使用mysql命令登陸mysql,然后執(zhí)行source命令還原數(shù)據(jù)庫(kù)

<pre data-language="sql" id="p7rjo" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">source /home/data/db_back.sql</pre>

6.5.3 GZIP還原

還原GZIP壓縮SQL文件,如果數(shù)據(jù)庫(kù)不存在需要先創(chuàng)建

<pre data-language="sql" id="Dtt9o" class="ne-codeblock language-sql" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">gunzip < db_back.sql.gz | mysql -uroot -proot db_test</pre>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容