0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

最全的數(shù)據(jù)庫-MySQL知識匯總3

jf_78858299 ? 來源:阿Q正磚 ? 作者:阿Q ? 2023-02-23 14:27 ? 次閱讀

10、drop、delete與truncate的區(qū)別

SQL中的drop、delete、truncate都表示刪除,但是三者有一些差別:

  1. Delete用來刪除表的全部或者一部分?jǐn)?shù)據(jù)行,執(zhí)行delete之后,用戶需要提交(commmit)或者回滾(rollback)來執(zhí)行刪除或者撤銷刪除, delete命令會觸發(fā)這個表上所有的delete觸發(fā)器。

  2. Truncate刪除表中的所有數(shù)據(jù),這個操作不能回滾,也不會觸發(fā)這個表上的觸發(fā)器,TRUNCATE比delete更快,占用的空間更小。

  3. Drop命令從數(shù)據(jù)庫中刪除表,所有的數(shù)據(jù)行,索引和權(quán)限也會被刪除,所有的DML觸發(fā)器也不會被觸發(fā),這個命令也不能回滾。

    因此,在不再需要一張表的時候,用drop;在想刪除部分?jǐn)?shù)據(jù)行時候,用delete;在保留表而刪除所有數(shù)據(jù)的時候用truncate。

11、Sql的優(yōu)化

  1. sql盡量使用索引,而且查詢要走索引
  2. 對sql語句優(yōu)化

子查詢變成left join

limit 分布優(yōu)化,先利用ID定位,再分頁

or條件優(yōu)化,多個or條件可以用union all對結(jié)果進(jìn)行合并(union all結(jié)果可能重復(fù))

不必要的排序

where代替having,having 檢索完所有記錄,才進(jìn)行過濾

避免嵌套查詢

對多個字段進(jìn)行等值查詢時,聯(lián)合索引

12、關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫區(qū)別

12.1、關(guān)系型數(shù)據(jù)庫

  1. 優(yōu)點
    1. 容易理解:二維表結(jié)構(gòu)是非常貼近邏輯世界一個概念,關(guān)系模型相對網(wǎng)狀、層次等其他模型來說更容易理解。
    2. 使用方便:通用的SQL語言使得操作關(guān)系型數(shù)據(jù)庫非常方便。
    3. 易于維護(hù):豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大減低了數(shù)據(jù)冗余和數(shù)據(jù)不一致的概率。
    4. 支持SQL,可用于復(fù)雜的查詢。
    5. 支持事務(wù) 。
  2. 缺點
    1. 為了維護(hù)一致性所付出的巨大代價就是其讀寫性能比較差;
    2. 固定的表結(jié)構(gòu);
    3. 不支持高并發(fā)讀寫需求;
    4. 不支持海量數(shù)據(jù)的高效率讀寫

12.2、非關(guān)系型數(shù)據(jù)庫

  1. 使用鍵值對存儲數(shù)據(jù);
  2. 分布式;
  3. 優(yōu)點
  • 無需經(jīng)過sql層的解析,讀寫性能很高
  • 基于鍵值對,數(shù)據(jù)沒有耦合性,容易擴(kuò)展
  • 存儲數(shù)據(jù)的格式:nosql的存儲格式是key,value形式
  1. 缺點
  • 不提供sql支持

