天天看點

阿裡面試官必問的12個MySQL資料庫基礎知識,哪些你還不知道?

資料庫基礎知識

  • 為什麼要使用資料庫
  • 什麼是SQL?
  • 什麼是MySQL?
  • 資料庫三大範式是什麼
  • mysql有關權限的表都有哪幾個
  • MySQL的binlog有有幾種錄入格式?分别有什麼差別?

資料類型

  • mysql有哪些資料類型

引擎

  • MySQL存儲引擎MyISAM與InnoDB差別
  • MyISAM索引與InnoDB索引的差別?
  • InnoDB引擎的4大特性
  • 存儲引擎選擇

(1)資料儲存在記憶體

優點: 存取速度快

缺點: 資料不能永久儲存

(2)資料儲存在檔案

優點: 資料永久儲存

缺點:

1)速度比記憶體操作慢,頻繁的IO操作。

2)查詢資料不友善

(3)資料儲存在資料庫

1)資料永久儲存

2)使用SQL語句,查詢友善效率高。

3)管理資料友善

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

作用:用于存取資料、查詢、更新和管理關系資料庫系統。

MySQL是一個關系型資料庫管理系統,由瑞典MySQL AB 公司開發,屬于 Oracle 旗下産品。MySQL 是最流行的關系型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關系資料庫管理系統) 應用軟體之一。在Java企業級開發中非常常用,因為 MySQL 是開源免費的,并且友善擴充。

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

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

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

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

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

MySQL伺服器通過權限表來控制使用者對資料庫的通路,權限表存放在mysql資料庫裡,由mysql_install_db腳本初始化。這些權限表分别user,db,table_priv,columns_priv和host。下面分别介紹一下這些表的結構和内容:歡迎關注公種浩:程式員追風,領取一線大廠Java面試題總結+各知識點學習思維導圖+一份300頁pdf文檔的Java核心知識點總結!

  • user權限表:記錄允許連接配接到伺服器的使用者帳号資訊,裡面的權限是全局級的。
  • db權限表:記錄各個帳号在各個資料庫上的操作權限。
  • table_priv權限表:記錄資料表級的操作權限。
  • columns_priv權限表:記錄資料列級的操作權限。
  • host權限表:配合db權限表對給定主機上資料庫級操作權限作更細緻的控制。這個權限表不受GRANT和REVOKE語句的影響。

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

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

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

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事務的支援。并且還提供了行級鎖和外鍵的限制。它的設計的目标就是處理大資料容量的資料庫系統。歡迎關注公種浩:程式員追風,領取一線大廠Java面試題總結+各知識點學習思維導圖+一份300頁pdf文檔的Java核心知識點總結!
  • MyIASM引擎(原本Mysql的預設引擎):不提供事務的支援,也不支援行級鎖和外鍵。
  • MEMORY引擎:所有的資料都在記憶體中,資料的處理速度快,但是安全性不高。

2、MyISAM與InnoDB差別

3、MyISAM索引與InnoDB索引的差別?

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

4、InnoDB引擎的4大特性

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

5、存儲引擎選擇

如果沒有特别的需求,使用預設的Innodb即可。

MyISAM:以讀寫插入為主的應用程式,比如部落格系統、新聞門戶網站。

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

最後

歡迎大家一起交流,喜歡文章記得關注我點個贊喲,ganxe感謝支援