mysql 左连接b表的一条数据_阿里java架构师教你怎么用mysql怒怼面试官
轉(zhuǎn)載地址:
阿里java架構(gòu)教你怎么用mysql怒懟面試官?www.jianshu.com說(shuō)一下mysql比較宏觀的面試,具體咋寫(xiě)sql的這里就不過(guò)多舉例了。后面我還會(huì)給出一個(gè)關(guān)于mysql面試優(yōu)化的試題,這里主要說(shuō)的索引和B+Tree結(jié)構(gòu),很少提到我們的集群配置優(yōu)化方案。
1.索引是什么?有什么作用以及缺點(diǎn)
答:索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu),使用索引可快速訪問(wèn)數(shù)據(jù)庫(kù)表中的特定信息。也可以理解為索引就是一本書(shū)的目錄,創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而增加。 索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占一定的物理空間,如果要建立聚集索引那么需要的空間就會(huì)更大。
2.索引的目的是什么
答:為了高效的查找得到我們所需要的數(shù)據(jù),減少分組和排序時(shí)間,提高我們的mysql的性能
3.索引對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的負(fù)面影響
答:雖然索引對(duì)于數(shù)據(jù)庫(kù)的查詢提高了效率,但一定程度上增加了空間的占用,同時(shí)寫(xiě)入的速度降低了不少,和原有寫(xiě)入數(shù)據(jù)相比較,多了一步去維護(hù)索引的操作。
4.建立索引的原則
答:選擇唯一性索引,為經(jīng)常需要查詢、排序、分組和聯(lián)合操作的字段建立索引,限制索引的數(shù)目,最左前綴匹配原則(非常重要的原則),盡量選擇區(qū)分度高的列作為索引,字段盡力設(shè)置不為null,索引列上不計(jì)算。
5.主鍵、外鍵和唯一索引的區(qū)別
答: 定義:
主鍵:唯一標(biāo)識(shí)一條記錄,不能有重復(fù)的,不允許為空
外鍵:表的外鍵是另一表的主鍵, 外鍵可以有重復(fù)的, 可以是空值
索引:該字段沒(méi)有重復(fù)值,但可以有一個(gè)空值
作用:
主鍵:用來(lái)保證數(shù)據(jù)完整性
外鍵:用來(lái)和其他表建立聯(lián)系用的
索引:是提高查詢排序的速度
個(gè)數(shù):
主鍵:主鍵只能有一個(gè)
外鍵:一個(gè)表可以有多個(gè)外鍵
索引:一個(gè)表可以有多個(gè)唯一索引
6.MySQL底層實(shí)現(xiàn),MySQL有什么引擎
答:mysql底層采用B+tree的存儲(chǔ)結(jié)構(gòu),也就是只有葉子節(jié)點(diǎn)攜帶真實(shí)數(shù)據(jù),每個(gè)節(jié)點(diǎn)大小為16Kb,大致三層的B+tree就可以存2000W左右的數(shù)據(jù),大大的減少了磁盤(pán)的IO。我們常見(jiàn)的存儲(chǔ)引擎有InnoDB和MyISAM。
7.InnoDB和MyISAM區(qū)別,InnoDB替代了MyISAM,那么MyISAM是否一無(wú)是處。
答:InnoDB支持事務(wù),支持行鎖,在磁盤(pán)上只存兩個(gè)文件,一個(gè)是索引文件,另一個(gè)是數(shù)據(jù)文件,在B+Tree的主鍵索引上,葉子節(jié)點(diǎn)攜帶全部數(shù)據(jù),MyISAM不支持事務(wù),不支持行鎖,磁盤(pán)上存了三個(gè)文件,一個(gè)是索引文件,另一個(gè)是數(shù)據(jù)文件,還有一個(gè)存放的對(duì)應(yīng)關(guān)系文件,從查詢的角度來(lái)說(shuō),InnoDB沒(méi)有MyISAM的單條查詢速度高,MyISAM采用Hash存儲(chǔ)回行得到數(shù)據(jù)的查詢過(guò)程,單MyISAM對(duì)于范圍查詢不是很友好。因此我們可以看出InnoDB用的更廣一些,但同時(shí)MyISAM對(duì)于非范圍查詢的高效還是有很大用處的,而且MyISAM對(duì)于表內(nèi)的總數(shù)查詢,維護(hù)了單獨(dú)的數(shù)據(jù),也是很高效的。
8.什么是事務(wù),事務(wù)特性
答:事務(wù)是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作,要么完全地執(zhí)行,要么完全地不執(zhí)行。在我們的mysql里也是如此,也就是我們的ACID原則。A原子性,把一系列的動(dòng)作視為一個(gè)最小的操作(原子操作)C一致性,從一個(gè)狀態(tài)到另一個(gè)狀態(tài)是一致的,I隔離性:事務(wù)與事務(wù)之間是不可見(jiàn)相互隔離的,D持久性:一旦事務(wù)提交,則所做修改就會(huì)被永久保存到數(shù)據(jù)庫(kù)中。可以簡(jiǎn)單說(shuō)一下可重復(fù)讀的MVCC機(jī)制,面試官也懵圈。
9.如何設(shè)計(jì)一個(gè)高并發(fā)的系統(tǒng)(對(duì)于mysql來(lái)講)
答:這個(gè)后面會(huì)結(jié)合別的技術(shù)來(lái)說(shuō),只講mysql不太好說(shuō)。大致就是我們首先應(yīng)該考慮到的是讀寫(xiě)分離操作(過(guò)幾天博客里會(huì)詳細(xì)說(shuō)這個(gè)),再就是我們常見(jiàn)的分庫(kù)分表操作,水平切分垂直切分。還可以加入緩存redis操作。合理使用索引,explain進(jìn)行sql優(yōu)化。
10.鎖的優(yōu)化策略
答:優(yōu)化,也就是最小力度的鎖我們的數(shù)據(jù),也就是行鎖,InnoDB的行鎖其實(shí)是加在索引字段的,避免行鎖的升級(jí)為表鎖,再就是我們盡量避免間隙鎖,盡量避免我們的范圍修改,如果真的必須范圍修改,那么我應(yīng)該盡可能的縮小到最小的范圍。
11.優(yōu)化SQL的方法
答:設(shè)置一個(gè)主鍵索引,需主要主鍵索引一般沒(méi)有真正業(yè)務(wù)含義,使用int類型自動(dòng)增長(zhǎng)的,而且不能為null,非主鍵索引字段優(yōu)先考慮區(qū)分度高的業(yè)務(wù)情況和最左前綴原則,設(shè)置為null。如果真的數(shù)據(jù)量不大,不建議加索引,反而會(huì)影響效率的。選取最適用的字段屬性,盡可能減少定義字段寬度,盡量把字段設(shè)置NOTNULL, 使用連接(JOIN)來(lái)代替子查詢,適用聯(lián)合(UNION)來(lái)代替手動(dòng)創(chuàng)建的臨時(shí)表。學(xué)會(huì)使用explain進(jìn)行SQL分析,實(shí)在不行可以打開(kāi)trace進(jìn)行分析SQL情況,用完記得關(guān)閉。
12.談?wù)勅蠓妒?#xff0c;什么時(shí)候使用反范式設(shè)計(jì)
答: 第一范式(1NF):確保每列保持原子性即列不可分
第二范式(2NF):屬性完全依賴于主鍵,也就是說(shuō)在一個(gè)數(shù)據(jù)庫(kù)表中,一個(gè)表中只能保存一種數(shù)據(jù),不可以把多種數(shù)據(jù)保存在同一張數(shù)據(jù)庫(kù)表中。
第三范式(3NF):屬性和主鍵不能間接相關(guān)(減少數(shù)據(jù)冗余,這樣就可以通過(guò)主外鍵進(jìn)行表之間連接)
比如我們表比較多,需要關(guān)聯(lián)時(shí),但我們的A表只需要關(guān)聯(lián)B表的一個(gè)字段,而且每次都需要關(guān)聯(lián)查詢你,這時(shí)我們可以采用A表放置一個(gè)冗余字段來(lái)存B表的那個(gè)字段。這個(gè)操作其實(shí)就是一個(gè)反范式的。
13.說(shuō)幾個(gè)mysql中你常用的函數(shù)
答:sum、count 、avg、min、max
14.varchar(100)和varchar(200)的區(qū)別
答:占用內(nèi)存空間大小肯定是不一致的,但是占用我們磁盤(pán)的大小是一致的,我們存儲(chǔ)字符串"abc",完全是一樣的磁盤(pán)空間,但是對(duì)于varchar(100)來(lái)說(shuō),接收到的字符串長(zhǎng)度太長(zhǎng)了就會(huì)報(bào)錯(cuò)的。后面的數(shù)字代表可存儲(chǔ)的字節(jié)數(shù)。
15.varchar(20)和int(20)中的20含義一樣嗎
答:顯然不一致, int(M) M表示的不是數(shù)據(jù)的最大長(zhǎng)度,只是數(shù)據(jù)寬度,并不影響存儲(chǔ)多少位長(zhǎng)度的數(shù)據(jù);varchar(M) M表示的是varchar類型數(shù)據(jù)在數(shù)據(jù)庫(kù)中存儲(chǔ)的最大長(zhǎng)度,超過(guò)則不存;
16 .如何開(kāi)啟慢日志查詢?
答: 有2種方式,一是修改mysql的配置文件,二是通過(guò)set global語(yǔ)句來(lái)實(shí)現(xiàn)。slow_query_log = ON,打開(kāi)日志,long_query_time = 2,設(shè)置時(shí)間,2秒就算是慢查詢,然后重啟mysql服務(wù)即可,進(jìn)入mysql控制臺(tái),輸入SET GLOBAL slow_query_log = 'ON';SET GLOBAL long_query_time = X;不需要重啟服務(wù)就可以得到慢查詢?nèi)罩尽?/p>
總結(jié)一下:
只要我們熟知,我們mysql的底層是B+tree的,B+tree是什么樣子的,很多面試題都是圍繞這個(gè)東西來(lái)出題的,為什么不為空,空不好找B+tree的位置啊等等。再就是我們要學(xué)會(huì)使用Explain來(lái)分析sql,有的時(shí)候即使有覆蓋索引,mysql也不一定去走的,他內(nèi)部底層會(huì)判斷走這個(gè)索引的代價(jià)。可以自行嘗試。然后就是我們的事務(wù),也是很重要的一部分。總之不管他怎么問(wèn)我們,我們真的理解了其中的原理,就算是題再怎么變化,也脫離不了底層原理的,我們要學(xué)會(huì)加法,而不是要學(xué)會(huì)1+1。
總結(jié)
以上是生活随笔為你收集整理的mysql 左连接b表的一条数据_阿里java架构师教你怎么用mysql怒怼面试官的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何使用CNN进行物体识别和分类_可能我
- 下一篇: Python中表示偶数_蒙特卡洛模拟(P