13、臟讀,不可重讀,幻讀

  1. 臟讀:臟讀是指一個事務(wù)在處理過程中讀取了另一個還沒提交的事務(wù)的數(shù)據(jù)。

    比如A向B轉(zhuǎn)賬100,A的賬戶減少了100,而B的賬戶還沒來得及修改,此時一個并發(fā)的事務(wù)訪問到了B的賬戶,就是臟讀 。

  2. 不可重復(fù)讀:不可重復(fù)讀是對于數(shù)據(jù)庫中的某一個字段,一個事務(wù)多次查詢卻返回了不同的值,這是由于在查詢的間隔中,該字段被另一個事務(wù)修改并提交了。

    比如第一次查詢自己的賬戶有1000元,此時另一個事務(wù)給A的賬戶增加了1000元,所以A再次讀取他的賬戶得到了2000的結(jié)果,跟第一次讀取的不一樣。
    不可重復(fù)讀與臟讀的不同之處在于,臟讀是讀取了另一個事務(wù)沒有提交的臟數(shù)據(jù),不可重復(fù)讀是讀取了已經(jīng)提交的數(shù)據(jù),實際上并不是一個異?,F(xiàn)象。

  3. 幻讀:事務(wù)多次讀取同一個范圍的時候,查詢結(jié)果的記錄數(shù)不一樣,這是由于在查詢的間隔中,另一個事務(wù)新增或刪除了數(shù)據(jù)。

    比如A公司一共有100個人,第一次查詢總?cè)藬?shù)得到100條記錄,此時另一個事務(wù)新增了一個人,所以下一次查詢得到101條記錄。
    不可重復(fù)度和幻讀的不同之處在于,幻讀是多次讀取的結(jié)果行數(shù)不同,不可重復(fù)度是讀取結(jié)果的值不同。
    避免不可重復(fù)讀需要鎖行,避免幻讀則需要鎖表。
    臟讀,不可重復(fù)讀和幻讀都是數(shù)據(jù)庫的讀一致性問題,是在并行的過程中出現(xiàn)的問題,必須采用一定的隔離級別解決。

二、數(shù)據(jù)庫進(jìn)階

1、MySQL的主從復(fù)制

MySQL主從復(fù)制是其最重要的功能之一。主從復(fù)制是指一臺服務(wù)器充當(dāng)主數(shù)據(jù)庫服務(wù)器,另一臺或多臺服務(wù)器充當(dāng)從數(shù)據(jù)庫服務(wù)器,主服務(wù)器中的數(shù)據(jù)自動復(fù)制到從服務(wù)器之中。對于多級復(fù)制,數(shù)據(jù)庫服務(wù)器即可充當(dāng)主機(jī),也可充當(dāng)從機(jī)。MySQL主從復(fù)制的基礎(chǔ)是主服務(wù)器對數(shù)據(jù)庫修改記錄二進(jìn)制日志,從服務(wù)器通過主服務(wù)器的二進(jìn)制日志自動執(zhí)行更新。

MySQL主從復(fù)制的兩種情況: 同步復(fù)制和異步復(fù)制 ,實際復(fù)制架構(gòu)中大部分為異步復(fù)制。

復(fù)制的基本過程如下:

  1. Slave上面的IO進(jìn)程連接上Master,并請求從指定日志文件的指定位置(或者從最開始的日志)之后的日志內(nèi)容。
  2. Master接收到來自Slave的IO進(jìn)程的請求后,負(fù)責(zé)復(fù)制的IO進(jìn)程會根據(jù)請求信息讀取日志指定位置之后的日志信息,返回給Slave的IO進(jìn)程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息已經(jīng)到Master端的bin-log文件的名稱以及bin-log的位置。
  3. Slave的IO進(jìn)程接收到信息后,將接收到的日志內(nèi)容依次添加到Slave端的relay-log文件的最末端,并將讀取到的Master端的 bin-log的文件名和位置記錄到master-info文件中,以便在下一次讀取的時候能夠清楚的告訴Master“我需要從某個bin-log的哪個位置開始往后的日志內(nèi)容,請發(fā)給我”。
  4. Slave的Sql進(jìn)程檢測到relay-log中新增加了內(nèi)容后,會馬上解析relay-log的內(nèi)容成為在Master端真實執(zhí)行時候的那些可執(zhí)行的內(nèi)容,并在自身執(zhí)行。

