阿里面試官必問的12個MySQL數據庫基礎知識,哪些你還不知道?

目錄

數據庫基礎知識

1、爲什麼要使用數據庫

2、什麼是SQL?

3、什麼是MySQL?

4、數據庫三大範式是什麼

5、MySQL有關權限的表都有哪幾個

6、MySQL的binlog有有幾種錄入格式?分別有什麼區別?

數據類型

引擎

1、MySQL存儲引擎MyISAM與InnoDB區別

2、MyISAM與InnoDB區別

2、MyISAM索引與InnoDB索引的區別?

3、InnoDB引擎的4大特性

4、存儲引擎選擇

最後


數據庫基礎知識

1、爲什麼要使用數據庫

(1)數據保存在內存

優點: 存取速度快

缺點: 數據不能永久保存

(2)數據保存在文件

優點: 數據永久保存

缺點:

1)速度比內存操作慢,頻繁的IO操作。

2)查詢數據不方便

(3)數據保存在數據庫

1)數據永久保存

2)使用SQL語句,查詢方便效率高。

3)管理數據方便

2、什麼是SQL?

結構化查詢語言(Structured Query Language)簡稱SQL,是一種數據庫查詢語言。

作用:用於存取數據、查詢、更新和管理關係數據庫系統。

3、什麼是MySQL?

MySQL是一個關係型數據庫管理系統,由瑞典MySQL AB 公司開發,屬於 Oracle 旗下產品。MySQL 是最流行的關係型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係數據庫管理系統) 應用軟件之一。在Java企業級開發中非常常用,因爲 MySQL 是開源免費的,並且方便擴展。

4、數據庫三大範式是什麼

第一範式:每個列都不可以再拆分。

第二範式:在第一範式的基礎上,非主鍵列完全依賴於主鍵,而不能是依賴於主鍵的一部分。

第三範式:在第二範式的基礎上,非主鍵列只依賴於主鍵,不依賴於其他非主鍵。

在設計數據庫結構的時候,要儘量遵守三範式,如果不遵守,必須有足夠的理由。比如性能。事實上我們經常會爲了性能而妥協數據庫的設計。

5、MySQL有關權限的表都有哪幾個

MySQL服務器通過權限表來控制用戶對數據庫的訪問,權限表存放在mysql數據庫裏,由mysql_install_db腳本初始化。這些權限表分別user,db,table_priv,columns_priv和host。下面分別介紹一下這些表的結構和內容:

  • user權限表:記錄允許連接到服務器的用戶帳號信息,裏面的權限是全局級的。
  • db權限表:記錄各個帳號在各個數據庫上的操作權限。
  • table_priv權限表:記錄數據表級的操作權限。
  • columns_priv權限表:記錄數據列級的操作權限。
  • host權限表:配合db權限表對給定主機上數據庫級操作權限作更細緻的控制。這個權限表不受GRANT和REVOKE語句的影響。

6、MySQL的binlog有有幾種錄入格式?分別有什麼區別?

有三種格式,statement,row和mixed。

  • statement模式下,每一條會修改數據的sql都會記錄在binlog中。不需要記錄每一行的變化,減少了binlog日誌量,節約了IO,提高性能。由於sql的執行是有上下文的,因此在保存的時候需要保存相關的信息,同時還有一些使用了函數之類的語句無法被記錄複製。
  • row級別下,不記錄sql語句上下文相關信息,僅保存哪條記錄被修改。記錄單元爲每一行的改動,基本是可以全部記下來但是由於很多操作,會導致大量行的改動(比如alter table),因此這種模式的文件保存的信息太多,日誌量太大。
  • mixed,一種折中的方案,普通操作使用statement記錄,當無法使用statement的時候使用row。

此外,新版的MySQL中對row級別也做了一些優化,當表結構發生變化的時候,會記錄語句而不是逐行記錄。

數據類型

mysql有哪些數據類型

1、整數類型,包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分別表示1字節、2字節、3字節、4字節、8字節整數。任何整數類型都可以加上UNSIGNED屬性,表示數據是無符號的,即非負整數。

長度:整數類型可以被指定長度,例如:INT(11)表示長度爲11的INT類型。長度在大多數場景是沒有意義的,它不會限制值的合法範圍,只會影響顯示字符的個數,而且需要和UNSIGNED ZEROFILL屬性配合使用纔有意義。

