1. 程式人生 > 其它 >Parallels Desktop(PD17虛擬機器) | Mac 系統超好用的虛擬機器,不來試試嗎

Parallels Desktop(PD17虛擬機器) | Mac 系統超好用的虛擬機器,不來試試嗎

key:索引,事務

一、基本概念
1.主鍵、外來鍵、超鍵、候選鍵

2.為什麼用自增列作為主鍵(?)

3.觸發器的作用?
觸發器是一種特殊的儲存過程,主要是通過事件來觸發而被執行的。
它可以強化約束,來維護資料的完整性和一致性,可以跟蹤資料庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。

4.什麼是儲存過程?用什麼來呼叫?
儲存過程是一個預編譯的SQL語句,模組化,一次建立,多次呼叫,比單純SQL快

呼叫
1)可以用一個命令物件來呼叫儲存過程。
2)可以供外部程式呼叫,比如:java程式。

優點:
1)儲存過程是預編譯過的,執行效率高。
2)儲存過程的程式碼直接存放於資料庫中,通過儲存過程名直接呼叫,減少網路通訊。
3)安全性高,執行儲存過程需要有一定許可權的使用者。
4)儲存過程可以重複使用,可減少資料庫開發人員的工作量。

缺點:
移植性差

與函式的區別:

5.什麼叫檢視?遊標是什麼?
檢視:是一種虛擬的表,具有和物理表相同的功能。試圖通常是有一個表或者多個表的行或列的子集
優點:

1)對資料庫的訪問,因為檢視可以有選擇性的選取資料庫裡的一部分。

2)使用者通過簡單的查詢可以從複雜查詢中得到結果。

3)維護資料的獨立性,試圖可從多個表檢索資料。

4)對於相同的資料可產生不同的檢視。

缺點:

效能:查詢檢視時,必須把檢視的查詢轉化成對基本表的查詢,如果這個檢視是由一個複雜的多表查詢所定義,那麼,那麼就無法更改資料

遊標:是對查詢出來的結果集作為一個單元來有效的處理。需要逐條處理資料的時候,遊標顯得十分重要。(感覺像是迭代器)

6.drop、truncate、 delete區別

drop直接刪掉表。
truncate刪除表中資料,再插入時自增長id又從1開始。
delete刪除表中資料,可以加where字句。

7.什麼是臨時表,臨時表什麼時候刪除?
臨時表只在當前連線可見,當關閉連線時,MySQL會自動刪除表並釋放所有空間。

11.非關係型資料庫和關係型資料庫區別,優勢比較?

13.什麼是 內連線、外連線、交叉連線、笛卡爾積等?

14.varchar和char的使用場景?
1.char的長度是不可變的,而varchar的長度是可變的。
2.char的存取速度還是要比varchar要快得多,因為其長度固定,方便程式的儲存與查詢。
3.char的儲存方式是:對英文字元(ASCII)佔用1個位元組,對一個漢字佔用兩個位元組。char型別儲存的時候是初始預計字串再加上一個記錄字串長度的位元組,佔用空間較大。
varchar的儲存方式是:對每個英文字元佔用2個位元組,漢字也佔用2個位元組。varchar型別儲存的時候是實際字串再加上一個記錄字串長度的位元組,佔用空間較小。
4.兩者的儲存資料都非unicode的字元資料。

15.SQL語言分類
SQL語言共分為四大類:
資料查詢語言DQL
資料操縱語言DML
資料定義語言DDL
資料控制語言DCL。

16.like %和-的區別
萬用字元的分類
%百分號萬用字元:表示任何字元出現任意次數(可以是0次).
_下劃線萬用字元:表示只能匹配單個字元,不能多也不能少,就是一個字元.
like操作符: LIKE作用是指示mysql後面的搜尋模式是利用萬用字元而不是直接相等匹配進行比較.

17.count()、count(1)、count(column)的區別
count(
)對行的數目進行計算,包含NULL
count(column)對特定的列的值具有的行數進行計算,不包含NULL值。
count()還有一種使用方式,count(1)這個用法和count(*)的結果是一樣的。