2、數(shù)據(jù)庫水平切分與垂直切分

  1. 垂直拆分就是要把表按模塊劃分到不同數(shù)據(jù)庫表中(當(dāng)然原則還是不破壞第三范式),這種拆分在大型網(wǎng)站的演變過程中是很常見的。當(dāng)一個網(wǎng)站還在很小的時候,只有小量的人來開發(fā)和維護(hù),各模塊和表都在一起,當(dāng)網(wǎng)站不斷豐富和壯大的時候,也會變成多個子系統(tǒng)來支撐,這時就有按模塊和功能把表劃分出來的需求。其實,相對于垂直切分更進(jìn)一步的是服務(wù)化改造,說得簡單就是要把原來強(qiáng)耦合的系統(tǒng)拆分成多個弱耦合的服務(wù),通過服務(wù)間的調(diào)用來滿足業(yè)務(wù)需求看,因此表拆出來后要通過服務(wù)的形式暴露出去,而不是直接調(diào)用不同模塊的表,淘寶在架構(gòu)不斷演變過程,最重要的一環(huán)就是服務(wù)化改造,把用戶、交易、店鋪、寶貝這些核心的概念抽取成獨立的服務(wù),也非常有利于進(jìn)行局部的優(yōu)化和治理,保障核心模塊的穩(wěn)定性。
    垂直拆分:單表大數(shù)據(jù)量依然存在性能瓶頸。
  2. 水平拆分,上面談到垂直切分只是把表按模塊劃分到不同數(shù)據(jù)庫,但沒有解決單表大數(shù)據(jù)量的問題,而水平切分就是要把一個表按照某種規(guī)則把數(shù)據(jù)劃分到不同表或數(shù)據(jù)庫里。例如像計費系統(tǒng),通過按時間來劃分表就比較合適,因為系統(tǒng)都是處理某一時間段的數(shù)據(jù)。而像SaaS應(yīng)用,通過按用戶維度來劃分?jǐn)?shù)據(jù)比較合適,因為用戶與用戶之間的隔離的,一般不存在處理多個用戶數(shù)據(jù)的情況,簡單的按user_id范圍來水平切分。
  3. 通俗理解:水平拆分行,行數(shù)據(jù)拆分到不同表中, 垂直拆分列,表數(shù)據(jù)拆分到不同表中。

3、數(shù)據(jù)庫高并發(fā)的解決方案

  1. 在web服務(wù)框架中加入緩存。在服務(wù)器與數(shù)據(jù)庫層之間加入緩存層,將高頻訪問的數(shù)據(jù)存入緩存中,減少數(shù)據(jù)庫的讀取負(fù)擔(dān)。
  2. 增加數(shù)據(jù)庫索引。提高查詢速度。(不過索引太多會導(dǎo)致速度變慢,并且數(shù)據(jù)庫的寫入會導(dǎo)致索引的更新,也會導(dǎo)致速度變慢)
  3. 主從讀寫分離,讓主服務(wù)器負(fù)責(zé)寫,從服務(wù)器負(fù)責(zé)讀。
  4. 將數(shù)據(jù)庫進(jìn)行拆分,使得數(shù)據(jù)庫的表盡可能小,提高查詢的速度。
  5. 使用分布式架構(gòu),分散計算壓力。

4、什么是存儲過程?有哪些優(yōu)缺點?

存儲過程是事先經(jīng)過編譯并存儲在數(shù)據(jù)庫中的一段SQL語句的集合。進(jìn)一步地說,存儲過程是由一些T-SQL語句組成的代碼塊,這些T-SQL語句代碼像一個方法一樣實現(xiàn)一些功能(對單表或多表的增刪改查),然后再給這個代碼塊取一個名字,在用到這個功能的時候調(diào)用他就行了。

存儲過程具有以下特點:

  • 存儲過程只在創(chuàng)建時進(jìn)行編譯,以后每次執(zhí)行存儲過程都不需再重新編譯,而一般 SQL 語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行效率。
  • 當(dāng)SQL語句有變動時,可以只修改數(shù)據(jù)庫中的存儲過程而不必修改代碼。
  • 減少網(wǎng)絡(luò)傳輸,在客戶端調(diào)用一個存儲過程當(dāng)然比執(zhí)行一串SQL傳輸?shù)臄?shù)據(jù)量要小。
  • 通過存儲過程能夠使沒有權(quán)限的用戶在控制之下間接地存取數(shù)據(jù)庫,從而確保數(shù)據(jù)的安全。

