C++服務(wù)端面試準(zhǔn)備(2)MySQL相關(guān)

聲明:本文內(nèi)容純屬博主自己查找和歸納的個人所需的知識點,僅作參考,如有錯誤,博主強(qiáng)烈希望您指出。如果您是某個知識點的原創(chuàng)博主,如有需要,可聯(lián)系本人加上鏈接。本文內(nèi)容會根據(jù)博主所需進(jìn)行更新,希望大家多多關(guān)照。

MySQL底層數(shù)據(jù)結(jié)構(gòu)

???????B+樹

存儲引擎之二:InnoDB與Myisam

? InnoDB Myisam
事務(wù) 支持 不支持
外鍵 支持 不支持
表鎖、行鎖 表鎖
總行數(shù) 需要掃描整個表 直接讀取
文件 .idb數(shù)據(jù)文件和它的.frm文件,表的大小只受限于操作系統(tǒng)文件的大小,一般為 2GB .frm文件存儲表定義。數(shù)據(jù)文件的擴(kuò)展名為.MYD (MYData)。索引文件的擴(kuò)展名是.MYI (MYIndex)。
使用環(huán)境 都符合要求的情況下,改動多的時候 都符合要求的情況下,查找多的時候
自增長 必須為索引,計數(shù)器存在內(nèi)存,8.0版本后寫入到redo log中 沒有限制,還能建立聯(lián)合索引

范式

?范式背景:
?1.解決數(shù)據(jù)冗余
?2.數(shù)據(jù)的優(yōu)化與存儲
?3.保存數(shù)據(jù)之后,可以通過關(guān)系得到的數(shù)據(jù),不再存儲

  • 第一范式:字段能直接拿來用,不需要分割或者其他操作,即原子性

  • 第二范式:第二范式就是在滿足第一范式的前提下,解決部分依賴的問題,比如某些字段只依賴復(fù)合主鍵的其中一個,解決的方法是使用邏輯主鍵等,使這些字段直接或者間接依賴主鍵,但是會出現(xiàn)傳遞依賴的問題

  • 第三范式:第三范式就是在滿足第二范式的前提下,解決傳遞依賴的問題,也就是間接依賴主鍵,解決的方法是將存在傳遞依賴的字段以及依賴的字段本身單獨取出,形成一個單獨的表,然后在需要對應(yīng)信息的時候,使用對應(yīng)的實體表的主鍵加進(jìn)來

連接

  • 內(nèi)連接:獲取兩個表相同字段都有的數(shù)據(jù)
    SELECT a.xxx, b.xxx FROM table1 a INNER JOIN table2 b ON a.xxx = b.xxx;
    等價于
    SELECT a.xxx, b.xxx FROM table1 a, table2 b WHERE a.xxx = b.xxx;

  • 左連接:獲取左表指定的數(shù)據(jù),即使右表沒有
    SELECT a.xxx, b.xxx FROM table1 a LEFT JOIN table2 b ON a.xxx = b.xxx;

  • 右連接:獲取右表指定的數(shù)據(jù),即使左表沒有
    SELECT a.xxx, b.xxx FROM table1 a RIGHT JOIN table2 b ON a.xxx = b.xxx;

  • UNION,UNION ALL:將兩個或多個表中相同列的數(shù)據(jù)展示出來
    SELECT column FROM table1 UNION SELECT column FROM table2 ORDER BY column;

  • 注意UNION的列數(shù)和順序要相同,類型最好也相同,而內(nèi)、外連接SELECT里沒硬性要求

存儲過程和自定義函數(shù)的區(qū)別

  1. 存儲過程能有多個返回值,而函數(shù)只能有一個返回值

  2. 存儲過程聲明時不需要描述返回類型,而函數(shù)聲明時需要描述返回類型,且函數(shù)體中必須包含一個有效的RETURN語句

  3. 存儲過程的參數(shù)有IN、OUT、INOUT類型,而函數(shù)只有IN類型

  4. 存儲過程一般是作為一個獨立的部分來執(zhí)行( EXECUTE 語句執(zhí)行),而函數(shù)可以作為sql語句的一個部分來調(diào)用

  5. 一般來說,存儲過程實現(xiàn)的功能要復(fù)雜一點,而函數(shù)實現(xiàn)的功能針對性比較強(qiáng)

  • 存儲過程的好處
    ???????存儲過程說白了就是把經(jīng)常使用的SQL語句或業(yè)務(wù)邏輯封裝起來,預(yù)編譯保存在數(shù)據(jù)庫中,當(dāng)需要的時候從數(shù)據(jù)庫中直接調(diào)用,省去了編譯的過程.,提高了運行速度, 同時降低網(wǎng)絡(luò)數(shù)據(jù)傳輸量(傳輸名字和參數(shù)即可)

什么是事務(wù)

???????事務(wù)(Transaction)是并發(fā)控制的基本單位。所謂事務(wù),它是一個操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個不可分割的工作單位。

