掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
MySQL在面試中經(jīng)常被問到,本文總結(jié)了面試中的經(jīng)典問題。

創(chuàng)新互聯(lián)建站是一家以重慶網(wǎng)站建設(shè)公司、網(wǎng)頁設(shè)計(jì)、品牌設(shè)計(jì)、軟件運(yùn)維、成都網(wǎng)站營銷、小程序App開發(fā)等移動開發(fā)為一體互聯(lián)網(wǎng)公司。已累計(jì)為成都衛(wèi)生間隔斷等眾行業(yè)中小客戶提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開發(fā)服務(wù)。
在設(shè)計(jì)數(shù)據(jù)庫結(jié)構(gòu)的時候,要盡量遵守三范式,如果不遵守,必須有足夠的理由。
比如性能。事實(shí)上我們經(jīng)常會為了性能而妥協(xié)數(shù)據(jù)庫的設(shè)計(jì)。
MySQL服務(wù)器通過權(quán)限表來控制用戶對數(shù)據(jù)庫的訪問,權(quán)限表存放在mysql數(shù)據(jù)庫里,由mysql_install_db腳本初始化。
這些權(quán)限表分別user,db,table_priv,columns_priv和host。
(1) 數(shù)據(jù)定義語言DDL(Data Ddefinition Language)CREATE,DROP,ALTER
主要為以上操作 即對邏輯結(jié)構(gòu)等有操作的,其中包括表結(jié)構(gòu),視圖和索引。
(2) 數(shù)據(jù)查詢語言DQL(Data Query Language)SELECT
這個較為好理解 即查詢操作,以select關(guān)鍵字。各種簡單查詢,連接查詢等 都屬于DQL。
(3) 數(shù)據(jù)操縱語言DML(Data Manipulation Language)INSERT,UPDATE,DELETE
主要為以上操作 即對數(shù)據(jù)進(jìn)行操作的,對應(yīng)上面所說的查詢操作 DQL與DML共同構(gòu)建了多數(shù)初級程序員常用的增刪改查操作。
而查詢是較為特殊的一種 被劃分到DQL中。
(4) 數(shù)據(jù)控制功能DCL(Data Control Language)GRANT,REVOKE,COMMIT,ROLLBACK
主要為以上操作 即對數(shù)據(jù)庫安全性完整性等有操作的,可以簡單的理解為權(quán)限控制等。
分庫分表就是為了 解決由于數(shù)據(jù)量過大而導(dǎo)致數(shù)據(jù)庫性能降低的問題, 將原來獨(dú)立的數(shù)據(jù)庫拆分成若干數(shù)據(jù)庫組成,將數(shù)據(jù)大表拆分成若干數(shù)據(jù)表組成, 使得單一數(shù)據(jù)庫、單一數(shù)據(jù)表的數(shù)據(jù)量變小,從而達(dá)到提升數(shù)據(jù)庫性能的目的。
分庫分表常用的中間件如下:
死鎖是指兩個或多個事務(wù)在同一資源上相互占用,并請求鎖定對方的資源,從而導(dǎo)致惡性循環(huán)的現(xiàn)象。
常見的解決死鎖的方法:
視圖的特點(diǎn)如下: 視圖的列可以來自不同的表,是表的抽象和在邏輯意義上建立的新關(guān)系。
推薦使用自增ID,不要使用UUID。
因?yàn)樵贗nnoDB存儲引擎中,主鍵索引是作為聚簇索引存在的,也就是說, 主鍵索引的B+樹葉子節(jié)點(diǎn)上存儲了主鍵索引以及全部的數(shù)據(jù)(按照順序), 如果主鍵索引是自增ID,那么只需要不斷向后排列即可,如果是UUID, 由于到來的ID與原來的大小不確定,會造成非常多的數(shù)據(jù)插入,數(shù)據(jù)移動,然后導(dǎo)致產(chǎn)生很多的內(nèi)存碎片,進(jìn)而造成插入性能的下降。
總之,在數(shù)據(jù)量大一些的情況下,用自增主鍵性能會好一些。
關(guān)于主鍵是聚簇索引,如果沒有主鍵,InnoDB會選擇一個唯一鍵來作為聚簇索引,如果沒有唯一鍵,會生成一個隱式的主鍵。
當(dāng) cpu 飆升到 100%時,先用操作系統(tǒng)命令 top 命令觀察是不是 mysqld 占用導(dǎo)致的。
如果不是,找出占用高的進(jìn)程,并進(jìn)行相關(guān)處理。
如果是 mysqld 造成的, show processlist,看看里面跑的 session 情況,是不是有消耗資源的 sql 在運(yùn)行。找出消耗高的 sql,看看執(zhí)行計(jì)劃是否準(zhǔn)確,index 是否缺失,或者實(shí)在是數(shù)據(jù)量太大造成。
一般來說,肯定要 kill 掉這些線程(同時觀察 cpu 使用率是否下降), 等進(jìn)行相應(yīng)的調(diào)整(比如說加索引、改 sql、改內(nèi)存參數(shù))之后,再重新跑這些 SQL。
也有可能是每個 sql 消耗資源并不多,但是突然之間,有大量的 session 連進(jìn)來導(dǎo)致 cpu 飆升, 這種情況就需要跟應(yīng)用一起來分析為何連接數(shù)會激增, 再做出相應(yīng)的調(diào)整,比如說限制連接數(shù)等。
主從復(fù)制的作用是:
主數(shù)據(jù)庫出現(xiàn)問題,可以切換到從數(shù)據(jù)庫??梢赃M(jìn)行數(shù)據(jù)庫層面的讀寫分離。可以在從數(shù)據(jù)庫上進(jìn)行日常備份。
TID(Global Transaction ID,全局事務(wù)ID)是全局事務(wù)標(biāo)識符, 是一個已提交事務(wù)的編號,并且是一個全局唯一的編號。
GTID是從MySQL 5.6版本開始在主從復(fù)制方面推出的重量級特性。
GTID實(shí)際上是由UUID+TID組成的。其中UUID是一個MySQL實(shí)例的唯一標(biāo)識。
GTID代表了該實(shí)例上已經(jīng)提交的事務(wù)數(shù)量,并且隨著事務(wù)提交單調(diào)遞增。
GTID有如下幾點(diǎn)作用:
備份工具差異對比:
(1) mysql復(fù)制相對于其他的備份來說,得到的備份數(shù)據(jù)比較實(shí)時。
(2) copy:直接拷貝文件到數(shù)據(jù)目錄下,可能引起表損壞或者數(shù)據(jù)不一致。
(3) xtrabackup對于innodb表是不需要鎖表的,對于myisam表仍然需要鎖表。
視庫的大小來定,一般來說 100G 內(nèi)的庫,可以考慮使用 mysqldump 來做, 因?yàn)?mysqldump更加輕巧靈活,備份時間選在業(yè)務(wù)低峰期, 可以每天進(jìn)行都進(jìn)行全量備份(mysqldump 備份出來的文件比較小,壓縮之后更小)。
100G 以上的庫,可以考慮用 xtranbackup 來做,備份速度明顯要比 mysqldump 要快。
一般是選擇一周一個全備,其余每天進(jìn)行增量備份,備份時間為業(yè)務(wù)低峰期。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流