5、視圖?游標(biāo)?

  1. 視圖是一種虛擬的表,通常是有一個表或者多個表的行或列的子集,具有和物理表相同的功能,可以對視圖進(jìn)行增,刪,改,查等操作。特別地,對視圖的修改不影響基本表。相比多表查詢,它使得我們獲取數(shù)據(jù)更容易。
  2. 游標(biāo)是對查詢出來的結(jié)果集作為一個單元來有效的處理。游標(biāo)可以定在該單元中的特定行,從結(jié)果集的當(dāng)前行檢索一行或多行??梢詫Y(jié)果集當(dāng)前行做修改。一般不使用游標(biāo),但是需要逐條處理數(shù)據(jù)的時候,游標(biāo)顯得十分重要。
  3. 在操作mysql的時候,我們知道MySQL檢索操作返回一組稱為結(jié)果集的行。這組返回的行都是與SQL語句相匹配的行(零行或多行)。使用簡單的 SELECT語句,例如,沒有辦法得到第一行、下一行或前 10行,也不存在每次一行地處理所有行的簡單方法(相對于成批地處理它們)。有時,需要在檢索出來的行中前進(jìn)或后退一行或多行。這就是使用游標(biāo)的原因。游標(biāo)(cursor)是一個存儲在MySQL服務(wù)器上的數(shù)據(jù)庫查詢,它不是一條 SELECT語句,而是被該語句檢索出來的結(jié)果集。在存儲了游標(biāo)之后,應(yīng)用程序可以根據(jù)需要滾動或瀏覽其中的數(shù)據(jù)。游標(biāo)主要用于交互式應(yīng)用,其中用戶需要滾動屏幕上的數(shù)據(jù),并對數(shù)據(jù)進(jìn)行瀏覽或做出更改。

6、超鍵 候選鍵 主鍵 外鍵

  1. 超鍵: 在關(guān)系中能唯一標(biāo)識元組(數(shù)據(jù)庫中的一條記錄)的屬性集稱為關(guān)系模式的超鍵。一個屬性可以作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。
  2. 候選鍵: 是最小超鍵,即沒有冗余元素的超鍵。
  3. 主鍵: 數(shù)據(jù)庫表中對儲存數(shù)據(jù)對象予以唯一和完整標(biāo)識的數(shù)據(jù)列或?qū)傩缘慕M合,用戶選作元組標(biāo)識的一個侯選鍵稱為主鍵。一個數(shù)據(jù)列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。
  4. 外鍵: 在一個表中存在的另一個表的主鍵稱此表的外鍵,外鍵主要是用來描述兩個表的關(guān)系。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3839

    瀏覽量

    64543
  • 計算機(jī)網(wǎng)絡(luò)

    關(guān)注

    3

    文章

    341

    瀏覽量

    22200
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    819

    瀏覽量

    26651