事務(wù)的四大特性

  • 原子性(Atomicity):事務(wù)作為一個整體被執(zhí)行,包含在其中的對數(shù)據(jù)庫的操作要么全部被執(zhí)行,要么都不執(zhí)行

  • 一致性(Consistency):事務(wù)應(yīng)確保數(shù)據(jù)庫的狀態(tài)從一個一致狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€一致狀態(tài)。

  • 隔離性(Isolation):多個事務(wù)并發(fā)執(zhí)行時,一個事務(wù)的執(zhí)行不應(yīng)影響其他事務(wù)的執(zhí)行

  • 持久性(Durability):已被提交的事務(wù)對數(shù)據(jù)庫的修改應(yīng)該永久保存在數(shù)據(jù)庫中

索引

  • 索引分為兩大類:B樹類型索引和Hash類型索引

  • B樹類型索引分B+樹和B-樹,InnoDB和Myisam支持B樹類型索引,不支持Hash類型索引

  • B+樹層數(shù)越多,數(shù)據(jù)量指數(shù)值增長,InnoDB和Myisam默認(rèn)使用

  • Hash索引查詢單條快,范圍查詢慢,Memory、NDB支持

  • 常用索引:
    ???????普通索引INDEX、唯一索引UNIQUE INDEX、主鍵索引PRIMARY KEY、組合索引INDEX(column1, column2, ...)和全文索引FULLTEXT INDEX

全文索引

  1. 只支持 char、varchar、text 類型;

  2. 性能比like高很多,但可能存在精度問題。

  3. 表中必須有 4 條以上的記錄

  4. 如果需要全文索引的是大量數(shù)據(jù),建議先添加數(shù)據(jù),再創(chuàng)建索引

  5. 自然全文索引:SELECT xxx FROM table WHERE MATCH(fulltext_column) AGAINST('info');

  6. 布爾全文索引:SELECT xxx FROM table WHERE MATCH(fulltext_column) AGAINST('info' in boolean mode);
    info里使用修飾符:
    '+':必須包含該詞
    '-':必須不包含該詞
    '>':提高該詞的相關(guān)性,查詢的結(jié)果靠前
    '<':降低該詞的相關(guān)性,查詢的結(jié)果靠后
    '*':通配符,只能接在詞后面

  7. 查看引擎搜索長度:show variables like '%ft%';

  8. 配置搜索長度:打開 MySQL 的配置文件 /etc/my.cnf,在 [mysqld] 的下面,根據(jù)查看引擎搜索長度的格式,追加相應(yīng)內(nèi)容,并且重啟MySQL,輸入修復(fù)命令repair table test quick;

視圖及其優(yōu)點

  • 視圖是一個虛擬表,實質(zhì)是一條預(yù)編譯的SQL語句,并不保存實際數(shù)據(jù)

  • 視圖通常只用作查詢,避免修改操作。若進(jìn)行修改操作,單表的視圖會將修改同步到源表,多表的視圖修改可能會出錯,因此修改數(shù)據(jù)操作應(yīng)在表上進(jìn)行

優(yōu)點:

  • 簡單。對使用視圖的用戶來說視圖已經(jīng)是過濾好的復(fù)合條件的結(jié)果集,完全不需要關(guān)心后面對應(yīng)的表的結(jié)構(gòu)、關(guān)聯(lián)條件和篩選條件

  • 安全。使用視圖的用戶只能訪問他們被允許查詢的特定的行或列,也就是視圖本身的內(nèi)容,不會涉及到視圖以外的數(shù)據(jù)

  • 數(shù)據(jù)獨立。一旦視圖的結(jié)構(gòu)確定了,就相當(dāng)于有兩個表,用戶使用視圖可以屏蔽源表結(jié)構(gòu)變化的影響,源表發(fā)生變化時,可以修改視圖同步變化

視圖與臨時表的區(qū)別

  1. 視圖實質(zhì)是一條預(yù)編譯的SQL語句,不保存實際數(shù)據(jù),而臨時表是個真實的表

  2. 視圖只存在于單個查詢當(dāng)中,每次使用該視圖名,其虛擬表就會根據(jù)現(xiàn)有的數(shù)據(jù)重新被創(chuàng)建,而臨時表只存在于它被創(chuàng)建的整個數(shù)據(jù)庫會話過程中

  3. 視圖的內(nèi)容是在該視圖每次被使用的時候才生成,所以數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)是同步的,而臨時表一經(jīng)創(chuàng)建只能手動更新

  4. 建立視圖時可將原本數(shù)據(jù)隱藏起來換成另一種表達(dá)形式,更為安全還能改善應(yīng)用體驗,而臨時表只能直接復(fù)制

應(yīng)用場景

  • 視圖用于查詢多的情況,需要安全性能更高的情況
  • 臨時表用于更新多的情況,或者需要復(fù)制表的情況

SQL實現(xiàn)數(shù)據(jù)表的復(fù)制

select into frominsert into select都是用來復(fù)制表.
兩者的主要區(qū)別為:
select into from 要求目標(biāo)表不存在,因為在插入時會自動創(chuàng)建
insert into select from 要求目標(biāo)表存在
兩者的語法:
SELECT vale1, value2 into Table2 from Table1
Insert into Table2(field1,field2,...) select value1,value2,... from Table1

NULL值的處理

  • IS NULL:變量為NULL
  • IS NOT NULL:變量不為NULL
  • <=>:這才是MySQL語句的比較操作符
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容