數(shù)據(jù)庫(kù)(MySQL) 入門實(shí)踐

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

存放數(shù)據(jù)的倉(cāng)庫(kù)菠发。例如你的賬號(hào)信息强窖,訂單記錄等。

2 SQL

Structured Query Language肠槽,用于訪問(wèn)和處理關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)的計(jì)算機(jī)語(yǔ)言。

按照功能又可分為四大類奢啥;

  1. DQL

    查詢語(yǔ)言秸仙,基本語(yǔ)句 SELECT;

  2. DML

    操縱語(yǔ)言扫尺,主要有三種形式筋栋,INSERT、UPDATE 和 DELETE正驻;

  3. DDL

    定義語(yǔ)言,創(chuàng)建表抢腐、視圖姑曙、索引等,CREATE TABLE迈倍;

  4. DCL

    控制語(yǔ)言伤靠,用來(lái)授權(quán)或回收某種特權(quán),基本形式有 GRANT啼染、 COMMIT 和 ROLLBACK宴合;

3 NoSQL

Not Only SQL,泛指非關(guān)系型的數(shù)據(jù)庫(kù)迹鹅,通常以鍵值對(duì)或者文檔形式存儲(chǔ)卦洽。例如 Redis、MongoDB斜棚。

關(guān)系型數(shù)據(jù)庫(kù)(MySQL)能通過(guò)外鍵建立表之間的聯(lián)系阀蒂,且相比 NoSQL 而言该窗,還具備 ACID 特性。

但 NoSQL 操作無(wú)須 SQL 解析蚤霞,讀寫性能較高酗失,相比關(guān)系型數(shù)據(jù)庫(kù)來(lái)說(shuō),不用預(yù)設(shè)存儲(chǔ)結(jié)構(gòu)昧绣,且天然支持分布式存儲(chǔ)规肴。

4 范式

數(shù)據(jù)庫(kù)滿足一定要求的條件稱為數(shù)據(jù)庫(kù)范式。又能根據(jù)程度的不同夜畴,簡(jiǎn)稱為第 N 范式奏纪。

  1. 第一范式 1NF

    所有屬性不可再分,例如屬性 product 就不能分為 title 和 price斩启,可以單獨(dú)設(shè)置兩個(gè)屬性 productTitle序调、productPrice;

  2. 第二范式 2NF

    每張表都有一個(gè)屬性作為唯一標(biāo)識(shí)兔簇,其他屬性完全依賴該標(biāo)識(shí)发绢,例如自增主鍵ID;

  3. 第三范式 3NF

    所有的非主屬性不依賴于其他的非主屬性垄琐。例如訂單表中可以關(guān)聯(lián)商品ID边酒,但不應(yīng)該關(guān)聯(lián)商品非主屬性 title 和 price 等;

為了提高查詢效率狸窘,通常會(huì)添加冗余字段墩朦,這也就違背了 3NF,也稱之為反三范式翻擒。

5 MySQL

MySQL 是一個(gè) Oracle 旗下的關(guān)系型數(shù)據(jù)庫(kù)氓涣,使用 SQL 語(yǔ)言進(jìn)行增刪改查操作。

開源免費(fèi)陋气,性能也比較好劳吠,和 PHP、Java 等 Web 開發(fā)語(yǔ)言完美配合巩趁,在中小型企業(yè)應(yīng)用非常廣泛痒玩。

后續(xù)內(nèi)容都是基于 MySQL 數(shù)據(jù)庫(kù)的前提下。

6 存儲(chǔ)引擎

常見的有 MyISAM 和 InnoDB 引擎议慰;

引擎 默認(rèn)版本 外鍵 鎖粒度 count(*) 事務(wù)
MyISAM < 5.5 不支持 表鎖 變量存儲(chǔ) 不支持
InnoDB >= 5.5 支持 行鎖 全表掃描 支持

7 事務(wù)

