數(shù)據(jù)庫(kù)
-
SQL語(yǔ)句
- DDL語(yǔ)句
- 關(guān)鍵字——CREATE耍休、ALTER刃永、DROP、TRUNCATE等
- 使用——DDL主要定義或改變表的結(jié)構(gòu)羊精,表之間的鏈接和約束等斯够,在建表實(shí)使用
- DML語(yǔ)句
- 關(guān)鍵字——SELECT、UPDATE喧锦、INSERT读规、DELETE
- 使用——用來(lái)對(duì)數(shù)據(jù)庫(kù)里的數(shù)據(jù)進(jìn)行操作的語(yǔ)言
- DCL語(yǔ)句
- 關(guān)鍵字——GRANT、REVOKE等
- 使用——用來(lái)設(shè)置或更改數(shù)據(jù)庫(kù)用戶或角色權(quán)限的語(yǔ)句
- DDL語(yǔ)句
-
范式
- 作用——減少冗余
- 第一范式——要滿足屬性不可拆分
- 第二范式——消除非主屬性對(duì)主屬性的部分依賴
- 第三范式——要求一個(gè)關(guān)系中不包含已在其它關(guān)系已包含的非主關(guān)鍵字信息
- BCNF范式——在3NF基礎(chǔ)上消除對(duì)主碼子集的依賴
- 反范式——沒(méi)有冗余的數(shù)據(jù)庫(kù)未必是最好的數(shù)據(jù)庫(kù)燃少,有時(shí)為了提高運(yùn)行效率和性能束亏,低范式標(biāo)準(zhǔn),適當(dāng)保留冗余數(shù)據(jù)
-
主鍵外鍵
- 主鍵——表的一個(gè)特殊字段阵具。該字段能惟一地標(biāo)識(shí)該表中的每條信息碍遍;可以沒(méi)有主鍵,有主鍵不能為空阳液;
- 外鍵——特殊字段怕敬。字段sno是一個(gè)表A的屬性,且依賴于表B的主鍵帘皿;外鍵必須依賴于已存在表的主鍵东跪;可以為空值
-
索引
- 創(chuàng)建刪除索引
- 創(chuàng)建索引——ALTER TABLE table_name ADD INDEX idx_1(code);
- 刪除索引——DROP INDEX idx_1 ON table_name ;
- 定義——索引由數(shù)據(jù)庫(kù)表中一列或多列組合而成,其作用是提高對(duì)表中數(shù)據(jù)的查詢速度鹰溜;
- 缺點(diǎn)——索引不是萬(wàn)能的虽填!會(huì)使數(shù)據(jù)修改操作變慢,占用相當(dāng)大的空間奉狈,使用索引有限制
- 優(yōu)點(diǎn)——索引可以加快數(shù)據(jù)檢索操作
- mysql中主鍵(primary key)和唯一鍵(unique)區(qū)別
- 主鍵索引——保證唯一性,不允許為空,一個(gè)表中至多一個(gè)
- 唯一索引——保證唯一性,允許一個(gè)空值,可以有多個(gè)
- mysql指定索引 from tables force 索引名
- 創(chuàng)建刪除索引
-
事務(wù)
- 概念:事務(wù)是應(yīng)用程序中一系列嚴(yán)密的操作卤唉,所有操作必須成功完成,否則在每個(gè)操作中所作的所有更改都會(huì)被撤消
- 特性
- 原子性:整個(gè)事務(wù)中的所有操作仁期,要么全部完成桑驱,要么全部不完成启盛,不可能停滯在中間某個(gè)環(huán)節(jié)届案。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,會(huì)被回滾(Rollback)到事務(wù)開(kāi)始前的狀態(tài),就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣
- 一致性:在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后供璧,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞
- 隔離性:隔離狀態(tài)執(zhí)行事務(wù),使它們好像是系統(tǒng)在給定時(shí)間內(nèi)執(zhí)行的唯一操作敢辩。
- 持久性:在事務(wù)完成以后尿背,該事務(wù)所對(duì)數(shù)據(jù)庫(kù)所作的更改便持久的保存在數(shù)據(jù)庫(kù)之中,并不會(huì)被回滾
-
mysql
-
常用語(yǔ)句
- 數(shù)據(jù)導(dǎo)出
- sql導(dǎo)出:SELECT * FROM new_product INTO OUTFILE 'D:/Program Files (x86)/export_data/new_product.sql' fields terminated by '|' ;
- 查看數(shù)據(jù)庫(kù)版本——select version() from dual;
- mysql8.0之后支持row_numer——ROW_NUMBER() over(PARTITION by dynastyid ) rn
- 數(shù)據(jù)導(dǎo)出
-
啟動(dòng)關(guān)閉連接數(shù)據(jù)庫(kù)
- 啟動(dòng) mysql 服務(wù):service mysqld start
- 查看mysqld 狀態(tài):mysqld status
- 關(guān)閉mysql服務(wù):service mysql stop
- 重啟mysql服務(wù):service restart stop
- 連接數(shù)據(jù)庫(kù):mysql -u root -p pwd
-
函數(shù)
- GROUP_CONCAT()函數(shù)——group by 的聚合函數(shù)橡伞,將group by產(chǎn)生的同一個(gè)分組中的值連接起來(lái)盒揉,返回一個(gè)字符串結(jié)果,可以指定分隔符
- IF(expr,v1,v2)函數(shù)——if判斷類似3目運(yùn)算符兑徘,expr表達(dá)式正確返回v1,錯(cuò)誤返回v2
- IFNULL(v1,v2)函數(shù)——空值轉(zhuǎn)換函數(shù)
-
DELETE與TRUNCATE的區(qū)別
- DELETE是可以帶WHERE的刚盈,所以支持條件刪除;而TRUNCATE只能刪除整個(gè)表;
- DELETE是DML挂脑,操作時(shí)原數(shù)據(jù)會(huì)被放到 rollback segment中藕漱,可以被回滾;而TRUNCATE是DDL崭闲,操作時(shí)不會(huì)進(jìn)行存儲(chǔ)肋联,不能進(jìn)行回滾;
- 在數(shù)據(jù)量比較小的情況下,DELETE和TRUNCATE的清理速度差別不是很大刁俭。但是數(shù)據(jù)量很大的時(shí)候TRUNCATE優(yōu)勢(shì)大
-
索引
- MERGE:當(dāng)使用視圖時(shí)橄仍,會(huì)把查詢視圖的語(yǔ)句和創(chuàng)建視圖的語(yǔ)句合并起來(lái),形成一條語(yǔ)句薄翅,最后再?gòu)幕碇胁樵?
- 視圖中存在
- 匯總函數(shù)或窗口函數(shù)(SUM()沙兰、MIN()、MAX()翘魄、COUNT()等)
- DISTINCT
- GROUP BY
- HAVING
- LIMIT
- UNION或UNION ALL等不會(huì)使用索引
- TEMPTABLE:當(dāng)使用視圖時(shí)鼎天,會(huì)把創(chuàng)建視圖的語(yǔ)句的查詢結(jié)果當(dāng)成一張臨時(shí)表,再?gòu)呐R時(shí)表中進(jìn)行篩選
- UNDEFINED:未定義暑竟,自動(dòng)斋射,讓系統(tǒng)幫你選
- MERGE:當(dāng)使用視圖時(shí)橄仍,會(huì)把查詢視圖的語(yǔ)句和創(chuàng)建視圖的語(yǔ)句合并起來(lái),形成一條語(yǔ)句薄翅,最后再?gòu)幕碇胁樵?
-
sql優(yōu)化
- 索引優(yōu)化
- 索引使用情況
- 配置全值,對(duì)索引中索引列都指定具體值;
- 配置值得范圍,對(duì)索引的值能夠進(jìn)行范圍查找;
- 匹配最左前綴,僅僅使用索中的最左邊列進(jìn)行查找,如col1+col2+col3的聯(lián)合索引,能被包含col1、(col1+col2)但荤、(col1+col2+col3)的等值查詢利用到
- 僅對(duì)索引查詢,當(dāng)查詢的列都在索引字段中時(shí),查詢效率更高;
- 不能使用索引的情況
- 以%開(kāi)頭的like查詢不能使用B-Tree索引
- 數(shù)據(jù)類型出現(xiàn)隱式轉(zhuǎn)換時(shí)不能使用索引
- 復(fù)合索引使用需滿足最左原則
- 如果mysql估計(jì)使用索引比全表掃描慢,則不在使用索引
- 用or分割開(kāi)的條件
- 索引使用情況
- sql語(yǔ)句優(yōu)化
- 執(zhí)行計(jì)劃
- 語(yǔ)句——EXPLAIN SELECT語(yǔ)句
- id:選擇標(biāo)識(shí)符——id值越大優(yōu)先級(jí)越高罗岖,越先被執(zhí)行;id相同時(shí),執(zhí)行順序由上至下
- select_type:表示查詢的類型
- SIMPLE(簡(jiǎn)單SELECT腹躁,不使用UNION或子查詢等)
- PRIMARY(子查詢中最外層查詢桑包,查詢中若包含任何復(fù)雜的子部分,最外層的select被標(biāo)記為PRIMARY)
- UNION(UNION中的第二個(gè)或后面的SELECT語(yǔ)句)
- DEPENDENT UNION(UNION中的第二個(gè)或后面的SELECT語(yǔ)句纺非,取決于外面的查詢)
- UNION RESULT(UNION的結(jié)果哑了,union語(yǔ)句中第二個(gè)select開(kāi)始后面所有select)
- SUBQUERY(子查詢中的第一個(gè)SELECT赘方,結(jié)果不依賴于外部查詢)
- DEPENDENT SUBQUERY(子查詢中的第一個(gè)SELECT,依賴于外部查詢)
- DERIVED(派生表的SELECT, FROM子句的子查詢)
- UNCACHEABLE SUBQUERY(一個(gè)子查詢的結(jié)果不能被緩存弱左,必須重新評(píng)估外鏈接的第一行)
- table:輸出結(jié)果集的表
- partitions:匹配的分區(qū)
- type:表示表的連接類型——ALL窄陡、index、range拆火、 ref跳夭、eq_ref、const们镜、system币叹、NULL(從左到右,性能從差到好)
- possible_keys:表示查詢時(shí)模狭,可能使用的索引
- key:表示實(shí)際使用的索引
- key_len:索引字段的長(zhǎng)度——不損失精確性的情況下套硼,長(zhǎng)度越短越好
- ref:列與索引的比較
- rows:掃描出的行數(shù)——估算出結(jié)果集行數(shù),表示MySQL根據(jù)表統(tǒng)計(jì)信息及索引選用情況胞皱,估算讀取的行數(shù)
- filtered:按表?xiàng)l件過(guò)濾的行百分比
- Extra:執(zhí)行情況的描述和說(shuō)明
- Range checked for each record (index map: 0x4) (匹配字段類型,編碼不相符等)
- MySQL發(fā)現(xiàn)沒(méi)有使用好的索引九妈,但是發(fā)現(xiàn)在前面的表的列值已知之后反砌,可能會(huì)使用一些索引。 對(duì)于上表中的每一行組合萌朱,MySQL檢查是否可以使用range或index_merge訪問(wèn)方法來(lái)檢索行宴树。
- https://www.cnblogs.com/MYSQLZOUQI/articles/3837828.html
- converting HEAP to ondisk
- 該線程正在將內(nèi)部臨時(shí)表從 MEMORY 表轉(zhuǎn)換為磁盤表
- Using join buffer (Block Nested Loop),
- Using join buffer (Batched Key Access)
- Block Nested-Loop Join算法:將外層循環(huán)的行/結(jié)果集存入join buffer, 內(nèi)層循環(huán)的每一行與整個(gè)buffer中的記錄做比較,從而減少內(nèi)層循環(huán)的次數(shù)晶疼。優(yōu)化器管理參數(shù)optimizer_switch中中的block_nested_loop參數(shù)控制著B(niǎo)NL是否被用于優(yōu)化器酒贬。默認(rèn)條件下是開(kāi)啟,若果設(shè)置為off翠霍,優(yōu)化器在選擇 join方式的時(shí)候會(huì)選擇NLJ(Nested Loop Join)算法锭吨。
- Batched Key Access原理:對(duì)于多表join語(yǔ)句,當(dāng)MySQL使用索引訪問(wèn)第二個(gè)join表的時(shí)候寒匙,使用一個(gè)join buffer來(lái)收集第一個(gè)操作對(duì)象生成的相關(guān)列值零如。BKA構(gòu)建好key后,批量傳給引擎層做索引查找锄弱。key是通過(guò)MRR接口提交給引擎的(mrr目的是較為順序)MRR使得查詢更有效率考蕾,要使用BKA,必須調(diào)整系統(tǒng)參數(shù)optimizer_switch的值会宪,batched_key_access設(shè)置為on肖卧,因?yàn)锽KA使用了MRR,因此也要打開(kāi)MRR (參考http://www.cnblogs.com/chenpingzhao/p/6720531.html)
- 執(zhí)行計(jì)劃
- 索引優(yōu)化
-
表優(yōu)化
- 分析表 ANALYZE
- 檢查表 check
- 優(yōu)化表 OPTIMIZE——通過(guò)可以消除刪除和更新造成的磁盤碎片掸鹅,從而減少空間的浪費(fèi) 只讀鎖
-
查看和中止sql
- 查看正在運(yùn)行的sql select * from information_schema.PROCESSLIST where info is not null;
- 中止正在運(yùn)行的sql kill process_id;
-
慢查詢?nèi)罩?/h3>
- 查詢是否開(kāi)啟慢查詢?nèi)罩?slow_query_log)——語(yǔ)句:show variables like "%slow%;
- 開(kāi)啟慢查詢?nèi)罩尽Z(yǔ)句:set global slow_query_log = on
- 查詢慢查詢閾值(long_query_time)——語(yǔ)句:show variables like "%long%;
- 修改慢查詢閾值——語(yǔ)句:set global long_query_time = 5
-
存儲(chǔ)引擎
- 查看存儲(chǔ)引擎
- 查看所有支持的 engine:show engines;
- 查看當(dāng)前庫(kù)的 engine:show variables like '%engine%;
- innodb
- 最常用塞帐,支持事務(wù)拦赠、回滾、自增壁榕、外鍵
- 表結(jié)構(gòu)存在.frm 文件中
- 數(shù)據(jù)和索引存在表空間中矛紫,聚集索引方式方式
- 讀寫效率稍差,占用空間大
- myisam
- 表結(jié)構(gòu)存在.frm 文件中
- .myd 存儲(chǔ)數(shù)據(jù), .myi 存儲(chǔ)索引牌里,采用非聚集索引方式
- 快速颊咬,占空間小,不支持事務(wù)和并發(fā)
- mysql索引底層數(shù)據(jù)結(jié)構(gòu)采用B+樹(shù)
- hash很快牡辽,但每次IO只能取一個(gè)數(shù)
- AVL和紅黑樹(shù)喳篇,在大量數(shù)據(jù)的情況下,IO操作還是太多
- B樹(shù)每個(gè)節(jié)點(diǎn)內(nèi)存儲(chǔ)的是數(shù)據(jù)态辛,因此每個(gè)節(jié)點(diǎn)存儲(chǔ)的分支太少
- B+節(jié)點(diǎn)存儲(chǔ)的是索引+指針(引用指向下一個(gè)節(jié)點(diǎn))麸澜,可以存儲(chǔ)大量索引,同時(shí)最終數(shù)據(jù)存儲(chǔ)在葉子節(jié)點(diǎn)奏黑,并且有引用橫向鏈接炊邦,可以在2-3次的IO操作內(nèi)完成千萬(wàn)級(jí)別的表操作。
- 建議索引是是自增長(zhǎng)數(shù)字熟史,這樣適合范圍查找
- mysql回表
- 主鍵索引——InnoDB 是聚集索引方式馁害,因此數(shù)據(jù)和索引都存儲(chǔ)在同一個(gè)文件里。首先 InnoDB 會(huì)根據(jù)主鍵 ID 作為 KEY 建立索引 B+樹(shù)蹂匹,B+樹(shù)的葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵 ID 對(duì)應(yīng)的數(shù)據(jù)
- 非主鍵索引——葉子節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)的是主鍵 KEY碘菜。拿到主鍵 KEY 后,InnoDB 才會(huì)去主鍵索引樹(shù)里根據(jù)剛在 非主鍵索引樹(shù)找到的主鍵 KEY 查找到對(duì)應(yīng)的數(shù)據(jù)限寞。
- 查看存儲(chǔ)引擎
-
分表分區(qū)
- 分區(qū)
- 概念:是把一個(gè)數(shù)據(jù)表的文件和索引分散存儲(chǔ)在不同的物理文件中
- 分區(qū)類型
- RANGE分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值忍啸,把多行分配給分區(qū)
- LIST分區(qū):類似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來(lái)進(jìn)行選擇
- HASH分區(qū):基于用戶定義的表達(dá)式的返回值來(lái)進(jìn)行選擇的分區(qū)履植,該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算计雌。這個(gè)函數(shù)可以包含MySQL 中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式静尼。
- KEY分區(qū):類似于按HASH分區(qū)白粉,區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL服務(wù)器提供其自身的哈希函數(shù)鼠渺。必須有一列或多列包含整數(shù)值鸭巴。
- 原理:mysql通過(guò)分區(qū)把數(shù)據(jù)保存到不同的文件里,同時(shí)索引也是分區(qū)的拦盹。相對(duì)于未分區(qū)的表來(lái)說(shuō)鹃祖,分區(qū)后單獨(dú)的數(shù)據(jù)庫(kù)文件索引文件的大小都明顯降低,效率則明顯的提示了普舆。
- 分區(qū)的限制
- 主鍵或者唯一索引必須包含分區(qū)字段恬口,如primary key (id,username),不過(guò)innoDB的大組建性能不好
- 很多時(shí)候校读,使用分區(qū)就不要在使用主鍵了,否則可能影響性能
- 只能通過(guò)int類型的字段或者返回int類型的表達(dá)式來(lái)分區(qū)祖能,通常使用year或者to_days等函數(shù)(mysql 5.6 對(duì)限制開(kāi)始放開(kāi)了)
- 每個(gè)表最多1024個(gè)分區(qū)歉秫,而且多分區(qū)會(huì)大量消耗內(nèi)存
- 分區(qū)的表不支持外鍵,相關(guān)的邏輯約束需要使用程序來(lái)實(shí)現(xiàn)
- 分區(qū)后养铸,可能會(huì)造成索引失效雁芙,需要驗(yàn)證分區(qū)可行性
- 分表
- 概念:分表和分區(qū)類似,區(qū)別是钞螟,分區(qū)是把一個(gè)邏輯表文件分成幾個(gè)物理文件后進(jìn)行存儲(chǔ)兔甘,而分表則是把原先的一個(gè)表分成幾個(gè)表。進(jìn)行分表查詢時(shí)可以通過(guò)union或者視圖鳞滨。
- 分表規(guī)則
- 水平分割
- 水平分分割最為常用洞焙。水平分割通常是指切分到另外一個(gè)數(shù)據(jù)庫(kù)或表中。
- 水平分割
- 垂直分割
- 把常用拯啦、不常用的字段分開(kāi)放
- 把大字段獨(dú)立存放在一個(gè)表中
- 分區(qū)
-
思維導(dǎo)圖:https://www.processon.com/view/link/607a41256376891132d9c9ec
密碼:4URW