18.最左字首原則(?)

二、索引
1.什麼是索引?
資料庫索引,是資料庫管理系統中一個排序的資料結構,索引的實現通常使用B樹及其變種B+樹。

協助快速查詢、更新資料庫表中資料。

一是增加了資料庫的儲存空間
二是在插入和修改資料時要花費較多的時間(因為索引也要隨之變動)。

4.哪些列適合建立索引、哪些不適合建索引?

5.什麼樣的欄位適合建索引
唯一、不為空、經常被查詢的欄位

6.MySQL B+Tree索引和Hash索引的區別?
B+樹索引需要從根節點到枝節點,hash索引一次到位

1.MySQL 索引使用有哪些注意事項呢?
索引哪些情況會失效,索引不適合哪些場景,索引規則

索引哪些情況會失效

查詢條件包含or,可能導致索引失效
如何欄位型別是字串,where時一定用引號括起來,否則索引失效
like萬用字元可能導致索引失效。
聯合索引,查詢時的條件列不是聯合索引中的第一個列,索引失效。
在索引列上使用mysql的內建函式,索引失效。
對索引列運算(如,+、-、*、/),索引失效。
索引欄位上使用(!= 或者 < >,not in)時,可能會導致索引失效。
索引欄位上使用is null, is not null,可能導致索引失效。
左連線查詢或者右連線查詢查詢關聯的欄位編碼格式不一樣,可能導致索引失效。
mysql估計使用全表掃描要比使用索引快,則不使用索引。

索引不適合哪些場景
資料量少的不適合加索引
更新比較頻繁的也不適合加索引
區分度低的欄位不適合加索引(如性別)

索引的一些潛規則
覆蓋索引
回表
索引資料結構(B+樹)
最左字首原則
索引下推

2.MySQL 遇到過死鎖問題
檢視死鎖日誌show engine innodb status;
找出死鎖Sql
分析sql加鎖情況
模擬死鎖案發
分析死鎖日誌
分析死鎖結果

3.怎麼優化SQL

4.分庫與分表的設計
5.InnoDB與MyISAM的區別

3.資料庫索引的原理,為什麼要用 B+樹,為什麼不用二叉樹?

為什麼不是一般二叉樹?
如果二叉樹特殊化為一個連結串列,相當於全表掃描。平衡二叉樹相比於二叉查詢樹來說,查詢效率更穩定,總體的查詢速度也更快。

為什麼不是平衡二叉樹呢?
B樹,可以儲存更多的節點資料,樹的高度也會降低,因此讀取磁碟的次數就降下來啦,查詢效率就快啦。

為什麼不是B樹而是B+樹呢?
B+樹非葉子節點上是不儲存資料的,僅儲存鍵值,而B樹節點中不僅儲存鍵值,也會儲存資料。
B+樹索引的所有資料均儲存在葉子節點,而且資料是按照順序排列的,連結串列連著的。那麼B+樹使得範圍查詢,排序查詢,分組查詢以及去重查詢變得異常簡單。

7.聚集索引與非聚集索引的區別
一個表中只能擁有一個聚集索引,而非聚集索引一個表可以存在多個。
聚集索引,索引中鍵值的邏輯順序決定了表中相應行的物理順序;非聚集索引,索引中索引的邏輯順序與磁碟上行的物理儲存順序不同。
索引是通過二叉樹的資料結構來描述的,我們可以這麼理解聚簇索引:索引的葉節點就是資料節點。而非聚簇索引的葉節點仍然是索引節點,只不過有一個指標指向對應的資料塊。
聚集索引:物理儲存按照索引排序;非聚集索引:物理儲存不按照索引排序;

何時使用聚集索引或非聚集索引?

8.limit 1000000 載入很慢的話,你是怎麼解決的呢?

9.如何選擇合適的分散式主鍵方案

10.事務的隔離級別有哪些?MySQL的預設隔離級別是什麼?
讀未提交(Read Uncommitted)
讀已提交(Read Committed)
可重複讀(Repeatable Read)
序列化(Serializable)
Mysql預設的事務隔離級別是可重複讀(Repeatable Read)