一條或多條 SQL 組成一個(gè)事務(wù)(transaction)蠢古,具備 ACID 四個(gè)特性;

  1. Atomicity 原子性

    一個(gè)事務(wù)內(nèi)的所有操作别凹,要么全部完成草讶,要么全部失敗番川;

  2. Consistency 一致性

    事務(wù)開始前后結(jié)束后不會(huì)破壞數(shù)據(jù)庫(kù)的完整性到涂,也就是說(shuō)寫入或修改的結(jié)構(gòu)需要符合預(yù)設(shè)的規(guī)則脊框;

  3. Isolation 隔離性

    防止事務(wù)交叉執(zhí)行時(shí)導(dǎo)致數(shù)據(jù)的不一致。根據(jù)隔離程度分為 read uncommitted践啄、read committed浇雹、repeatable read 和 serializable;

  4. Durability 持久性

    事務(wù)結(jié)束后屿讽,對(duì)數(shù)據(jù)的修改是永久的昭灵;

事務(wù)交叉執(zhí)行可能會(huì)造成“臟讀”、“幻讀” 和 “不可重復(fù)讀”伐谈;

  • 臟讀

    一個(gè)事務(wù)讀取到另外一個(gè)事務(wù)還未提交的數(shù)據(jù)烂完;

  • 不可重復(fù)讀

    一個(gè)事務(wù)內(nèi),多次讀取同一數(shù)據(jù)返回結(jié)果不同诵棵;由于在此期間在數(shù)據(jù)被其他事務(wù)修改并已提交抠蚣;

  • 幻讀

    一個(gè)事務(wù)內(nèi),多次讀取履澳,返回不存在的記錄嘶窄;由于在此期間有其他事務(wù)寫入數(shù)據(jù);

read uncommitted read committed repeatable read serializable
臟讀 × × ×
不可重復(fù)讀 × ×
幻讀 ×

8 索引

數(shù)據(jù)庫(kù)的“目錄”距贷,在數(shù)據(jù)量較大的情況下柄冲,可以極大地提高查詢效率。

常見的索引數(shù)據(jù)結(jié)構(gòu)有 B+ 樹忠蝗、Hash现横。以最常用的 B+ 樹為例;

image

按照 B+ 樹存儲(chǔ)方式可以把索引分為兩大類阁最;

  1. 聚簇索引戒祠;

    葉子節(jié)點(diǎn)存放了一整行的信息;

  2. 非聚簇索引闽撤;

    葉子節(jié)點(diǎn)存放的是對(duì)應(yīng)那行數(shù)據(jù)的主鍵得哆,和該索引的值;

為什么是 B+ 樹哟旗?

  1. 磁盤代價(jià)低;
  2. 查詢更加穩(wěn)定栋操;
  3. 便于遍歷闸餐;
  4. 支持范圍查詢;

一張結(jié)構(gòu)為 id矾芙,groupId舍沙,name 的 t_user 表,id 為主鍵(聚簇索引)剔宪,groupId 為普通索引(非聚簇索引)拂铡。

select name from t_user where groupId = 123;

先在葉子節(jié)點(diǎn)上得到對(duì)應(yīng)的主鍵 id壹无,然后再根據(jù)主鍵 id 得到 name 的值,這種行為稱之為回表感帅。

select groupId from t_user where groupId = 123;

直接在葉子節(jié)點(diǎn)上就能得到 groupId 的值斗锭,不用回表操作,這種索引也被稱為覆蓋索引失球。

按照功能類型又可以把索引分為三大類岖是;

  1. 普通索引;

    最基本的索引類型实苞,沒有限制條件豺撑;

  2. 唯一索引;

    保證索引字段的值唯一黔牵,允許有 NULL聪轿;主鍵是一種特殊的唯一索引,不允許有 NULL猾浦;

  3. 聯(lián)合索引陆错;

    多個(gè)字段組成一個(gè)索引,具有“最左前綴”的原則跃巡;

什么是最左前綴危号?

a、b素邪、c 三個(gè)字段組成聯(lián)合索引外莲,那么生效的列為 a、ab兔朦、abc偷线、ac。(等值判斷時(shí)順序可交換沽甥,范圍查詢時(shí)會(huì)停止匹配)

9 鎖

宏觀來(lái)看声邦,鎖分為兩種;行鎖可歸納為兩類摆舟;

  1. 共享鎖(S)

    share亥曹,又稱為讀鎖,已有 S 鎖恨诱,可以加其他 S 鎖媳瞪,但不能加 X 鎖;

  2. 排他鎖(X)

    exclusive照宝,又稱為寫鎖蛇受,X 與其他任何鎖互斥;

