數(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ù)用戶(hù)或角色權(quán)限的語(yǔ)句
- DDL語(yǔ)句
-
范式
- 作用——減少冗余
- 第一范式——要滿(mǎn)足屬性不可拆分
- 第二范式——消除非主屬性對(duì)主屬性的部分依賴(lài)
- 第三范式——要求一個(gè)關(guān)系中不包含已在其它關(guān)系已包含的非主關(guān)鍵字信息
- BCNF范式——在3NF基礎(chǔ)上消除對(duì)主碼子集的依賴(lài)
- 反范式——沒(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的屬性,且依賴(lài)于表B的主鍵;外鍵必須依賴(lài)于已存在表的主鍵;可以為空值
-
索引
- 創(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ù)的查詢(xún)速度;
- 缺點(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判斷類(lèi)似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ì)把查詢(xún)視圖的語(yǔ)句和創(chuàng)建視圖的語(yǔ)句合并起來(lái),形成一條語(yǔ)句,最后再?gòu)幕碇胁樵?xún)
- 視圖中存在
- 匯總函數(shù)或窗口函數(shù)(SUM()、MIN()、MAX()、COUNT()等)
- DISTINCT
- GROUP BY
- HAVING
- LIMIT
- UNION或UNION ALL等不會(huì)使用索引
- TEMPTABLE:當(dāng)使用視圖時(shí),會(huì)把創(chuàng)建視圖的語(yǔ)句的查詢(xún)結(jié)果當(dāng)成一張臨時(shí)表,再?gòu)呐R時(shí)表中進(jìn)行篩選
- UNDEFINED:未定義,自動(dòng),讓系統(tǒng)幫你選
- MERGE:當(dāng)使用視圖時(shí),會(huì)把查詢(xún)視圖的語(yǔ)句和創(chuàng)建視圖的語(yǔ)句合并起來(lái),形成一條語(yǔ)句,最后再?gòu)幕碇胁樵?xún)
-
sql優(yōu)化
- 索引優(yōu)化
- 索引使用情況
- 配置全值,對(duì)索引中索引列都指定具體值;
- 配置值得范圍,對(duì)索引的值能夠進(jìn)行范圍查找;
- 匹配最左前綴,僅僅使用索中的最左邊列進(jìn)行查找,如col1+col2+col3的聯(lián)合索引,能被包含col1、(col1+col2)、(col1+col2+col3)的等值查詢(xún)利用到
- 僅對(duì)索引查詢(xún),當(dāng)查詢(xún)的列都在索引字段中時(shí),查詢(xún)效率更高;
- 不能使用索引的情況
- 以%開(kāi)頭的like查詢(xún)不能使用B-Tree索引
- 數(shù)據(jù)類(lèi)型出現(xiàn)隱式轉(zhuǎn)換時(shí)不能使用索引
- 復(fù)合索引使用需滿(mǎn)足最左原則
- 如果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:表示查詢(xún)的類(lèi)型
- SIMPLE(簡(jiǎn)單SELECT,不使用UNION或子查詢(xún)等)
- PRIMARY(子查詢(xún)中最外層查詢(xún),查詢(xún)中若包含任何復(fù)雜的子部分,最外層的select被標(biāo)記為PRIMARY)
- UNION(UNION中的第二個(gè)或后面的SELECT語(yǔ)句)
- DEPENDENT UNION(UNION中的第二個(gè)或后面的SELECT語(yǔ)句,取決于外面的查詢(xún))
- UNION RESULT(UNION的結(jié)果,union語(yǔ)句中第二個(gè)select開(kāi)始后面所有select)
- SUBQUERY(子查詢(xún)中的第一個(gè)SELECT,結(jié)果不依賴(lài)于外部查詢(xún))
- DEPENDENT SUBQUERY(子查詢(xún)中的第一個(gè)SELECT,依賴(lài)于外部查詢(xún))
- DERIVED(派生表的SELECT, FROM子句的子查詢(xún))
- UNCACHEABLE SUBQUERY(一個(gè)子查詢(xún)的結(jié)果不能被緩存,必須重新評(píng)估外鏈接的第一行)
- table:輸出結(jié)果集的表
- partitions:匹配的分區(qū)
- type:表示表的連接類(lèi)型——ALL、index、range、 ref、eq_ref、const、system、NULL(從左到右,性能從差到好)
- possible_keys:表示查詢(xún)時(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) (匹配字段類(lèi)型,編碼不相符等)
- MySQL發(fā)現(xiàn)沒(méi)有使用好的索引,但是發(fā)現(xiàn)在前面的表的列值已知之后,可能會(huì)使用一些索引。 對(duì)于上表中的每一行組合,MySQL檢查是否可以使用range或index_merge訪(fǎng)問(wèn)方法來(lái)檢索行。
- https://www.cnblogs.com/MYSQLZOUQI/articles/3837828.html
- converting HEAP to ondisk
- 該線(xiàn)程正在將內(nèi)部臨時(shí)表從 MEMORY 表轉(zhuǎn)換為磁盤(pá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使用索引訪(fǎng)問(wèn)第二個(gè)join表的時(shí)候,使用一個(gè)join buffer來(lái)收集第一個(gè)操作對(duì)象生成的相關(guān)列值。BKA構(gòu)建好key后,批量傳給引擎層做索引查找。key是通過(guò)MRR接口提交給引擎的(mrr目的是較為順序)MRR使得查詢(xún)更有效率,要使用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ò)可以消除刪除和更新造成的磁盤(pán)碎片,從而減少空間的浪費(fèi) 只讀鎖
-
查看和中止sql
- 查看正在運(yùn)行的sql select * from information_schema.PROCESSLIST where info is not null;
- 中止正在運(yùn)行的sql kill process_id;
-
慢查詢(xún)?nèi)罩?/h3>
- 查詢(xún)是否開(kāi)啟慢查詢(xún)?nèi)罩?slow_query_log)——語(yǔ)句:show variables like "%slow%;
- 開(kāi)啟慢查詢(xún)?nèi)罩尽Z(yǔ)句:set global slow_query_log = on
- 查詢(xún)慢查詢(xún)閾值(long_query_time)——語(yǔ)句:show variables like "%long%;
- 修改慢查詢(xún)閾值——語(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ù)和索引存在表空間中,聚集索引方式方式
- 讀寫(xiě)效率稍差,占用空間大
- 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ū)類(lèi)型
- RANGE分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)
- LIST分區(qū):類(lèi)似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來(lái)進(jìn)行選擇
- HASH分區(qū):基于用戶(hù)定義的表達(dá)式的返回值來(lái)進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包含MySQL 中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。
- KEY分區(qū):類(lèi)似于按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類(lèi)型的字段或者返回int類(lèi)型的表達(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ū)類(lèi)似,區(qū)別是,分區(qū)是把一個(gè)邏輯表文件分成幾個(gè)物理文件后進(jìn)行存儲(chǔ),而分表則是把原先的一個(gè)表分成幾個(gè)表。進(jìn)行分表查詢(xún)時(shí)可以通過(guò)union或者視圖。
- 分表規(guī)則
- 水平分割
- 水平分分割最為常用。水平分割通常是指切分到另外一個(gè)數(shù)據(jù)庫(kù)或表中。
- 水平分割
- 垂直分割
- 把常用、不常用的字段分開(kāi)放
- 把大字段獨(dú)立存放在一個(gè)表中
- 分區(qū)
-
思維導(dǎo)圖:https://www.processon.com/view/link/607a41256376891132d9c9ec
密碼:4URW