例子,假定類型設定爲INT(5),屬性爲UNSIGNED ZEROFILL,如果用戶插入的數據爲12的話,那麼數據庫實際存儲數據爲00012。

2、實數類型,包括FLOAT、DOUBLE、DECIMAL。

DECIMAL可以用於存儲比BIGINT還大的整型,能存儲精確的小數。

而FLOAT和DOUBLE是有取值範圍的,並支持使用標準的浮點進行近似計算。

計算時FLOAT和DOUBLE相比DECIMAL效率更高一些,DECIMAL你可以理解成是用字符串進行處理。

3、字符串類型,包括VARCHAR、CHAR、TEXT、BLOB

VARCHAR用於存儲可變長字符串,它比定長類型更節省空間。

VARCHAR使用額外1或2個字節存儲字符串長度。列長度小於255字節時,使用1字節表示,否則使用2字節表示。

VARCHAR存儲的內容超出設置的長度時,內容會被截斷。

CHAR是定長的,根據定義的字符串長度分配足夠的空間。

CHAR會根據需要使用空格進行填充方便比較。

CHAR適合存儲很短的字符串,或者所有值都接近同一個長度。

CHAR存儲的內容超出設置的長度時,內容同樣會被截斷。

使用策略:

對於經常變更的數據來說,CHAR比VARCHAR更好,因爲CHAR不容易產生碎片。

對於非常短的列,CHAR比VARCHAR在存儲空間上更有效率。

使用時要注意只分配需要的空間,更長的列排序時會消耗更多內存。

儘量避免使用TEXT/BLOB類型,查詢時會使用臨時表,導致嚴重的性能開銷。

4、枚舉類型(ENUM),把不重複的數據存儲爲一個預定義的集合。

有時可以使用ENUM代替常用的字符串類型。

ENUM存儲非常緊湊,會把列表值壓縮到一個或兩個字節。

ENUM在內部存儲時,其實存的是整數。

儘量避免使用數字作爲ENUM枚舉的常量,因爲容易混亂。

排序是按照內部存儲的整數

5、日期和時間類型,儘量使用timestamp,空間效率高於datetime,

用整數保存時間戳通常不方便處理。

如果需要存儲微妙,可以使用bigint存儲。

看到這裏,這道真題是不是就比較容易回答了。

引擎

1、MySQL存儲引擎MyISAM與InnoDB區別

存儲引擎Storage engine:MySQL中的數據、索引以及其他對象是如何存儲的,是一套文件系統的實現。

常用的存儲引擎有以下:

  • Innodb引擎:Innodb引擎提供了對數據庫ACID事務的支持。並且還提供了行級鎖和外鍵的約束。它的設計的目標就是處理大數據容量的數據庫系統。
  • MyIASM引擎(原本Mysql的默認引擎):不提供事務的支持,也不支持行級鎖和外鍵。
  • MEMORY引擎:所有的數據都在內存中,數據的處理速度快,但是安全性不高。

2、MyISAM與InnoDB區別

2、MyISAM索引與InnoDB索引的區別?

  • InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
  • InnoDB的主鍵索引的葉子節點存儲着行數據,因此主鍵索引非常高效。
  • MyISAM索引的葉子節點存儲的是行數據地址,需要再尋址一次才能得到數據。
  • InnoDB非主鍵索引的葉子節點存儲的是主鍵和其他帶索引的列數據,因此查詢時做到覆蓋索引會非常高效。

3、InnoDB引擎的4大特性

  • 插入緩衝(insert buffer)
  • 二次寫(double write)
  • 自適應哈希索引(ahi)
  • 預讀(read ahead)

4、存儲引擎選擇

如果沒有特別的需求,使用默認的Innodb即可。

MyISAM:以讀寫插入爲主的應用程序,比如博客系統、新聞門戶網站。

Innodb:更新(刪除)操作頻率也高,或者要保證數據的完整性;併發量高,支持事務和外鍵。比如OA自動化辦公系統。

 

最後

歡迎關注公衆號:程序員追風,領取Java知識點學習思維導圖總結+一線大廠Java面試題總結+一份300頁pdf文檔的Java核心知識點總結!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章