InnoDB 是通過(guò)給索引項(xiàng)加鎖實(shí)現(xiàn)的行鎖厕鹃,可分為三種類型兢仰;

  1. record lock

    行級(jí)鎖乍丈,鎖定對(duì)應(yīng)索引項(xiàng)骚勘;

  2. gap lock

    間隙鎖庶橱,鎖定索引項(xiàng)之間的間隙,左開右閉被饿;

  3. next-key lock

    前兩種的結(jié)合秸弛;

如果不通過(guò)索引項(xiàng)檢索數(shù)據(jù)铭若,會(huì)鎖住整個(gè)表。

InnoDB 加鎖方法:

  • 對(duì)于 UPDATE递览、DELETE叼屠、INSERT 自動(dòng)加 X 鎖;
  • 對(duì)于普通 SELECT 不會(huì)加任何鎖绞铃;
  • SELECT ... LOCK IN SHARE MODE 顯示加 S 鎖镜雨;
  • SELECT ... FOR UPDATE 顯示加 X 鎖;

查詢當(dāng)前數(shù)據(jù)庫(kù)鎖狀態(tài)儿捧;

select * from information_schema.innodb_locks;

對(duì)于不同類型的索引荚坞,加鎖的方式也不一樣;

  1. 普通索引

    加 next-key lock菲盾;

  2. 唯一索引

    加 record lock颓影;

由于普通索引葉子節(jié)點(diǎn)存儲(chǔ)了主鍵,所以加鎖的字段是:普通索引 + 主鍵索引懒鉴;

假設(shè)有如下數(shù)據(jù)表 t_ lock诡挂,其中 id 為主鍵,xid 為 普通索引临谱;

+-----+----+
| xid | id |
+-----+----+
|   1 | 10 |
|   3 | 20 |
|   5 | 30 |
|   8 | 40 |
|  11 | 50 |
+-----+----+

給 (8, 40) 這條記錄加 X 鎖璃俗;

select * from t_lock where xid = 8 for update;

那么根據(jù) next-key lock 的定義,鎖住區(qū)間為 (5, 30) 到 (8, 40)悉默,(8, 40) 到 (11, 50) 這兩個(gè)區(qū)間城豁;

便于理解我會(huì)合并為一個(gè)區(qū)間 (5, 30) 到 (11, 50)。

按照所以排序規(guī)則抄课,假設(shè)另插入 (xid, id) 記錄唱星,那么總是滿足以下條件;

  1. xid < 5跟磨;id 無(wú)限制魏颓;(正常)
  2. xid = 5;id < 30吱晒;(正常)
  3. xid = 5;id > 30沦童;(阻塞)
  4. xid > 5 && xid < 11仑濒;id 無(wú)限制叹话;(阻塞)
  5. xid = 11;id < 50墩瞳;(阻塞)
  6. xid = 11驼壶;id > 50;(正常)
  7. xid > 11喉酌;id 無(wú)限制热凹;(正常)

簡(jiǎn)單圖示,當(dāng)插入的數(shù)據(jù)落在這個(gè)區(qū)間則會(huì)阻塞泪电,反之亦然般妙;

image

10 RR 幻讀

上面事務(wù)章節(jié)描述 RR 會(huì)導(dǎo)致幻讀,MySQL 在 RR 下通過(guò)如下兩點(diǎn)規(guī)避掉了相速;

  1. MVCC

    Multi-Version Concurrency Control碟渺,多版本并發(fā)控制。在普通 SELECT (快照度)時(shí)引入版本突诬,同一個(gè)事務(wù)中只能讀取不大于當(dāng)前版本的數(shù)據(jù)快照苫拍;

  2. next-key lock

    需要加 X 鎖的操作(當(dāng)前讀),加 next-key lock 可以有效避免產(chǎn)生幻讀旺隙;

11 SQL 執(zhí)行順序

根據(jù)創(chuàng)建時(shí)間升序绒极,查找支付成功超過(guò) 3 單的用戶,需要去重蔬捷;

