目錄
6、MySQL的binlog有有幾種錄入格式?分別有什麼區別?
數據庫基礎知識
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核心知識點總結!