28道MySQL常見面試題,之後面試不再怕問MySQL了!

問題1:char、varchar的區別是什麼?

varchar是變長而char的長度是固定的。若是你的內容是固定大小的,你會獲得更好的性能。

問題2: TRUNCATE和DELETE的區別是什麼?

DELETE命令從一個表中刪除某一行,或多行,TRUNCATE命令永久地從表中刪除每一行。

問題3:什麼是觸發器,MySQL中都有哪些觸發器?

觸發器是指一段代碼,當觸發某個事件時,自動執行這些代碼。在MySQL數據庫中有以下六種觸發器:1.Before Insert2.After Insert3.Before Update4.After Update5.Before Delete6.After Delete

問題4:FLOAT和DOUBLE的區別是什麼?

  • FLOAT類型數據能夠存儲至多8位十進制數,並在內存中佔4字節。
  • DOUBLE類型數據能夠存儲至多18位十進制數,並在內存中佔8字節。

問題5:如何在MySQL種獲取當前日期?

MySQL的這28道常見面試題,看你會不會!

問題6:如何查詢第n高的工資?

MySQL的這28道常見面試題,看你會不會!

問題7:請寫出下面MySQL數據類型表達的意義(int(0)、char(16)、varchar(16)、datetime、text)

int(0)表示數據是INT類型,長度是0、char(16)表示固定長度字符串,長度爲1六、varchar(16)表示可變長度字符串,長度爲1六、datetime表示時間類型、text表示字符串類型,能存儲大字符串,最多存儲65535字節數據)

問題8:請說明InnoDB和MyISAM的區別

  1. InnoDB支持事務,MyISAM不支持;
  2. InnoDB數據存儲在共享表空間,MyISAM數據存儲在文件中;
  3. InnoDB支持行級鎖,MyISAM只支持表鎖;
  4. InnoDB支持崩潰後的恢復,MyISAM不支持;
  5. InnoDB支持外鍵,MyISAM不支持;
  6. InnoDB不支持全文索引,MyISAM支持全文索引;

問題9:innodb引擎的特性

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

問題10:請列舉3個以上表引擎

InnoDB、MyISAM、Memory

問題11:請說明varchar和text的區別

  1. varchar可指定字符數,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n<=255)或2個字節(n>255),text是實際字符數+2個字節。
  2. text類型不能有默認值。
  3. varchar可直接建立索引,text建立索引要指定前多少個字符。varchar查詢速度快於text,在都建立索引的狀況下,text的索引幾乎不起做用。
  4. 查詢text須要建立臨時表。

問題12:varchar(50)中50的含義

最多存放50個字符,varchar(50)和(200)存儲hello所佔空間同樣,但後者在排序時會消耗更多內存,由於order by col採用fixed_length計算col長度(memory引擎也同樣)。

問題13:int(20)中20的含義

是指顯示字符的長度,不影響內部存儲,只是當定義了ZEROFILL時,前面補多少個 0

問題14:簡單描述MySQL中,索引,主鍵,惟一索引,聯合索引的區別,對數據庫的性能有什麼影響?

  • 一個表只能有一個主鍵索引,可是能夠有多個惟一索引。
  • 主鍵索引必定是惟一索引,惟一索引不是主鍵索引。
  • 主鍵能夠與外鍵構成參照完整性約束,防止數據不一致。
  • 聯合索引:將多個列組合在一塊兒建立索引,能夠覆蓋多個列。(也叫複合索引,組合索引)
  • 外鍵索引:只有InnoDB類型的表纔可使用外鍵索引,保證數據的一致性、完整性、和實現級聯操做(基本不用)。
  • 全文索引:MySQL自帶的全文索引只能用於MyISAM,而且只能對英文進行全文檢索 (基本不用)

問題15:建立MySQL聯合索引應該注意什麼?

需遵循前綴原則

問題16:列值爲NULL時,查詢是否會用到索引?

在MySQL裏NULL值的列也是走索引的。固然,若是計劃對列進行索引,就要儘可能避免把它設置爲可空,MySQL難以優化引用了可空列的查詢,它會使索引、索引統計和值更加複雜。

問題17:如下語句是否會應用索引:SELECT FROM users WHERE YEAR(adddate) < 2019;*

不會,由於只要列涉及到運算,MySQL就不會使用索引。

問題18:MyISAM索引實現?

MyISAM存儲引擎使用B+Tree做爲索引結構,葉節點的data域存放的是數據記錄的地址。MyISAM的索引方式也叫作非聚簇索引的,之因此這麼稱呼是爲了與InnoDB的聚簇索引區分。

問題19:MyISAM索引與InnoDB索引的區別?

  1. InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
  2. InnoDB的主鍵索引的葉子節點存儲着行數據,所以主鍵索引很是高效。
  3. MyISAM索引的葉子節點存儲的是行數據地址,須要再尋址一次才能獲得數據。
  4. InnoDB非主鍵索引的葉子節點存儲的是主鍵和其餘帶索引的列數據,所以查詢時作到覆蓋索引會很是高效。