select distinct t1.nickname
from t1 inner join t2
on t1.uid = t2.uid
where t2.pay_time > 0
group by t1.uid, t1.nickname
having count(*) > 3
order by t2.create_time
limit 10
  1. from
  2. on
  3. join
  4. where
  5. group
  6. having
  7. order
  8. select
  9. distinct
  10. limit

12 binlog

binlog 是 MySQL 最重要的日志垄提,記錄了所有的 DDL 和 DML 語(yǔ)句,主要目的是抠刺;

  1. 主從復(fù)制塔淤;

    在 Master 開啟 binlog,并傳遞到 Slave 節(jié)點(diǎn)來(lái)達(dá)到 Master-Slave 數(shù)據(jù)一致性速妖;

  2. 數(shù)據(jù)恢復(fù)高蜂;

    通過(guò) mysqlbinlog 恢復(fù)數(shù)據(jù);

image

檢查 binlog 是否開啟罕容;

show variables like 'log_bin';

編輯 mysql 配置文件/etc/mysql/mysql.conf.d/mysqld.cnf备恤,開啟 binlog 功能;

[mysqld]
server-id=1
log-bin=/var/lib/mysql/mysql-bin

常用幾個(gè)命令锦秒;

  • show master status;
  • show binary logs;
  • mysqlbinlog -v --start-position 2755 --stop-position 3076 mysql-bin.000003露泊;

例如誤刪除了某條記錄;

  1. 通過(guò) mysqlbinlog 定位到誤操作的 position旅择;
  2. 通過(guò) mysqlbinlog 定位到誤刪之前最早入庫(kù)的 position惭笑;
  3. 截取中間 binlog 日志, echo > db.sql 輸出到可執(zhí)行 SQL 文件中;
  4. 執(zhí)行恢復(fù)數(shù)據(jù)即可沉噩;

可直接流式執(zhí)行:mysqlbinlog -v --start-position 2432 --stop-position 2533 mysql-bin.000003 | mysql -uroot -p

mysqldump 是用來(lái)備份數(shù)據(jù)庫(kù)的捺宗,例如備份 db_test 數(shù)據(jù)庫(kù);

mysqldump -h127.0.0.1 -uroot -p123456 db_test > db.sql

13 性能優(yōu)化

  1. 索引川蒙;

    給經(jīng)常用作查詢條件蚜厉,且區(qū)分度較高的字段建立索引;

  2. 分頁(yè)查詢畜眨;

    where id > {lastId} order by id limit{size}昼牛,提高大表分頁(yè)效率;

  3. 批量操作康聂;

    批量插入用 insert into xxx values (xxx...), (xxx...)贰健,批量更新用 case when id;

  4. not null早抠;

    null 會(huì)額外占用空間霎烙,且 count(xxx) 不會(huì)參與統(tǒng)計(jì),若是索引列 is not null 也會(huì)失效蕊连;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悬垃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子甘苍,更是在濱河造成了極大的恐慌尝蠕,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件载庭,死亡現(xiàn)場(chǎng)離奇詭異看彼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)囚聚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門靖榕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人顽铸,你說(shuō)我怎么就攤上這事茁计。” “怎么了谓松?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵星压,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鬼譬,道長(zhǎng)娜膘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任优质,我火速辦了婚禮竣贪,結(jié)果婚禮上军洼,老公的妹妹穿的比我還像新娘。我一直安慰自己贾富,他們只是感情好歉眷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颤枪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淑际。 梳的紋絲不亂的頭發(fā)上畏纲,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音春缕,去河邊找鬼盗胀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锄贼,可吹牛的內(nèi)容都是我干的票灰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宅荤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屑迂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起冯键,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惹盼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后惫确,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體手报,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年改化,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掩蛤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陈肛,死狀恐怖揍鸟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情燥爷,我是刑警寧澤蜈亩,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站前翎,受9級(jí)特大地震影響稚配,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜港华,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一道川、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦冒萄、人聲如沸臊岸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帅戒。三九已至,卻和暖如春崖技,著一層夾襖步出監(jiān)牢的瞬間逻住,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工迎献, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞎访,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓吁恍,卻偏偏與公主長(zhǎng)得像扒秸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冀瓦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容