11.什麼是幻讀,髒讀,不可重複讀呢

平衡二叉樹,b樹,b+樹,紅黑樹

\12. 在高併發情況下,如何做到安全的修改同一行資料?(樂觀鎖和悲觀鎖)
悲觀鎖思想就是,當前執行緒要進來修改資料時,別的執行緒都得拒之門外

樂觀鎖思想就是,有執行緒過來,先放過去修改,如果看到別的執行緒沒修改過,就可以修改成功,如果別的執行緒修改過,就修改失敗或者重試。實現方式:樂觀鎖一般會使用版本號機制或CAS演算法實現。

\13. SQL優化的一般步驟是什麼,怎麼看執行計劃(explain),如何理解其中各個欄位的含義。

show status 命令瞭解各種 sql 的執行頻率
通過慢查詢日誌定位那些執行效率較低的 sql 語句
explain 分析低效 sql 的執行計劃

14.select for update有什麼含義,會鎖表還是鎖行還是其他。
查詢+加悲觀鎖+沒用索引/主鍵的話就是表鎖,否則就是是行鎖。

15.MySQL事務得四大特性以及實現原理

原子性:是使用 undo log來實現的,如果事務執行過程中出錯或者使用者執行了rollback,系統通過undo log日誌返回事務開始的狀態。
永續性:使用 redo log來實現,只要redo log日誌持久化了,當系統崩潰,即可通過redo log把資料恢復。
隔離性:通過鎖以及MVCC,使事務相互隔離開。
一致性:通過回滾、恢復,以及併發情況下的隔離性,從而實現一致性。

16.如果某個表有近千萬資料,CRUD比較慢,如何優化。
分庫分表(存在相關問題:分表方案、中介軟體、解決方案等)、優化表結構、索引優化

17.如何寫sql能夠有效的使用到複合索引
使用者可以在多個列上建立索引,這種索引叫做複合索引。

需要關注查詢Sql條件的順序,確保最左匹配原則有效,同時可以刪除不必要的冗餘索引。

18.mysql中in 和exists的區別
主查詢A,次查詢B
in先b後a,exists先a後b
B的資料量小於A,適合使用in,如果B的資料量大於A,即適合選擇exists

\19. 資料庫自增主鍵可能遇到什麼問題
做分庫分表,可能出現諸如主鍵重複等的問題。解決方案的話,簡單點的話可以考慮使用UUID哈
自增主鍵會產生表鎖,從而引發問題
自增主鍵可能用完問題。

20.MVCC熟悉嗎,它的底層原理
MVCC,多版本併發控制,它是通過讀取歷史版本的資料,來降低併發事務衝突,從而提高併發效能的一種機制。
知識點:
事務版本號
表的隱藏列
undo log
read view

21.資料庫中介軟體瞭解過嗎,sharding jdbc,mycat?

22.MYSQL的主從延遲,你怎麼解決

主從同步延遲的原因

主從同步延遲的解決辦法

❝Mysql主從有什麼優點?為什麼要選擇主從?❞
高效能方面:主從複製通過水平擴充套件的方式,解決了原來單點故障的問題,並且原來的併發都集中到了一臺Mysql伺服器中,現在將單點負載分散到了多臺機器上,實現讀寫分離,不會因為寫操作過長鎖表而導致讀服務不能進行的問題,提高了伺服器的整體效能。
可靠性方面:主從在對外提供服務的時候,若是主庫掛了,會有通過主從切換,選擇其中的一臺Slave作為Master;若是Slave掛了,還有其它的Slave提供讀服務,提高了系統的可靠性和穩定性。

❝若是主從複製,達到了寫效能的瓶頸,你是怎麼解決的呢?❞
主從模式對於寫少讀多的場景確實非常大的優勢,但是總會寫操作達到瓶頸的時候,導致效能提不上去。

