面试题—Mysql篇
生活随笔
收集整理的這篇文章主要介紹了
面试题—Mysql篇
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、主鍵 超鍵 候選鍵 外鍵
- 主 鍵:數據唯一標志,一張表只能有一個主鍵且主鍵的取值不能為空值(Null)
- 超 鍵:在關系中能唯一標識元組的屬性集稱為關系模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。
- 候選鍵:是最小超鍵,即沒有冗余元素的超鍵。
- 外 鍵:在一個表中存在的另一個表的主鍵稱此表的外鍵。
2、視圖是什么
- 一個虛擬表,是sql的查詢結果,其內容由查詢定義,在使用視圖時視圖數據是動態生成。視圖的數據變化會影響到基表,基表的數據變化也會影響到視圖
3、緩存
- 原理與外接緩存redis差不多
4、事務
- ACID規則:原子性、一致性、隔離性、持久性
- 臟讀、幻讀、不可重復讀:
- 事務隔離級別:READ_UNCOMMITTED(未授權讀取)、READ_COMMITTED(授權讀取)、REPEATABLE_READ(可重復讀)、SERIALIZABLE(串行)
5、鎖
- 表鎖:Mysql中鎖定?粒度最大?的一種鎖,MyISAM采用表級鎖
- 行鎖:Mysql中鎖定?粒度最小?的一種鎖,InnoDB采用行鎖;行鎖算法有3中,包括RecordLock單個行記錄上的鎖、GapLock間隙鎖、record+gap 鎖定一個范圍包含記錄本身
6、存儲過程與觸發器的區別
- 觸發器與存儲過程都是SQL語句集,觸發器主要是通過事件執行觸發而被執行的,而存儲過程可以通過存儲過程名稱名字而直接調用。
7、drop,delete與truncate的區別
- drop:刪除表結構;
- truncate:清空表中數據,再插入時自增長id又從1開始;truncate表和索引所占用的空間會恢復到初始大小;
- delete:與where配合使用刪除表中指定行的數據;delete不帶where的話與truncate作用一致,但truncate比delete速度快;
- drop、truncate是DDL(data define language),操作立即生效,原數據不放到 rollback segment中,不能回滾;
- delete語句為DML(data maintain Language),這個操作會被放到 rollback segment中,事務提交后才生效。如果有相應的 tigger,執行的時候將被觸發。
8、表連接
- 內連接:取兩個表的交集?
- 外連接:左連接left join、右連接right join、全連接full join(oracle提供了full join,mysql沒有full join可以用union替換
?
?
9、存儲引擎
- MyISAM:B+Tree葉節點保存的地址
- InnoDB:B+Tree葉節點保存的是數據,索引的key是表的主鍵(一般為id)。輔助索引的data域存儲相應記錄主鍵的值而不是地址
10、索引
- 索引原理:數據庫管理系統中一個排序的數據結構,這個數據結構一般是使用B樹或B+樹,以協助快速查詢、更新數據庫表中數據。
- BTree索引:大部分場景,建議選擇BTree索引
- 哈希索引:底層數據結構是hash表,適合絕大多數需求為單條記錄查詢
11、B-/+Tree結構區別及性能差異
- B+Tree節點關鍵詞搜索采用了左閉合區間
- B+Tree非葉子節點不保存數據相關信息,只保存關鍵字和子節點的引用
- B+Tree關鍵字對應的數據保存在葉子結點;
- B+Tree葉子節點是順序排列的,并且相鄰節點通過鏈表連接
12、索引設計原則:
- 一個表的索引數一般不超過5個;一個索引里包含的列數最好也不要超過5個
- 聯合索引中,把過濾性高(基數大)的列放在前面。
13、局部性原理與磁盤預讀:
- 為了盡量減少磁盤I/O,磁盤往往不是嚴格按需讀取,而是每次都會預讀,即使只需要一個字節,磁盤也會從這個位置開始,順序向后讀取一定長度的數據放入內存。這樣做的理論依據是計算機科學中著名的局部性原理:當一個數據被用到時,其附近的數據也通常會馬上被使用。程序運行期間所需要的數據通常比較集中。
14、數據庫優化思路
- sql語句優化:避免在 where 中使用!=或<>操作符和否則全盤掃描;避免在 where 子句中對字段進行 null 值判斷,否則全盤掃描;用Where子句替換HAVING 子句,因為HAVING 只會在檢索出所有記錄之后才對結果集進行過濾
- 索引優化:
- 數據庫結構優化:讀寫分離、分庫分表
- 硬件優化
15、大表優化
- 限制數據查詢范圍:務必禁止不帶任何限制數據范圍條件的查詢語句
- 讀寫分離:主庫負責寫,從庫負責讀
- 緩存:?使用MySQL的緩存,另外對重量級、更新少的數據可以考慮使用應用級別的緩存;
- 分庫分表:垂直拆分按業務類型拆分,專庫專用,可以使行數據變小,弊端是查詢時可能會導致join操作;水平拆分將單一數據表橫切成多張表,比如按時間段進行切分,可以支持大量數據存儲;
總結
以上是生活随笔為你收集整理的面试题—Mysql篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划—完全背包问题
- 下一篇: 面试题—Redis篇