登陸

用戶

上一篇:榮華程序員分享:如何規劃自己的技術成長路徑! 下一篇:MySQL挑戰:10萬連接數!

福利彩票带坐标走势图:MySQL的這28道常見面試題,看你會不會!

三d连线带坐标走势图 www.gjvgfb.com.cn 來源:榮華軟件   2019-05-05 14:50

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

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

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

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

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

觸發器是指一段代碼,當觸發某個事件時,自動執行這些代碼。在MySQL數據庫中有如下六種觸發器:

1、Before Insert

2、After Insert

3、Before Update

4、After Update

5、Before Delete

6、After Delete

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

FLOAT類型數據可以存儲至多8位十進制數,并在內存中占4字節。

DOUBLE類型數據可以存儲至多18位十進制數,并在內存中占8字節。

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


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


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

int(0)表示數據是INT類型,長度是0、char(16)表示固定長度字符串,長度為16、varchar(16)表示可變長度字符串,長度為16、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引擎的特性

1、插入緩沖(insert buffer)

2、二次寫(double write)

3、自適應哈希索引(ahi)

4、預讀(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中,索引,主鍵,唯一索引,聯合索引的區別,對數據庫的性能有什么影響?

一個表只能有一個主鍵索引,但是可以有多個唯一索引。

1、主鍵索引一定是唯一索引,唯一索引不是主鍵索引。

2、主鍵可以與外鍵構成參照完整性約束,防止數據不一致。

3、聯合索引:將多個列組合在一起創建索引,可以覆蓋多個列。(也叫復合索引,組合索引)

4、外鍵索引:只有InnoDB類型的表才可以使用外鍵索引,保證數據的一致性、完整性、和實現級聯操作(基本不用)。

5、全文索引: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字段中


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

六種關聯查詢

1、交叉連接(CROSS JOIN)

2、內連接(INNER JOIN)

3、外連接(LEFT JOIN/RIGHT JOIN)

4、聯合查詢(UNION與UNION ALL)

5、全連接(FULL JOIN)

6、交叉連接(CROSS JOIN)


內連接分為三類

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)

1、左外連接:LEFT OUTER JOIN, 以左表為主,先查詢出左表,按照ON后的關聯條件匹配右表,沒有匹配到的用NULL填充,可以簡寫成LEFT JOIN

2、右外連接:RIGHT OUTER JOIN, 以右表為主,先查詢出右表,按照ON后的關聯條件匹配左表,沒有匹配到的用NULL填充,可以簡寫成RIGHT JOIN

聯合查詢(UNION與UNION ALL)


1、就是把多個結果集集中在一起,UNION前的結果為基準,需要注意的是聯合查詢的列數要相等,相同的記錄行會合并

2、如果使用UNION ALL,不會合并重復的記錄行

3、效率 UNION 高于 UNION ALL

全連接(FULL JOIN)

1、MySQL不支持全連接

2、可以使用LEFT JOIN 和UNION和RIGHT JOIN聯合使用


嵌套查詢

用一條SQL語句得結果作為另外一條SQL語句得條件,效率不好把握


解題方法

根據考題要搞清楚表的結果和多表之間的關系,根據想要的結果思考使用那種關聯方式,通常把要查詢的列先寫出來,然后分析這些列都屬于哪些表,才考慮使用關聯查詢

問題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為索引


2、如果A表的TID不是連續的,那么就需要使用覆蓋索引.TID要么是主鍵,要么是輔助索引,B表ID也需要有索引。


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


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


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


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

考點分析:

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

延伸考點:

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

2、優化長難的查詢語句

3、優化特定類型的查詢語句

如何查找查詢速度慢的原因

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

使用show profile


使用show status

show status會返回一些計數器,show global status會查看所有服務器級別的所有計數

有時根據這些計數,可以推測出哪些操作代價較高或者消耗時間多

show processlist

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

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

使用explain

分析單條SQL語句

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

1、訪問數據太多導致查詢性能下降

2、確定應用程序是否在檢索大量超過需要的數據,可能是太多行或列

3、確認MySQL服務器是否在分析大量不必要的數據行

4、避免犯如下SQL語句錯誤

5、查詢不需要的數據。解決辦法:使用limit解決

6、多表關聯返回全部列。解決辦法:指定列名

7、總是返回全部列。解決辦法:避免使用SELECT *

8、重復查詢相同的數據。解決辦法:可以緩存數據,下次直接讀取緩存

9、是否在掃描額外的記錄。解決辦法:

10、使用explain進行分析,如果發現查詢需要掃描大量的數據,但只返回少數的行,可以通過如下技巧去優化:

11、使用索引覆蓋掃描,把所有的列都放到索引中,這樣存儲引擎不需要回表獲取對應行就可以返回結果。

12、改變數據庫和表的結構,修改數據表范式

13、重寫SQL語句,讓優化器可以以更優的方式執行查詢。

優化長難的查詢語句

1、一個復雜查詢還是多個簡單查詢

2、MySQL內部每秒能掃描內存中上百萬行數據,相比之下,響應數據給客戶端就要慢得多

3、使用盡可能小的查詢是好的,但是有時將一個大的查詢分解為多個小的查詢是很有必要的。

4、切分查詢

5、將一個大的查詢分為多個小的相同的查詢

6、一次性刪除1000萬的數據要比一次刪除1萬,暫停一會的方案更加損耗服務器開銷。

7、分解關聯查詢,讓緩存的效率更高。

8、執行單個查詢可以減少鎖的競爭。

9、在應用層做關聯更容易對數據庫進行拆分。

10、查詢效率會有大幅提升。

11、較少冗余記錄的查詢。

優化特定類型的查詢語句

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 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:


3、應盡量避免在 where 子句中使用!=或<>操作符,否則引擎將放棄使用索引而進行全表掃描。

4、應盡量避免在 where 子句中使用or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:


5、in 和 not in 也要慎用,否則會導致全表掃描,如:


6、下面的查詢也將導致全表掃描:select id from t where name like ‘%李%’若要提高效率,可以考慮全文檢索。

7、 如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變量,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然 而,如果在編譯時建立訪問計劃,變量的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:


8、應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:


9、應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:


10、不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。


  

       隨時隨地了解更多最新資訊,關注榮華軟件官方公眾號:ronghuasoft


0條回答

登陸后可回復

  1. 登陸
  2. 注冊
服務熱線

400-692-8081

( 周一至周五 09:00-17:00 )

聯系我們

名稱:煙臺榮華軟件科技有限公司

地址:煙臺市高新區航天路101號C棟5樓516

座機:0535-3458081

郵箱:[email protected]

Q Q:327195471

[email protected] 煙臺榮華軟件科技有限公司 版權所有 魯ICP備14003838號-1