這時候可以在設計上進行解決採用分庫分表的形式,對於業務資料比較大的資料庫可以採用分表,使得資料表的儲存的資料量達到一個合理的狀態。

也可以採用分庫,按照業務進行劃分,這樣對於單點的寫,就會分成多點的寫,效能方面也就會大大提高。

❝主從複製的過程有資料延遲怎麼辦?導致Slave被讀取到的資料並不是最新資料。❞
主從複製有不同的複製策略,對於不同的場景的適應性也不同,對於資料的實時性要求很高,要求強一致性,可以採用同步複製策略,但是這樣就會效能就會大打折扣。

若是主從複製採用非同步複製,要求資料最終一致性,效能方面也會好很多。只能說,對於資料延遲的解決方案沒有最好的方案,就看你的業務場景中哪種方案使比較適合的。

23.大表查詢的優化方案
優化shema、sql語句+索引;
可以考慮加快取,memcached, redis,或者JVM本地快取;
主從複製,讀寫分離;
分庫分表;

24.什麼是資料庫連線池?為什麼需要資料庫連線池呢?
「連線池基本原理:」 資料庫連線池原理:在內部物件池中,維護一定數量的資料庫連線,並對外暴露資料庫連線的獲取和返回方法。

「應用程式和資料庫建立連線的過程:」

通過TCP協議的三次握手和資料庫伺服器建立連線
傳送資料庫使用者賬號密碼,等待資料庫驗證使用者身份
完成身份驗證後,系統可以提交SQL語句到資料庫執行
把連線關閉,TCP四次揮手告別。
「資料庫連線池好處:」

資源重用 (連線複用)
更快的系統響應速度
新的資源分配手段
統一的連線管理,避免資料庫連線洩漏

25.一條SQL語句在MySQL中如何執行的

第一層負責連線處理,授權認證,安全等等
第二層負責編譯並優化SQL
第三層是儲存引擎。

26.InnoDB引擎中的索引策略
覆蓋索引
最左字首原則
索引下推

27.資料庫儲存日期格式時,如何考慮時區轉換問題?
datetime型別適合用來記錄資料的原始的建立時間,修改記錄中其他欄位的值,datetime欄位的值不會改變,除非手動修改它。
timestamp型別適合用來記錄資料的最後修改時間,只要修改了記錄中其他欄位的值,timestamp欄位的值都會被自動更新。

28.一條sql執行過長的時間,你如何優化,從哪些方面入手?
檢視是否涉及多表和子查詢,優化Sql結構,如去除冗餘欄位,是否可拆表等
優化索引結構,看是否可以適當新增索引
數量大的表,可以考慮進行分離/分表(如交易流水錶)
資料庫主從分離,讀寫分離
explain分析sql語句,檢視執行計劃,優化sql
檢視mysql執行日誌,分析是否有其他方面的問題

29.MYSQL資料庫伺服器效能分析的方法命令有哪些?

30.Blob和text有什麼區別
Blob用於儲存二進位制資料,而Text用於儲存大字串。
Blob值被視為二進位制字串(位元組字串),它們沒有字符集,並且排序和比較基於列值中的位元組的數值。
text值被視為非二進位制字串(字元字串)。它們有一個字符集,並根據字符集的排序規則對值進行排序和比較。

31.mysql裡記錄貨幣用什麼欄位型別比較好
Decimal和Numric型別

32.Mysql中有哪幾種鎖

33.Hash索引和B+樹區別是什麼?你在設計索引是怎麼抉擇的?
B+樹可以進行範圍查詢,Hash索引不能。
B+樹支援聯合索引的最左側原則,Hash索引不支援。
B+樹支援order by排序,Hash索引不支援。
Hash索引在等值查詢上比B+樹效率更高。
B+樹使用like 進行模糊查詢的時候,like後面(比如%開頭)的話可以起到優化的作用,Hash索引根本無法進行模糊查詢。

36.mysql有關許可權的表有哪幾個呢
MySQL伺服器通過許可權表來控制使用者對資料庫的訪問,許可權表存放在mysql資料庫裡,由mysql_install_db指令碼初始化。這些許可權表分別user,db,table_priv,columns_priv和host。

