說一下mysql比較宏觀的面試,具體咋寫sql的這裏就不過多舉例了。後面我還會給出一個關於mysql面試優化的試題,這裏主要說的索引和B+Tree結構,不多提到咱們的集羣配置優化方案。html
1.索引是什麼?有什麼做用以及缺點mysql
答:索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。也能夠理解爲索引就是一本書的目錄,建立索引和維護索引要耗費時間,這種時間隨着數據量的增長而增長。索引須要佔物理空間,除了數據表佔數據空間以外,每個索引還要佔必定的物理空間,若是要創建彙集索引那麼須要的空間就會更大。面試
2.索引的目的是什麼redis
答:爲了高效的查找獲得咱們所須要的數據,減小分組和排序時間,提升咱們的mysql的性能sql
3.索引對數據庫系統的負面影響數據庫
答:雖然索引對於數據庫的查詢提升了效率,但必定程度上增長了空間的佔用,同時寫入的速度下降了很多,和原有寫入數據相比較,多了一步去維護索引的操做。緩存
4.創建索引的原則併發
答:選擇惟一性索引,爲常常須要查詢、排序、分組和聯合操做的字段創建索引,限制索引的數目,最左前綴匹配原則(很是重要的原則),儘可能選擇區分度高的列做爲索引,字段盡力設置不爲null,索引列上不計算。函數
5.主鍵、外鍵和惟一索引的區別高併發
答:定義:
主鍵:惟一標識一條記錄,不能有重複的,不容許爲空
外鍵:表的外鍵是另外一表的主鍵, 外鍵能夠有重複的, 能夠是空值
索引:該字段沒有重複值,但能夠有空值
做用:
主鍵:用來保證數據完整性
外鍵:用來和其餘表創建聯繫用的
索引:是提升查詢排序的速度
個數:
主鍵:主鍵只能有一個
外鍵:一個表能夠有多個外鍵
索引:一個表能夠有多個惟一索引
6.MySQL底層實現,MySQL有什麼引擎
答:mysql底層採用B+tree的存儲結構,也就是隻有葉子節點攜帶真實數據,每一個節點大小爲16Kb,大體三層的B+tree就能夠存2000W左右的數據,大大的減小了磁盤的IO。咱們常見的存儲引擎有InnoDB和MyISAM。
7.InnoDB和MyISAM區別,InnoDB替代了MyISAM,那麼MyISAM是否一無可取。
答:InnoDB支持事務,支持行鎖,在磁盤上只存兩個文件,一個是索引文件,另外一個是數據文件,在B+Tree的主鍵索引上,葉子節點攜帶所有數據,MyISAM不支持事務,不支持行鎖,磁盤上存了三個文件,一個是索引文件,另外一個是數據文件,還有一個存放的對應關係文件,從查詢的角度來講,InnoDB沒有MyISAM的單條查詢速度高,MyISAM採用Hash存儲回行獲得數據的查詢過程,單MyISAM對於範圍查詢不是很友好。所以咱們能夠看出InnoDB用的更廣一些,但同時MyISAM對於非範圍查詢的高效仍是有很大用處的,並且MyISAM對於表內的總數查詢,維護了單獨的數據,也是很高效的。
8.什麼是事務,事務特性
答:事務是指做爲單個邏輯工做單元執行的一系列操做,要麼徹底地執行,要麼徹底地不執行。在咱們的mysql裏也是如此,也就是咱們的ACID原則。A原子性,把一系列的動做視爲一個最小的操做(原子操做)C一致性,從一個狀態到另外一個狀態是一致的,I隔離性:事務與事務之間是不可見相互隔離的,D持久性:一旦事務提交,則所作修改就會被永久保存到數據庫中。能夠簡單說一下可重複讀的MVCC機制,面試官也懵圈。
9.如何設計一個高併發的系統(對於mysql來說)
答:這個後面會結合別的技術來講,只講mysql不太好說。大體就是咱們首先應該考慮到的是讀寫分離操做(過幾天博客裏會詳細說這個),再就是咱們常見的分庫分表操做,水平切分垂直切分。還能夠加入緩存redis操做。合理使用索引,explain進行sql優化。
10.鎖的優化策略
答:優化,也就是最小力度的鎖咱們的數據,也就是行鎖,InnoDB的行鎖實際上是加在索引字段的,避免行鎖的升級爲表鎖,再就是咱們儘可能避免間隙鎖,儘可能避免咱們的範圍修改,若是真的必須範圍修改,那麼我應該儘量的縮小到最小的範圍。
11.優化SQL的方法
答:設置一個主鍵索引,需主要主鍵索引通常沒有真正業務含義,使用int類型自動增加的,並且不能爲null,非主鍵索引字段優先考慮區分度高的業務狀況和最左前綴原則,設置爲null。若是真的數據量不大,不建議加索引,反而會影響效率的。選取最適用的字段屬性,儘量減小定義字段寬度,儘可能把字段設置NOTNULL,使用鏈接(JOIN)來代替子查詢,適用聯合(UNION)來代替手動建立的臨時表。學會使用explain進行SQL分析,實在不行能夠打開trace進行分析SQL狀況,用完記得關閉。
12.談談三大範式,何時使用反範式設計
答:第一範式(1NF):確保每列保持原子性即列不可分
第二範式(2NF):屬性徹底依賴於主鍵,也就是說在一個數據庫表中,一個表中只能保存一種數據,不能夠把多種數據保存在同一張數據庫表中。
第三範式(3NF):屬性和主鍵不能間接相關(減小數據冗餘,這樣就能夠經過主外鍵進行表之間鏈接)
好比咱們表比較多,須要關聯時,但咱們的A表只須要關聯B表的一個字段,並且每次都須要關聯查詢你,這時咱們能夠採用A表放置一個冗餘字段來存B表的那個字段。這個操做其實就是一個反範式的。
13.說幾個mysql中你經常使用的函數答:
答:sum、count 、avg、min、max
14.varchar(100)和varchar(200)的區別
答:佔用內存空間大小確定是不一致的,可是佔用咱們磁盤的大小是一致的,咱們存儲字符串"abc",徹底是同樣的磁盤空間,可是對於varchar(100)來講,接收到的字符串長度太長了就會報錯的。後面的數字表明可存儲的字節數。
15.varchar(20)和int(20)中的20含義同樣嗎
答:顯然不一致,int(M) M表示的不是數據的最大長度,只是數據寬度,並不影響存儲多少位長度的數據;varchar(M) M表示的是varchar類型數據在數據庫中存儲的最大長度,超過則不存;
16.如何開啓慢日誌查詢?
答:有2種方式,一是修改mysql的配置文件,二是經過set global語句來實現。slow_query_log = ON,打開日誌,long_query_time = 2,設置時間,2秒就算是慢查詢,而後重啓mysql服務便可,進入mysql控制檯,輸入SET GLOBAL slow_query_log = 'ON';SET GLOBAL long_query_time = X;不須要重啓服務就能夠獲得慢查詢日誌。
總結一下:
只要咱們熟知,咱們mysql的底層是B+tree的,B+tree是什麼樣子的,不少面試題都是圍繞這個東西來出題的,爲何不爲空,空很差找B+tree的位置啊等等。再就是咱們要學會使用Explain來分析sql,有的時候即便有覆蓋索引,mysql也不必定去走的,他內部底層會判斷走這個索引的代價。能夠自行嘗試。關於索引和結構的文章http://www.javashuo.com/article/p-clunqwcr-k.html。而後就是咱們的事務,也是很重要的一部分。總之無論他怎麼問咱們,咱們真的理解了其中的原理,就算是題再怎麼變化,也脫離不了底層原理的,咱們要學會加法,而不是要學會1+1。
最進弄了一個公衆號,小菜技術,歡迎你們的加入