問題20:有A(id,sex,par,c1,c2),B(id,age,c1,c2)兩張表,其中A.id與B.id關聯,如今要求寫出一條SQL語句,將B中age>50的記錄的c1,c2更新到A表中同一記錄中的c1,c2字段中

MySQL的這28道常見面試題,看你會不會!

問題21 :MySQL的關聯查詢語句你會那些?

六種關聯查詢1.交叉鏈接(CROSS JOIN)2.內鏈接(INNER JOIN)3.外鏈接(LEFT JOIN/RIGHT JOIN)4.聯合查詢(UNION與UNION ALL)5.全鏈接(FULL JOIN)6.交叉鏈接(CROSS JOIN)
MySQL的這28道常見面試題,看你會不會!

內鏈接分爲三類面試

  1. 等值鏈接:ON A.id=B.id
  2. 不等值鏈接:ON A.id > B.id
  3. 自鏈接:SELECT * FROM A T1 INNER JOIN A T2 ON T1.id=T2.pid

外鏈接(LEFT JOIN/RIGHT JOIN)sql

  1. 左外鏈接:LEFT OUTER JOIN, 以左表爲主,先查詢出左表,按照ON後的關聯條件匹配右表,沒有匹配到的用NULL填充,能夠簡寫成LEFT JOIN
  2. 右外鏈接:RIGHT OUTER JOIN, 以右表爲主,先查詢出右表,按照ON後的關聯條件匹配左表,沒有匹配到的用NULL填充,能夠簡寫成RIGHT JOIN

聯合查詢(UNION與UNION ALL)數據庫

MySQL的這28道常見面試題,看你會不會!

  1. 就是把多個結果集集中在一塊兒,UNION前的結果爲基準,須要注意的是聯合查詢的列數要相等,相同的記錄行會合並
  2. 若是使用UNION ALL,不會合並重復的記錄行3.效率 UNION 高於 UNION ALL

全鏈接(FULL JOIN)緩存

1.MySQL不支持全鏈接2.可使用LEFT JOIN 和UNION和RIGHT JOIN聯合使用
MySQL的這28道常見面試題,看你會不會!

嵌套查詢服務器

用一條SQL語句得結果做爲另一條SQL語句得條件,效率很差把握
MySQL的這28道常見面試題,看你會不會!

解題方法函數

根據考題要搞清楚表的結果和多表之間的關係,根據想要的結果思考使用那種關聯方式,一般把要查詢的列先寫出來,而後分析這些列都屬於哪些表,才考慮使用關聯查詢

問題22:UNION與UNION ALL的區別?

  1. 若是使用UNION ALL,不會合並重復的記錄行
  2. 效率 UNION 高於 UNION ALL

問題23:一個6億的表a,一個3億的表b,經過外鍵tid關聯,你如何最快的查詢出知足條件的第50000到第50200中的這200條數據記錄。

1.若是A表TID是自增加,而且是連續的,B表的ID爲索引工具

MySQL的這28道常見面試題,看你會不會!

2.若是A表的TID不是連續的,那麼就須要使用覆蓋索引.TID要麼是主鍵,要麼是輔助索引,B表ID也須要有索引。性能

MySQL的這28道常見面試題,看你會不會!

問題24:拷貝表( 拷貝數據, 源表名:a 目標表名:b)

MySQL的這28道常見面試題,看你會不會!