37.Mysql的binlog有幾種錄入格式?分別有什麼區別?
statement,row和mixed。

38.InnoDB引擎的4大特性
插入緩衝(insert buffer)
二次寫(double write)
自適應雜湊索引(ahi)
預讀(read ahead)

39.索引有哪些優缺點
「優點:」

唯一索引可以保證資料庫表中每一行的資料的唯一性
索引可以加快資料查詢速度,減少查詢時間
「缺點:」

建立索引和維護索引要耗費時間
索引需要佔物理空間,除了資料表佔用資料空間之外,每一個索引還要佔用一定的物理空間
以表中的資料進行增、刪、改的時候,索引也要動態的維護。

索引有哪幾種類型
主鍵索引: 資料列不允許重複,不允許為NULL,一個表只能有一個主鍵。
唯一索引: 資料列不允許重複,允許為NULL值,一個表允許多個列建立唯一索引。
普通索引: 基本的索引型別,沒有唯一性的限制,允許為NULL值。
全文索引:是目前搜尋引擎使用的一種關鍵技術,對文字的內容進行分詞、搜尋。
覆蓋索引:查詢列要被所建的索引覆蓋,不必讀取資料行
組合索引:多列值組成一個索引,用於組合搜尋,效率大於索引合併

建立索引有什麼原則呢

最左字首匹配原則
頻繁作為查詢條件的欄位才去建立索引
頻繁更新的欄位不適合建立索引
索引列不能參與計算,不能有函式操作
優先考慮擴充套件索引,而不是新建索引,避免不必要的索引
在order by或者group by子句中,建立索引需要注意順序
區分度低的資料列不適合做索引列(如性別)
定義有外來鍵的資料列一定要建立索引。
對於定義為text、image資料型別的列不要建立索引。
刪除不再使用或者很少使用的索引

40.百萬級別或以上的資料,你是如何刪除的?
我們想要刪除百萬資料的時候可以先刪除索引
然後批量刪除其中無用資料
刪除完成後重新建立索引。

41.什麼是最左字首原則?什麼是最左匹配原則?
最左字首原則,就是最左優先,在建立多列索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊。
當我們建立一個組合索引的時候,如(k1,k2,k3),相當於建立了(k1)、(k1,k2)和(k1,k2,k3)三個索引,這就是最左匹配原則。

42.B樹和B+樹的區別,資料庫為什麼使用B+樹而不是B樹?

43.覆蓋索引、回表等這些,瞭解過嗎
覆蓋索引: 查詢列要被所建的索引覆蓋,不必從資料表中讀取,換句話說查詢列要被所使用的索引覆蓋。
回表:二級索引無法直接查詢所有列的資料,所以通過二級索引查詢到聚簇索引後,再查詢到想要的資料,這種通過二級索引查詢出來的過程,就叫做回表。

44.B+樹在滿足聚簇索引和覆蓋索引的時候不需要回表查詢資料?
不用

45.非聚簇索引一定會回表查詢嗎
不一定,如果查詢語句的欄位全部命中了索引,那麼就不必再進行回表查詢

46.組合索引是什麼?為什麼需要注意組合索引中的順序?
組合索引,使用者可以在多個列上建立索引,這種索引叫做組合索引。

因為InnoDB引擎中的索引策略的最左原則,所以需要注意組合索引中的順序。

47.什麼是資料庫事務

48.隔離級別與鎖的關係
先闡述四種隔離級別,再闡述它們的實現原理。隔離級別就是依賴鎖和MVCC實現的。

49.從鎖的類別角度講,MySQL都有哪些鎖呢?
共享鎖,排它鎖

50.MySQL中InnoDB引擎的行鎖是怎麼實現的?
索引for update

51.為什麼要使用檢視?什麼是檢視?
為了提高複雜SQL語句的複用性和表操作的安全性
虛擬的表

檢視有哪些特點?哪些使用場景?

優點缺點