收藏 人收藏

    評論

    相關(guān)推薦

    mysql數(shù)據(jù)庫發(fā)展流程概述

    mysql數(shù)據(jù)庫基礎(chǔ)知識
    發(fā)表于 07-15 11:26

    MySQL數(shù)據(jù)庫基礎(chǔ)知識

    撩課-MySQL第1部分數(shù)據(jù)庫簡介
    發(fā)表于 08-12 14:17

    mysql數(shù)據(jù)庫操作指南

    mysql數(shù)據(jù)庫sql語句基礎(chǔ)知識
    發(fā)表于 09-18 09:06

    數(shù)據(jù)庫教程之PHP訪問MySQL數(shù)據(jù)庫的理論知識詳細(xì)說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是數(shù)據(jù)庫教程之PHP訪問MySQL數(shù)據(jù)庫的理論知識詳細(xì)說明包括了:1.phpMyAdmin的安裝和使用,2.PHP操作數(shù)據(jù)
    發(fā)表于 06-17 17:06 ?15次下載

    MySQL數(shù)據(jù)庫如何安裝和使用說明

    MySQL數(shù)據(jù)庫開發(fā) 基礎(chǔ)概念 1.數(shù)據(jù):描述事物特征的符號,屬性 2.數(shù)據(jù)庫的概念:管理計算機(jī)中的數(shù)據(jù)的倉庫 2.
    的頭像 發(fā)表于 02-13 16:13 ?2815次閱讀

    干貨:38個MySQL數(shù)據(jù)庫的必備知識和小技巧

    干貨:38個MySQL數(shù)據(jù)庫的必備知識和小技巧
    的頭像 發(fā)表于 08-31 13:08 ?2432次閱讀

    華為云數(shù)據(jù)庫-RDS for MySQL數(shù)據(jù)庫

    華為云數(shù)據(jù)庫-RDS for MySQL數(shù)據(jù)庫 華為云數(shù)據(jù)庫作為華為云的一款數(shù)據(jù)庫產(chǎn)品,它主要是以MyS
    的頭像 發(fā)表于 10-27 11:06 ?1548次閱讀

    最全數(shù)據(jù)庫-MySQL知識匯總1

    今天這節(jié)內(nèi)容是對MySQL數(shù)據(jù)庫在面試過程中遇到的一些高頻問題做一個總結(jié),可能你看完這篇文章就不需要專門去準(zhǔn)備數(shù)據(jù)庫相關(guān)的知識了。里面的內(nèi)容大多是我在面試過程中遇到的,大家都知道近兩年
    的頭像 發(fā)表于 02-23 14:27 ?346次閱讀

    最全數(shù)據(jù)庫-MySQL知識匯總2

    今天這節(jié)內(nèi)容是對MySQL數(shù)據(jù)庫在面試過程中遇到的一些高頻問題做一個總結(jié),可能你看完這篇文章就不需要專門去準(zhǔn)備數(shù)據(jù)庫相關(guān)的知識了。里面的內(nèi)容大多是我在面試過程中遇到的,大家都知道近兩年
    的頭像 發(fā)表于 02-23 14:27 ?396次閱讀

    最全數(shù)據(jù)庫-MySQL知識匯總4

    今天這節(jié)內(nèi)容是對MySQL數(shù)據(jù)庫在面試過程中遇到的一些高頻問題做一個總結(jié),可能你看完這篇文章就不需要專門去準(zhǔn)備數(shù)據(jù)庫相關(guān)的知識了。里面的內(nèi)容大多是我在面試過程中遇到的,大家都知道近兩年
    的頭像 發(fā)表于 02-23 14:27 ?324次閱讀

    MySQL數(shù)據(jù)庫管理與應(yīng)用

    MySQL數(shù)據(jù)庫管理與應(yīng)用 MySQL是一種廣泛使用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),被認(rèn)為是最流行和最常見的開源數(shù)據(jù)庫之一。它可以被用于多種不同的應(yīng)
    的頭像 發(fā)表于 08-28 17:15 ?999次閱讀

    MySQL數(shù)據(jù)庫基礎(chǔ)知識

    的基礎(chǔ)知識,包括其架構(gòu)、數(shù)據(jù)類型、表操作、查詢語句和數(shù)據(jù)導(dǎo)入導(dǎo)出等方面。 MySQL 數(shù)據(jù)庫架構(gòu) MyS
    的頭像 發(fā)表于 11-21 11:09 ?992次閱讀

    mysql數(shù)據(jù)庫基礎(chǔ)命令

    MySQL是一個流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),經(jīng)常用于存儲、管理和操作數(shù)據(jù)。在本文中,我們將詳細(xì)介紹MySQL的基礎(chǔ)命令,并提供與每個命令相關(guān)的詳細(xì)解釋。 登錄
    的頭像 發(fā)表于 12-06 10:56 ?613次閱讀

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—Mysql數(shù)據(jù)庫表記錄丟失的數(shù)據(jù)恢復(fù)流程

    Mysql數(shù)據(jù)庫故障: Mysql數(shù)據(jù)庫表記錄丟失。 Mysql數(shù)據(jù)庫故障表現(xiàn): 1、
    的頭像 發(fā)表于 12-16 11:05 ?189次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—<b class='flag-5'>Mysql</b><b class='flag-5'>數(shù)據(jù)庫</b>表記錄丟失的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)流程

    MySQL數(shù)據(jù)庫的安裝

    MySQL數(shù)據(jù)庫的安裝 【一】各種數(shù)據(jù)庫的端口 MySQL :3306 Redis :6379 MongoDB :27017 Django :8000 flask :5000 【二】
    的頭像 發(fā)表于 01-14 11:25 ?72次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>數(shù)據(jù)庫</b>的安裝