說一下mysql比較宏觀的面試,具體咋寫sql的這里就不過多舉例了。后面我還會給出一個關(guān)于mysql面試優(yōu)化的試題,這里主要說的索引和B+Tree結(jié)構(gòu),很少提到我們的集群配置優(yōu)化方案。

          1.索引是什么?有什么作用以及缺點(diǎn)


          答:索引是對數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu),使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。也可以理解為索引就是一本書的目錄,創(chuàng)建索引和維護(hù)索引要耗費(fèi)時間,這種時間隨著數(shù)據(jù)量的增加而增加。索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個索引還要占一定的物理空間,如果要建立聚集索引那么需要的空間就會更大。

          2.索引的目的是什么

          答:為了高效的查找得到我們所需要的數(shù)據(jù),減少分組和排序時間,提高我們的mysql的性能

          3.索引對數(shù)據(jù)庫系統(tǒng)的負(fù)面影響

          答:雖然索引對于數(shù)據(jù)庫的查詢提高了效率,但一定程度上增加了空間的占用,同時寫入的速度降低了不少,和原有寫入數(shù)據(jù)相比較,多了一步去維護(hù)索引的操作。

          4.建立索引的原則


          答:選擇唯一性索引,為經(jīng)常需要查詢、排序、分組和聯(lián)合操作的字段建立索引,限制索引的數(shù)目,最左前綴匹配原則(非常重要的原則),盡量選擇區(qū)分度高的列作為索引,字段盡力設(shè)置不為null,索引列上不計(jì)算。

          5.主鍵、外鍵和唯一索引的區(qū)別

          答:定義:

          主鍵:唯一標(biāo)識一條記錄,不能有重復(fù)的,不允許為空

          外鍵:表的外鍵是另一表的主鍵, 外鍵可以有重復(fù)的, 可以是空值

          索引:該字段沒有重復(fù)值,但可以有空值

          作用:

          主鍵:用來保證數(shù)據(jù)完整性

          外鍵:用來和其他表建立聯(lián)系用的

          索引:是提高查詢排序的速度

          個數(shù):

          主鍵:主鍵只能有一個

          外鍵:一個表可以有多個外鍵

          索引:一個表可以有多個唯一索引

          6.MySQL底層實(shí)現(xiàn),MySQL有什么引擎


          答:mysql底層采用B+tree的存儲結(jié)構(gòu),也就是只有葉子節(jié)點(diǎn)攜帶真實(shí)數(shù)據(jù),每個節(jié)點(diǎn)大小為16Kb,大致三層的B+tree就可以存2000W左右的數(shù)據(jù),大大的減少了磁盤的IO。我們常見的存儲引擎有InnoDB和MyISAM。

          7.InnoDB和MyISAM區(qū)別,InnoDB替代了MyISAM,那么MyISAM是否一無是處。


          答:InnoDB支持事務(wù),支持行鎖,在磁盤上只存兩個文件,一個是索引文件,另一個是數(shù)據(jù)文件,在B+Tree的主鍵索引上,葉子節(jié)點(diǎn)攜帶全部數(shù)據(jù),MyISAM不支持事務(wù),不支持行鎖,磁盤上存了三個文件,一個是索引文件,另一個是數(shù)據(jù)文件,還有一個存放的對應(yīng)關(guān)系文件,從查詢的角度來說,InnoDB沒有MyISAM的單條查詢速度高,MyISAM采用Hash存儲回行得到數(shù)據(jù)的查詢過程,單MyISAM對于范圍查詢不是很友好。因此我們可以看出InnoDB用的更廣一些,但同時MyISAM對于非范圍查詢的高效還是有很大用處的,而且MyISAM對于表內(nèi)的總數(shù)查詢,維護(hù)了單獨(dú)的數(shù)據(jù),也是很高效的。

          8.什么是事務(wù),事務(wù)特性


          答:事務(wù)是指作為單個邏輯工作單元執(zhí)行的一系列操作,要么完全地執(zhí)行,要么完全地不執(zhí)行。在我們的mysql里也是如此,也就是我們的ACID原則。A原子性,把一系列的動作視為一個最小的操作(原子操作)C一致性,從一個狀態(tài)到另一個狀態(tài)是一致的,I隔離性:事務(wù)與事務(wù)之間是不可見相互隔離的,D持久性:一旦事務(wù)提交,則所做修改就會被永久保存到數(shù)據(jù)庫中??梢院唵握f一下可重復(fù)讀的MVCC機(jī)制,面試官也懵圈。

          9.如何設(shè)計(jì)一個高并發(fā)的系統(tǒng)(對于mysql來講)


          答:這個后面會結(jié)合別的技術(shù)來說,只講mysql不太好說。大致就是我們首先應(yīng)該考慮到的是讀寫分離操作(過幾天博客里會詳細(xì)說這個),再就是我們常見的分庫分表操作,水平切分垂直切分。還可以加入緩存redis操作。合理使用索引,explain進(jìn)行sql優(yōu)化。

          10.鎖的優(yōu)化策略


          答:優(yōu)化,也就是最小力度的鎖我們的數(shù)據(jù),也就是行鎖,InnoDB的行鎖其實(shí)是加在索引字段的,避免行鎖的升級為表鎖,再就是我們盡量避免間隙鎖,盡量避免我們的范圍修改,如果真的必須范圍修改,那么我應(yīng)該盡可能的縮小到最小的范圍。

          11.優(yōu)化SQL的方法


          答:設(shè)置一個主鍵索引,需主要主鍵索引一般沒有真正業(yè)務(wù)含義,使用int類型自動增長的,而且不能為null,非主鍵索引字段優(yōu)先考慮區(qū)分度高的業(yè)務(wù)情況和最左前綴原則,設(shè)置為null。如果真的數(shù)據(jù)量不大,不建議加索引,反而會影響效率的。選取最適用的字段屬性,盡可能減少定義字段寬度,盡量把字段設(shè)置NOTNULL,使用連接(JOIN)來代替子查詢,適用聯(lián)合(UNION)來代替手動創(chuàng)建的臨時表。學(xué)會使用explain進(jìn)行SQL分析,實(shí)在不行可以打開trace進(jìn)行分析SQL情況,用完記得關(guān)閉。

          12.談?wù)勅蠓妒剑裁磿r候使用反范式設(shè)計(jì)

          答:第一范式(1NF):確保每列保持原子性即列不可分

          第二范式(2NF):屬性完全依賴于主鍵,也就是說在一個數(shù)據(jù)庫表中,一個表中只能保存一種數(shù)據(jù),不可以把多種數(shù)據(jù)保存在同一張數(shù)據(jù)庫表中。

          第三范式(3NF):屬性和主鍵不能間接相關(guān)(減少數(shù)據(jù)冗余,這樣就可以通過主外鍵進(jìn)行表之間連接)


          比如我們表比較多,需要關(guān)聯(lián)時,但我們的A表只需要關(guān)聯(lián)B表的一個字段,而且每次都需要關(guān)聯(lián)查詢你,這時我們可以采用A表放置一個冗余字段來存B表的那個字段。這個操作其實(shí)就是一個反范式的。

          13.說幾個mysql中你常用的函數(shù)答:

          答:sum、count 、avg、min、max

          14.varchar(100)和varchar(200)的區(qū)別


          答:占用內(nèi)存空間大小肯定是不一致的,但是占用我們磁盤的大小是一致的,我們存儲字符串"abc",完全是一樣的磁盤空間,但是對于varchar(100)來說,接收到的字符串長度太長了就會報(bào)錯的。后面的數(shù)字代表可存儲的字節(jié)數(shù)。

          15.varchar(20)和int(20)中的20含義一樣嗎

          答:顯然不一致,int(M) M表示的不是數(shù)據(jù)的最大長度,只是數(shù)據(jù)寬度,并不影響存儲多少位長度的數(shù)據(jù);varchar(M)
          M表示的是varchar類型數(shù)據(jù)在數(shù)據(jù)庫中存儲的最大長度,超過則不存;

          16.如何開啟慢日志查詢?

          答:有2種方式,一是修改mysql的配置文件,二是通過set global語句來實(shí)現(xiàn)。slow_query_log =
          ON,打開日志,long_query_time = 2,設(shè)置時間,2秒就算是慢查詢,然后重啟mysql服務(wù)即可,進(jìn)入mysql控制臺,輸入SET GLOBAL
          slow_query_log = 'ON';SET GLOBAL long_query_time = X;不需要重啟服務(wù)就可以得到慢查詢?nèi)罩尽?br>

          需要java學(xué)習(xí)路線圖的私信筆者“java”領(lǐng)取哦!另外喜歡這篇文章的可以給筆者點(diǎn)個贊,關(guān)注一下,每天都會分享Java相關(guān)文章!還有不定時的福利贈送,包括整理的學(xué)習(xí)資料,面試題,源碼等~~

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                娇妻的呻吟梦莹 | 黄色片久久久 | 神马午夜 | 处破初破苞一区二区三区最新章节 | 韩国无遮挡18禁啪啪成人 |