52.count(1)、count() 與 count(列名) 的區別?
count(
)包括了所有的列,相當於行數,在統計結果的時候,不會忽略列值為NULL
count(1)包括了忽略所有列,用1代表程式碼行,在統計結果的時候,不會忽略列值為NULL

count(列名)只包括列名那一列,在統計結果的時候,會忽略列值為空(這裡的空不是隻空字串或者0,而是表示null)的計數,即某個欄位值為NULL時,不統計。

MySQL中都有哪些觸發器
Before Insert
After Insert
Before Update
After Update
Before Delete
After Delete

56.mysql中int(20)和char(20)以及varchar(20)的區別
int(20) 表示欄位是int型別,顯示長度是 20
char(20)表示欄位是固定長度字串,長度為 20
varchar(20) 表示欄位是可變長度字串,長度為 20

57.drop、delete與truncate的區別

58.UNION與UNION ALL的區別
Union:對兩個結果集進行並集操作,不包括重複行,同時進行預設規則的排序;
Union All:對兩個結果集進行並集操作,包括重複行,不進行排序;
UNION的效率高於 UNION ALL

59.SQL的生命週期
伺服器與資料庫建立連線
資料庫程序拿到請求sql
解析並生成執行計劃,執行
讀取資料到記憶體,並進行邏輯處理
通過步驟一的連線,傳送結果到客戶端
關掉連線,釋放資源

61.列值為NULL時,查詢是否會用到索引
可以 但會增加難度和開銷

62.關心過業務系統裡面的sql耗時嗎?統計過慢查詢嗎?對慢查詢都怎麼優化過?
「優化慢查詢:」

分析語句,是否載入了不必要的欄位/資料。
分析SQl執行句話,是否命中索引等。
如果SQL很複雜,優化SQL結構
如果表資料量太大,考慮分表

63.主鍵使用自增ID還是UUID,為什麼?
如果是單機的話,選擇自增ID;如果是分散式系統,優先考慮UUID吧,但還是最好自己公司有一套分散式唯一ID生產方案吧。

自增ID:資料儲存空間小,查詢效率高。但是如果資料量過大,會超出自增長的值範圍,多庫合併,也有可能有問題。
uuid:適合大量資料的插入和更新操作,但是它無序的,插入資料效率慢,佔用空間大。

64.mysql自增主鍵用完了怎麼辦
提前分庫分表

65.欄位為什麼要求定義為not null
null值會佔用更多的位元組,並且null有很多坑的

66.如果要儲存使用者的密碼雜湊,應該使用什麼欄位進行儲存?
char

67.Mysql驅動程式是什麼
Mysql驅動程式主要幫助程式語言與 MySQL服務端進行通訊,如連線、傳輸資料、關閉等。

68.如何優化長難的查詢語句?
將一個大的查詢分為多個小的相同的查詢
減少冗餘記錄的查詢。
一個複雜查詢可以考慮拆成多個簡單查詢
分解關聯查詢,讓快取的效率更高。

69.優化特定型別的查詢語句

70.MySQL資料庫cpu飆升的話,要怎麼處理呢?

71.讀寫分離常見方案

72.500臺db,在最快時間之內重啟
可以使用批量 ssh 工具 pssh 來對需要重啟的機器執行重啟命令。
也可以使用 salt(前提是客戶端有安裝 salt)或者 ansible( ansible 只需要 ssh 免登通了就行)等多執行緒工具同時操作多臺服務

73.你們資料庫是否支援emoji表情儲存,如果不支援,如何操作?
更換字符集utf8-->utf8mb4

74.Mysql一條SQL加鎖分析
組合一:id列是主鍵,RC隔離級別
組合二:id列是二級唯一索引,RC隔離級別
組合三:id列是二級非唯一索引,RC隔離級別
組合四:id列上沒有索引,RC隔離級別
組合五:id列是主鍵,RR隔離級別
組合六:id列是二級唯一索引,RR隔離級別
組合七:id列是二級非唯一索引,RR隔離級別
組合八:id列上沒有索引,RR隔離級別
組合九:Serializable隔離級別