問題25:Student(S#,Sname,Sage,Ssex) 學生表 Course(C#,Cname,T#) 課程表 SC(S#,C#,score) 成績表 Teacher(T#,Tname) 教師表 查詢沒學過「葉平」老師課的同窗的學號、姓名

MySQL的這28道常見面試題,看你會不會!

問題26:隨機取出10條數據

MySQL的這28道常見面試題,看你會不會!

問題27:請簡述項目中優化SQL語句執行效率的方法,從哪些方面,SQL語句性能如何分析?

考點分析:優化

這道題主要考察的是查找分析SQL語句查詢速度慢的方法

延伸考點:spa

  1. 優化查詢過程當中的數據訪問
  2. 優化長難的查詢語句
  3. 優化特定類型的查詢語句

如何查找查詢速度慢的緣由

記錄慢查詢日誌,分析查詢日誌,不要直接打開慢查詢日誌進行分析,這樣比較浪費時間和精力,可使用pt-query-digest工具進行分析

使用show profile

MySQL的這28道常見面試題,看你會不會!

使用show status

show status會返回一些計數器,show global status會查看全部服務器級別的全部計數有時根據這些計數,能夠推測出哪些操做代價較高或者消耗時間多

show processlist

觀察是否有大量線程處於不正常的狀態或特徵

MySQL的這28道常見面試題,看你會不會!

最常問的MySQL面試題五——每一個開發人員都應該知道

使用explain

分析單條SQL語句

MySQL的這28道常見面試題,看你會不會!

優化查詢過程當中的數據訪問

  1. 訪問數據太多致使查詢性能降低
  2. 肯定應用程序是否在檢索大量超過須要的數據,多是太多行或列
  3. 確認MySQL服務器是否在分析大量沒必要要的數據行
  4. 避免犯以下SQL語句錯誤
  5. 查詢不須要的數據。解決辦法:使用limit解決
  6. 多表關聯返回所有列。解決辦法:指定列名
  7. 老是返回所有列。解決辦法:避免使用SELECT *
  8. 重複查詢相同的數據。解決辦法:能夠緩存數據,下次直接讀取緩存
  9. 是否在掃描額外的記錄。解決辦法:使用explain進行分析,若是發現查詢須要掃描大量的數據,但只返回少數的行,能夠經過以下技巧去優化:
  • 使用索引覆蓋掃描,把全部的列都放到索引中,這樣存儲引擎不須要回表獲取對應行就能夠返回結果。
  • 改變數據庫和表的結構,修改數據表範式
  • 重寫SQL語句,讓優化器能夠以更優的方式執行查詢。

優化長難的查詢語句

  1. 一個複雜查詢仍是多個簡單查詢
  2. MySQL內部每秒能掃描內存中上百萬行數據,相比之下,響應數據給客戶端就要慢得多使用盡量小的查詢是好的,可是有時將一個大的查詢分解爲多個小的查詢是頗有必要的。
  3. 切分查詢
  4. 將一個大的查詢分爲多個小的相同的查詢
  5. 一次性刪除1000萬的數據要比一次刪除1萬,暫停一會的方案更加損耗服務器開銷。
  6. 分解關聯查詢,讓緩存的效率更高。
  7. 執行單個查詢能夠減小鎖的競爭。
  8. 在應用層作關聯更容易對數據庫進行拆分。
  9. 查詢效率會有大幅提高。
  10. 較少冗餘記錄的查詢。

優化特定類型的查詢語句

  1. count(*)會忽略全部的列,直接統計全部列數,不要使用count(列名)
  2. MyISAM中,沒有任何where條件的count(*)很是快。
  3. 當有where條件時,MyISAM的count統計不必定比其它引擎快。
  4. 可使用explain查詢近似值,用近似值替代count(*)
  5. 增長彙總表
  6. 使用緩存

優化關聯查詢

  1. 肯定ON或者USING子句中是否有索引。
  2. 確保GROUP BY和ORDER BY只有一個表中的列,這樣MySQL纔有可能使用索引。

優化子查詢

  1. 用關聯查詢替代
  2. 優化GROUP BY和DISTINCT
  3. 這兩種查詢據可使用索引來優化,是最有效的優化方法
  4. 關聯查詢中,使用標識列分組的效率更高
  5. 若是不須要ORDER BY,進行GROUP BY時加ORDER BY NULL,MySQL不會再進行文件排序。
  6. WITH ROLLUP超級聚合,能夠挪到應用程序處理

優化LIMIT分頁

  1. LIMIT偏移量大的時候,查詢效率較低
  2. 能夠記錄上次查詢的最大ID,下次查詢時直接根據該ID來查詢

優化UNION查詢

UNION ALL的效率高於UNION

優化WHERE子句

解題方法對於此類考題,先說明如何定位低效SQL語句,而後根據SQL語句可能低效的緣由作排查,先從索引着手,若是索引沒有問題,考慮以上幾個方面,數據訪問的問題,長難查詢句的問題仍是一些特定類型優化的問題,逐一回答。

問題28:SQL語句優化的一些方法?

1.對查詢進行優化,應儘可能避免全表掃描,首先應考慮在 where 及 order by 涉及的列上創建索引。

2.應儘可能避免在 where 子句中對字段進行 null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描,如:

MySQL的這28道常見面試題,看你會不會!

3.應儘可能避免在 where 子句中使用!=或<>操做符,不然引擎將放棄使用索引而進行全表掃描。

4.應儘可能避免在 where 子句中使用or 來鏈接條件,不然將致使引擎放棄使用索引而進行全表掃描,如:

MySQL的這28道常見面試題,看你會不會!

5.in 和 not in 也要慎用,不然會致使全表掃描,如:

MySQL的這28道常見面試題,看你會不會!

6.下面的查詢也將致使全表掃描:select id from t where name like ‘%李%’若要提升效率,能夠考慮全文檢索。

7.若是在 where 子句中使用參數,也會致使全表掃描。由於SQL只有在運行時纔會解析局部變量,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然 而,若是在編譯時創建訪問計劃,變量的值仍是未知的,於是沒法做爲索引選擇的輸入項。以下面語句將進行全表掃描:

MySQL的這28道常見面試題,看你會不會!

8.應儘可能避免在 where 子句中對字段進行表達式操做,這將致使引擎放棄使用索引而進行全表掃描。如:

MySQL的這28道常見面試題,看你會不會!

9.應儘可能避免在where子句中對字段進行函數操做,這將致使引擎放棄使用索引而進行全表掃描。如:

MySQL的這28道常見面試題,看你會不會!

10.不要在 where 子句中的「=」左邊進行函數、算術運算或其餘表達式運算,不然系統將可能沒法正確使用索引。

總結:

但願這些Mysql常見的題可以給在求職路上的你一些幫助,同時也幫你們整理了部分的答案和更多的面試題給你們,但願你們在面試的時候也可以用到。

相關文章
相關標籤/搜索