薦藏:MySQL數(shù)據(jù)庫常見面試題總結(jié)
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質(zhì)文章,第一時間送達
1、數(shù)據(jù)庫的常用范式:
第一范式(1NF):指表的列不可再分,數(shù)據(jù)庫中表的每一列都是不可分割的基本數(shù)據(jù)項,同一列中不能有多個值;
第二范式(2NF):在 1NF 的基礎上,還包含兩部分的內(nèi)容:一是表必須有一個主鍵;二是表中非主鍵列必須完全依賴于主鍵,不能只依賴于主鍵的一部分;
第三范式(3NF):在 2NF 的基礎上,消除非主鍵列對主鍵的傳遞依賴,非主鍵列必須直接依賴于主鍵。
BC范式(BCNF):在 3NF 的基礎上,消除主屬性對于碼部分的傳遞依賴
2、SQL語句的執(zhí)行過程:
先說下緩存中數(shù)據(jù)存儲格式:key(sql語句)- value(數(shù)據(jù)值),所以如果SQL語句(key)只要存在一點不同之處就會直接進行數(shù)據(jù)庫查詢了;
由于表中的數(shù)據(jù)不是一成不變的,大多數(shù)是經(jīng)常變化的,而當數(shù)據(jù)庫中的數(shù)據(jù)變化了,那么相應的與此表相關的緩存數(shù)據(jù)就需要移除掉;
(1)首先MySQL執(zhí)行器根據(jù) 執(zhí)行計劃 調(diào)用存儲引擎的API查詢數(shù)據(jù)
(2)存儲引擎先從緩存池buffer pool中查詢數(shù)據(jù),如果沒有就會去磁盤中查詢,如果查詢到了就將其放到緩存池中
(3)在數(shù)據(jù)加載到 Buffer Pool 的同時,會將這條數(shù)據(jù)的原始記錄保存到 undo 日志文件中
(4)innodb 會在 Buffer Pool 中執(zhí)行更新操作
(5)更新后的數(shù)據(jù)會記錄在 redo log buffer 中
(6)提交事務在提交的同時會做以下三件事
(7)(第一件事)將redo log buffer中的數(shù)據(jù)刷入到redo log文件中
(8)(第二件事)將本次操作記錄寫入到 bin log文件中
(9)(第三件事)將bin log文件名字和更新內(nèi)容在 bin log 中的位置記錄到redo log中,同時在 redo log 最后添加 commit 標記
(10)使用一個后臺線程,它會在某個時機將我們Buffer Pool中的更新后的數(shù)據(jù)刷到 MySQL 數(shù)據(jù)庫中,這樣就將內(nèi)存和數(shù)據(jù)庫的數(shù)據(jù)保持統(tǒng)一了
3、常用的存儲引擎?InnoDB與MyISAM的區(qū)別?
① MyISAM:保存有表的總行數(shù),如果使用 select count() from table 會直接取出出該值,不需要進行全表掃描。
② InnoDB:沒有保存表的總行數(shù),如果使用 select count() from table 需要會遍歷整個表,消耗相當大。
① MyISAM會在磁盤上存儲成三個文件:.frm文件存儲表定義,.MYD文件存儲數(shù)據(jù),.MYI文件存儲索引。
② InnoDB:把數(shù)據(jù)和索引存放在表空間里面,所有的表都保存在同一個數(shù)據(jù)文件中,InnoDB表的大小只受限于操作系統(tǒng)文件的大小,一般為2GB。
① MyISAM:可被壓縮,存儲空間較小。支持三種不同的存儲格式:靜態(tài)表(默認,但是注意數(shù)據(jù)末尾不能有空格,會被去掉)、動態(tài)表、壓縮表。
② InnoDB:需要更多的內(nèi)存和存儲,它會在主內(nèi)存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引。
① 如果需要提供回滾、崩潰恢復能力的ACID事務能力,并要求實現(xiàn)行鎖級別并發(fā)控制,InnoDB是一個好的選擇;
② 如果數(shù)據(jù)表主要用來查詢記錄,讀操作遠遠多于寫操作且不需要數(shù)據(jù)庫事務的支持,則MyISAM引擎能提供較高的處理效率;
4、事務的ACID與實現(xiàn)原理?
(1)原子性:事務是一個不可分割的工作單元,事務里的操作要么都成功,要么都失敗,如果事務執(zhí)行失敗,則需要進行回滾。
(2)隔離性:事務的所操作的數(shù)據(jù)在提交之前,對其他事務的可見程度。
(3)持久性:一旦事務提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久的。
(4)一致性:事務不能破壞數(shù)據(jù)的完整性和業(yè)務的一致性。例如在轉(zhuǎn)賬時,不管事務成功還是失敗,雙方錢的總額不變。
讀未提交:允許事務在執(zhí)行過程中,讀取其他事務尚未提交的數(shù)據(jù);
讀已提交:允許事務在執(zhí)行過程中讀取其他事務已經(jīng)提交的數(shù)據(jù);
可重復讀(默認級別):在同一個事務內(nèi),任意時刻的查詢結(jié)果都是一致的;
讀序列化:所有事務逐個依次執(zhí)行,每次讀都需要獲取表級共享鎖,讀寫會相互阻塞。
更新丟失:兩個或多個事務操作相同的數(shù)據(jù),然后基于選定的值更新該行時,由于每個事務都不知道其他事務的存在,就會發(fā)生丟失更新問題:最后的更新覆蓋了其他事務所做的更新。
臟讀:指事務A正在訪問數(shù)據(jù),并且對數(shù)據(jù)進行了修改(事務未提交),這時,事務B也使用這個數(shù)據(jù),后來事務A撤銷回滾,并把修改后的數(shù)據(jù)恢復原值,B讀到的數(shù)據(jù)就與數(shù)據(jù)庫中的數(shù)據(jù)不一致,即B讀到的數(shù)據(jù)是臟數(shù)據(jù)。
不可重復讀:在一個事務內(nèi),多次讀取同一個數(shù)據(jù),但是由于另一個事務在此期間對這個數(shù)據(jù)做了修改并提交,導致前后讀取到的數(shù)據(jù)不一致;
幻讀:在一個事務中,先后兩次進行讀取相同的數(shù)據(jù)(一般是范圍查詢),但由于另一個事務新增或者刪除了數(shù)據(jù),導致前后兩次結(jié)果不一致。
排它鎖解決臟讀
共享鎖解決不可重復讀
臨鍵鎖解決幻讀
0:表示不刷入磁盤;
1:事務每次提交的時候,就把緩沖池中的數(shù)據(jù)刷新到磁盤中;
2:提交事務的時候,把緩沖池中的數(shù)據(jù)寫入磁盤文件對應的 os cache 緩存里去,而不是直接進入磁盤文件。可能 1 秒后才會把 os cache 里的數(shù)據(jù)寫入到磁盤文件里去。
5、數(shù)據(jù)庫中的鎖機制?
按鎖的粒度劃分:表級鎖、行級鎖、頁級鎖;
按鎖的類型劃分:共享(鎖S鎖)、排他鎖(X鎖);
按鎖的使用策略劃分:樂觀鎖、悲觀鎖;
表級鎖:最大粒度的鎖級別,發(fā)生鎖沖突的概率最高,并發(fā)度最低,但開銷小,加鎖快,不會出現(xiàn)死鎖;
行級鎖:最小粒度的所級別,發(fā)生鎖沖突的概率最小,并發(fā)度最高,但開銷大,加鎖慢,會發(fā)生死鎖;
頁級鎖:鎖粒度界于表級鎖和行級鎖之間,對表級鎖和行級鎖的折中,并發(fā)度一般。開銷和加鎖時間也界于表鎖和行鎖之間,會出現(xiàn)死鎖;
InnoDB存儲引擎支持行級鎖和表級鎖,默認情況下使用行級鎖,但只有通過索引進行查詢數(shù)據(jù),才使用行級鎖,否就使用表級鎖。
MyISAM和MEMORY存儲引擎采用的是表級鎖;
BDB存儲引擎使用的是頁面鎖,但也支持表級鎖;
共享鎖(S鎖、讀鎖):多個事務可以對同一數(shù)據(jù)行共享一把S鎖,但只能進行讀不能修改;
排它鎖(X鎖、寫鎖):一個事務獲取排它鎖之后,可以對鎖定范圍內(nèi)的數(shù)據(jù)行執(zhí)行寫操作,在鎖定期間,其他事務不能再獲取這部分數(shù)據(jù)行的鎖(共享鎖、排它鎖),只允許獲取到排它鎖的事務進行更新數(shù)據(jù)。
間隙鎖:當使用范圍查詢而不是精準查詢進行檢索數(shù)據(jù),并請求共享或排它鎖時,InnoDB會給符合范圍條件的已有數(shù)據(jù)記錄的索引項加鎖;對于鍵值在條件范圍內(nèi)但并不存在的記錄,叫做間隙(GAP)。
記錄鎖:當使用唯一索引,且記錄存在的精準查詢時,使用記錄鎖
X鎖解決臟讀
S鎖解決不可重復讀
臨鍵鎖解決幻讀
6、MySQL索引的實現(xiàn)原理:
減少查詢需要檢索的行數(shù),加快查詢速度,避免進行全表掃描,這也是創(chuàng)建索引的最主要的原因。
如果索引的數(shù)據(jù)結(jié)構(gòu)是B+樹,在使用分組和排序時,可以顯著減少查詢中分組和排序的時間。
通過創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。
當對表中的數(shù)據(jù)進行增加、刪除和修改時,索引也要進行更新,維護的耗時隨著數(shù)據(jù)量的增加而增加。
索引需要占用物理空間,如果要建立聚簇索引,那么需要的空間就會更大。
WHERE子句中經(jīng)常出現(xiàn)的列上面創(chuàng)建索引,加快條件的判斷速度。
按范圍存取的列或者在group by或order by中使用的列,因為索引已經(jīng)排序,這樣可以利用索引加快排序查詢時間。
經(jīng)常用于連接的列上,這些列主要是一些外鍵,可以加快連接的速度;
作為主鍵的列上,強制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu);
區(qū)分度不高的列。由于這些列的取值很少,例如性別,在查詢的結(jié)果中,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的很大比例,即需要在表中搜索的數(shù)據(jù)行的比例很大。增加索引,并不能明顯加快檢索速度。
在查詢中很少的列不應該創(chuàng)建索引。由于這些列很少使用到,但增加了索引,反而降低了系統(tǒng)的維護速度和增大了空間需求。
當添加索引造成修改成本的提高 遠遠大于 檢索性能的提高時,不應該創(chuàng)建索引。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。
定義為text, image和bit數(shù)據(jù)類型的列不應該增加索引。這些列的數(shù)據(jù)量要么相當大,要么取值很少。
普通索引:最基本的索引,沒有任何限制
唯一索引:但索引列的值必須唯一,允許有空值,可以有多個NULL值。如果是組合索引,則列值的組合必須唯一。
主鍵索引:一種特殊的唯一索引,不允許有空值。
全文索引:全文索引僅可用于 MyISAM 表,并只支持從CHAR、VARCHAR或TEXT類型,用于替代效率較低的like 模糊匹配操作,而且可以通過多字段組合的全文索引一次性全模糊匹配多個字段。
組合索引:主要是為了提高mysql效率,創(chuàng)建組合索引時應該將最常用作限制條件的列放在最左邊,依次遞減。
聚簇索引:表中數(shù)據(jù)存儲的物理順序與索引值的順序一致,一個基本表最多只能有一個聚簇索引,更新聚簇索引列上的數(shù)據(jù)時,往往導致表中記錄的物理順序的變更,代價較大,因此對于經(jīng)常更新的列不宜建立聚簇索引
非聚簇索引:表中數(shù)據(jù)的物理順序與索引值的順序不一致的索引組織,一個基本表可以有多個聚簇索引。
Hash索引僅能滿足等值的查詢,不能滿足范圍查詢、排序。因為數(shù)據(jù)在經(jīng)過Hash算法后,其大小關系就可能發(fā)生變化。
當創(chuàng)建組合索引時,不能只使用組合索引的部分列進行查詢。因為hash索引是把多個列數(shù)據(jù)合并后再計算Hash值,所以對單獨列數(shù)據(jù)計算Hash值是沒有意義的。
當發(fā)生Hash碰撞時,Hash索引不能避免表數(shù)據(jù)的掃描。因為僅僅比較Hash值是不夠的,需要比較實際的值以判定是否符合要求。
頁內(nèi)節(jié)點不存儲內(nèi)容,每次IO可以讀取更多的行,大大減少磁盤I/O讀取次數(shù)
帶順序訪問指針的B+Tree:B+Tree所有索引數(shù)據(jù)都存儲在葉子結(jié)點上,并且增加了順序訪問指針,每個葉子節(jié)點都有指向相鄰葉子節(jié)點的指針,這樣做是為了提高區(qū)間查詢效率。
(1)B+樹有利于對數(shù)據(jù)庫的掃描:B樹在提高了磁盤IO性能的同時并沒有解決元素遍歷的效率低下的問題,而B+樹只需要遍歷葉子節(jié)點就可以解決對全部關鍵字信息的掃描,所以范圍查詢、排序等操作,B+樹有著更高的性能。
(2)B+樹的磁盤IO代價更低:B+樹的內(nèi)部結(jié)點的data域并沒有存儲數(shù)據(jù),因此其內(nèi)部結(jié)點相對于B樹更小。如果把所有同一內(nèi)部結(jié)點的關鍵字存放在同一盤塊中,那么盤塊所能容納的關鍵字數(shù)量也越多。一次性讀入內(nèi)存中的需要查找的關鍵字也就越多,相對來說I/O讀寫次數(shù)也就降低了。
(3)B+樹的查詢效率更加穩(wěn)定:由于B+樹的內(nèi)部結(jié)點只是葉子結(jié)點中關鍵字的索引,并不存儲數(shù)據(jù)。所以任何關鍵字的查找必須走一條從根結(jié)點到葉子結(jié)點的路。所有關鍵字查詢的路徑長度相同,導致每一個數(shù)據(jù)的查詢效率相當。
對于 Innodb 的組合索引,如果各個列中的長度超過767字節(jié)的,則會對超過767字節(jié)的列取前綴索引;對于 Innodb 的單列索引,如果列的長度超過767的,則取前綴索引(取前255字符)
對于 MyISAM 的組合索引,所創(chuàng)建的索引長度和不能超過1000 bytes,否則會報錯,創(chuàng)建失敗;對于 MyISAM 的單列索引,最大長度也不能超過1000,否則會報警,但是創(chuàng)建成功,最終創(chuàng)建的是前綴索引(取前333個字符)
7、SQL優(yōu)化和索引優(yōu)化、表結(jié)構(gòu)優(yōu)化:
8、數(shù)據(jù)庫參數(shù)優(yōu)化:
9、explain的執(zhí)行計劃:
id值不同:id值越大優(yōu)先級越高,越先被執(zhí)行;
id值相同:從上往下依次執(zhí)行;
id列為null:表示這是一個結(jié)果集,不需要使用它來進行查詢。
system:表中只有一條數(shù)據(jù)匹配(等于系統(tǒng)表),可以看成 const 類型的特例
const:通過索引一次就找到了,表示使用主鍵索引或者唯一索引
eq_ref:主鍵或者唯一索引中的字段被用于連接使用,只會返回一行匹配的數(shù)據(jù)
ref:普通索引掃描,可能返回多個符合查詢條件的行。
fulltext:全文索引檢索,全文索引的優(yōu)先級很高,若全文索引和普通索引同時存在時,mysql不管代價,優(yōu)先選擇使用全文索引。
ref_or_null:與ref方法類似,只是增加了null值的比較。
index_merge:表示查詢使用了兩個以上的索引,索引合并的優(yōu)化方法,最后取交集或者并集,常見and ,or的條件使用了不同的索引。
unique_subquery:用于where中的in形式子查詢,子查詢返回不重復值唯一值;
index_subquery:用于in形式子查詢使用到了輔助索引或者in常數(shù)列表,子查詢可能返回重復值,可以使用索引將子查詢?nèi)ブ亍?/span>
range:索引范圍掃描,常見于使用>,<,between ,in ,like等運算符的查詢中。
index:索引全表掃描,把索引樹從頭到尾掃描一遍;
all:遍歷全表以找到匹配的行(Index與ALL雖然都是讀全表,但index是從索引中讀取,而ALL是從硬盤讀取)
NULL:MySQL在優(yōu)化過程中分解語句,執(zhí)行時甚至不用訪問表或索引
using index:使用覆蓋索引
using index condition:查詢的列未被索引覆蓋,where篩選條件使用了索引
using temporary:用臨時表保存中間結(jié)果,常用于 group by 和 order by 操作中,通常是因為 group by 的列上沒有索引,也有可能是因為同時有g(shù)roup by和order by,但group by和order by的列又不一樣,一般看到它說明查詢需要優(yōu)化了
using filesort:MySQL有兩種方式對查詢結(jié)果進行排序,一種是使用索引,另一種是filesort(基于快排實現(xiàn)的外部排序,性能比較差),當數(shù)據(jù)量很大時,這將是一個CPU密集型的過程,所以可以通過建立合適的索引來優(yōu)化排序的性能
10、MySQL的主從復制:
(1)Slave SQL thread線程:創(chuàng)建用于讀取relay log中繼日志并執(zhí)行日志中包含的更新,位于slave端
(2)Slave I/O thread線程:讀取 master 服務器Binlog Dump線程發(fā)送的內(nèi)容并保存到slave服務器的relay log中繼日志中,位于slave端:
(3)Binlog dump thread線程(也稱為IO線程):將bin-log二進制日志中的內(nèi)容發(fā)送到slave服務器,位于master端
(1)master服務器在執(zhí)行SQL語句之后,記錄在binlog二進制文件中;
(2)slave端的IO線程連接上master端,并請求從指定bin log日志文件的指定pos節(jié)點位置(或者從最開始的日志)開始復制之后的日志內(nèi)容。
(3)master端在接收到來自slave端的IO線程請求后,通知負責復制進程的IO線程,根據(jù)slave端IO線程的請求信息,讀取指定binlog日志指定pos節(jié)點位置之后的日志信息,然后返回給slave端的IO線程。該返回信息中除了binlog日志所包含的信息之外,還包括本次返回的信息在master端的binlog文件名以及在該binlog日志中的pos節(jié)點位置。
(4)slave端的IO線程在接收到master端IO返回的信息后,將接收到的binlog日志內(nèi)容依次寫入到slave端的relay log文件的最末端,并將讀取到的master端的binlog文件名和pos節(jié)點位置記錄到master-info文件中(該文件存slave端),以便在下一次同步的候能夠告訴master從哪個位置開始進行數(shù)據(jù)同步;
(5)slave端的SQL線程在檢測到relay log文件中新增內(nèi)容后,就馬上解析該relay log文件中的內(nèi)容,然后還原成在master端真實執(zhí)行的那些SQL語句,再按順序依次執(zhí)行這些SQL語句,從而到達master端和slave端的數(shù)據(jù)一致性;
(1)讀寫分離,通過動態(tài)增加從服務器來提高數(shù)據(jù)庫的性能,在主服務器上執(zhí)行寫入和更新,在從服務器上執(zhí)行讀功能。
(2)提高數(shù)據(jù)安全,因為數(shù)據(jù)已復制到從服務器,從服務器可以終止復制進程,所以,可以在從服務器上備份而不破壞主服務器相應數(shù)據(jù)。
(3)在主服務器上生成實時數(shù)據(jù),而在從服務器上分析這些數(shù)據(jù),從而提高主服務器的性能。
① 因為記錄的SQL語句,所以占用更少的存儲空間。binlog日志包含了描述數(shù)據(jù)庫操作的事件,但這些事件包含的情況只是對數(shù)據(jù)庫進行改變的操作,例如 insert、update、create、delete等操作。相反對于select、desc等類似的操作并不會去記錄。
② binlog日志文件記錄了所有的改變數(shù)據(jù)庫的語句,所以此文件可以作為數(shù)據(jù)庫的審核依據(jù)。
① 不安全,不是所有的改變數(shù)據(jù)的語句都會被記錄。對于非確定性的行為不會被記錄。例如:對于 delete 或者 update 語句,如果使用了 limit 但是并沒有 order by ,這就屬于非確定性的語句,就不會被記錄。
② 對于沒有索引條件的update,insert……select 語句,必須鎖定更多的數(shù)據(jù),降低了數(shù)據(jù)庫的性能。
① 所有的改變都會被復制,這是最安全的復制方式;
② 對于 update、insert……select等語句鎖定更少的行;
① 不能通過binlog日志文件查看什么語句執(zhí)行了,也無從知道在從服務器上接收到什么語句,我們只能看到什么數(shù)據(jù)改變。
② 因為記錄的是數(shù)據(jù),所以說binlog日志文件占用的存儲空間要比Statement-based大。
③ 對于數(shù)據(jù)量大的操作其花費的時間有更長。
11、讀寫分離:
(1)增加物理服務器,負荷分攤;
(2)主從只負責各自的寫和讀,極大程度的緩解X鎖和S鎖爭用;
(3)從庫可配置MyISAM引擎,提升查詢性能以及節(jié)約系統(tǒng)開銷;
(4)主從復制另外一大功能是增加冗余,提高可用性,當一臺數(shù)據(jù)庫服務器宕機后能通過調(diào)整另外一臺從庫來以最快的速度恢復服務。
(1)基于程序代碼內(nèi)部實現(xiàn):在代碼中根據(jù)select 、insert進行路由分類。優(yōu)點是性能較好,因為程序在代碼中實現(xiàn),不需要增加額外的硬件開支,缺點是需要開發(fā)人員來實現(xiàn),運維人員無從下手。
(2)基于中間代理層實現(xiàn):代理一般介于應用服務器和數(shù)據(jù)庫服務器之間,代理數(shù)據(jù)庫服務器接收到應用服務器的請求后根據(jù)判斷后轉(zhuǎn)發(fā)到后端數(shù)據(jù)庫,有以下代表性的代理層。
12、分庫分表:垂直分表、垂直分庫、水平分表、水平分庫
降低業(yè)務中的耦合,方便對不同的業(yè)務進行分級管理
可以提升IO、數(shù)據(jù)庫連接數(shù)、解決單機硬件存儲資源的瓶頸問題
主鍵出現(xiàn)冗余,需要管理冗余列
事務的處理變得復雜
仍然存在單表數(shù)據(jù)量過大的問題
解決了單表數(shù)據(jù)量過大的問題
避免IO競爭并減少鎖表的概率
解決了單庫大數(shù)據(jù)量的瓶頸問題
IO沖突減少,鎖的競爭減少,某個數(shù)據(jù)庫出現(xiàn)問題不影響其他數(shù)據(jù)庫,提高了系統(tǒng)的穩(wěn)定性和可用性
分片事務一致性難以解決
跨節(jié)點JOIN性能差,邏輯會變得復雜
數(shù)據(jù)擴展難度大,不易維護
優(yōu)點:由數(shù)據(jù)庫管理,簡單有效。
缺點:性能代價高,特別是shard越來越多。
優(yōu)點:性能上有優(yōu)勢;
缺點:需要在應用程序在事務上做靈活控制。如果使用了spring的事務管理,改動起來會面臨一定的困難。
優(yōu)點:本地生成ID,不需要遠程調(diào)用,全局唯一不重復。
缺點:占用空間大,不適合作為索引。
優(yōu)點:簡單易實現(xiàn)。
缺點:在高并發(fā)下存在瓶頸。
優(yōu)點:不依賴數(shù)據(jù)庫,性能比較好。
缺點:引入新的組件會使得系統(tǒng)復雜度增加
1bit:第一個bit默認為0,因為二進制中第一個bit為1的話為負數(shù),但是ID不能為負數(shù).
41bit:表示的是時間戳,單位是毫秒。
10bit:記錄工作機器ID,其中5個bit表示機房ID,5個bit表示機器ID。
12bit:用來記錄同一毫秒內(nèi)產(chǎn)生的不同ID。
13、分區(qū):
(1)Range分區(qū):按照連續(xù)的區(qū)間范圍進行分區(qū)
(2)List分區(qū):按照給定的集合中的值進行選擇分區(qū)。
(3)Hash分區(qū):基于用戶定義的表達式的返回值進行分區(qū),該表達式使用將要插入到表中的這些行的列值進行計算。這個函數(shù)可以包含MySQL中有效的、產(chǎn)生非負整數(shù)值的任何表達式。
(4)Key分區(qū):類似于按照HASH分區(qū),區(qū)別在于Key分區(qū)只支持計算一列或多列,且key分區(qū)的哈希函數(shù)是由 MySQL 服務器提供。
將分區(qū)分在不同磁盤,可以解決單磁盤容量瓶頸問題,存儲更多的數(shù)據(jù),也能解決單磁盤的IO瓶頸問題。
減少數(shù)據(jù)庫檢索時需要遍歷的數(shù)據(jù)量,在查詢時只需要在數(shù)據(jù)對應的分區(qū)進行查詢。
避免Innodb的單個索引的互斥訪問限制
對于聚合函數(shù),例如sum()和count(),可以在每個分區(qū)進行并行處理,最終只需要統(tǒng)計所有分區(qū)得到的結(jié)果
方便管理,對于失去保存意義的數(shù)據(jù),通過刪除對應的分區(qū),達到快速刪除的作用。比如刪除某一時間的歷史數(shù)據(jù),直接執(zhí)行truncate,或者直接drop整個分區(qū),這比detele刪除效率更高;
在某些場景下,單個分區(qū)表的備份很恢復會更有效率。
14、主鍵一般用自增ID還是UUID?
字段長度較 UUID 會小很多。
數(shù)據(jù)庫自動編號,按順序存放,利于檢索
無需擔心主鍵重復問題
因為是自增,在某些業(yè)務場景下,容易被其他人查到業(yè)務量。
發(fā)生數(shù)據(jù)遷移時,或者表合并時會非常麻煩
在高并發(fā)的場景下,競爭自增鎖會降低數(shù)據(jù)庫的吞吐能力
唯一標識,不用考慮重復問題,在數(shù)據(jù)拆分、合并時也能達到全局的唯一性。
可以在應用層生成,提高數(shù)據(jù)庫的吞吐能力。
無需擔心業(yè)務量泄露的問題。
因為UUID是隨機生成的,所以會發(fā)生隨機IO,影響插入速度,并且會造成硬盤的使用率較低。
UUID占用空間較大,建立的索引越多,造成的影響越大。
UUID之間比較大小較自增ID慢不少,影響查詢速度。
15、視圖View:
簡化了操作,把經(jīng)常使用的數(shù)據(jù)定義為視圖
安全性,用戶只能查詢和修改能看到的數(shù)據(jù)
邏輯上的獨立性,屏蔽了真實表的結(jié)構(gòu)帶來的影響
性能差,數(shù)據(jù)庫必須把對視圖的查詢轉(zhuǎn)化成對基本表的查詢,如果這個視圖是由一個復雜的多表查詢所定義,那么,即使是視圖的一個簡單查詢,數(shù)據(jù)庫也要把它變成一個復雜的結(jié)合體,需要花費一定的時間。
16、存儲過程Procedure:
(1)標準組件式編程:存儲過程創(chuàng)建后,可以在程序中被多次調(diào)用,而不必重新編寫該存儲過程的SQL語句。并且DBA可以隨時對存儲過程進行修改,對應用程序源代碼毫無影響。
(2)更快的執(zhí)行速度:如果某一操作包含大量的Transaction-SQL代碼或分別被多次執(zhí)行,那么存儲過程要比批處理的執(zhí)行速度快很多。因為存儲過程是預編譯的,在首次運行一個存儲過程時查詢,優(yōu)化器對其進行分析優(yōu)化,并且給出最終被存儲在系統(tǒng)表中的執(zhí)行計劃。而批處理的Transaction-SQL語句在每次運行時都要進行編譯和優(yōu)化,速度相對要慢一些。
(3)增強SQL語言的功能和靈活性:存儲過程可以用控制語句編寫,有很強的靈活性,可以完成復雜的判雜的斷和較復運算。
(4)減少網(wǎng)絡流量:針對同一個數(shù)據(jù)庫對象的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語句被組織進存儲過程,那么當在客戶計算機上調(diào)用該存儲過程時,網(wǎng)絡中傳送的只是該調(diào)用語句,從而大大減少網(wǎng)絡流量并降低了網(wǎng)絡負載。
(5)作為一種安全機制來充分利用:通過對執(zhí)行某一存儲過程的權(quán)限進行限制,能夠?qū)崿F(xiàn)對相應的數(shù)據(jù)的訪問權(quán)限的限制,避免了非授權(quán)用戶對數(shù)據(jù)的訪問,保證了數(shù)據(jù)的安全。
17、觸發(fā)器Trigger:
18、游標Cursor:
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:
https://blog.csdn.net/a745233700/article/details/114242960




