1000道互聯(lián)網(wǎng)java面試題(七)MySQL面試題

首先我個(gè)人屬于在mysql上卡死一次又一次的人氏涩。蚁鳖。磺芭。畢竟小項(xiàng)目中,又不涉及什么高并發(fā)醉箕,所以什么表鎖行鎖壓根不用想钾腺。甚至sql語(yǔ)句最多也就是個(gè)left join之類的,所以實(shí)際項(xiàng)目中sql優(yōu)化近乎沒有讥裤。當(dāng)然了數(shù)據(jù)庫(kù)設(shè)計(jì)更是可著怎么方便怎么來放棒,三大范式完全就是個(gè)擺設(shè)。己英〖涿總而言之,mysql一直對(duì)于我來說都是一個(gè)忽略的點(diǎn)。
然後面試的時(shí)候往深了問厢破,一問一卡死荣瑟。有時(shí)候會(huì)痛定思痛,前年有一段時(shí)間死磕MySQL,什么四大隔離級(jí)別啊摩泪,臟讀幻讀不可重復(fù)讀啊笆焰,甚至關(guān)于B+樹和hash我都自取其辱的仔細(xì)研究了下。至于索引加勤,復(fù)合索引仙辟,索引失效等等,也都一個(gè)一個(gè)demo試過鳄梅。
但是叠国!說了這么多實(shí)戰(zhàn)經(jīng)驗(yàn)主要還是crud。然後沒做過的東西靠死記硬背真的特別容易忘戴尸。吐了這么多槽只是為了表示對(duì)MySQL的重視粟焊,下面開始看關(guān)于MySQL的面試題。

1. MySQL中有幾種鎖孙蒙?

  1. 表級(jí)鎖:開銷小项棠,加鎖快。不會(huì)出現(xiàn)死鎖挎峦。鎖定粒度大香追,發(fā)生鎖沖突的概率最高,并發(fā)度最低坦胶。
  2. 行級(jí)鎖:開銷大透典,加鎖慢。會(huì)出現(xiàn)死鎖顿苇。鎖定粒度小峭咒,發(fā)生鎖沖突的概率最低,并發(fā)度也最高纪岁。
  3. 頁(yè)面鎖:開銷和加鎖時(shí)間介于表鎖和行鎖之間凑队,會(huì)出現(xiàn)死鎖。鎖定粒度介于表鎖和行鎖之間幔翰,并發(fā)度一般漩氨。

2. MySQL中有哪些不同的表格?

共有五種類型的表格

  • MyISAM
  • Heap
  • Merge
  • INNODB
  • ISAM

3. 簡(jiǎn)述在MySQL數(shù)據(jù)庫(kù)中MyISAM和INNODB的區(qū)別

MyISAM:不支持事務(wù),但是每次查詢都是原子的遗增。支持表級(jí)鎖才菠,即每次操作都是對(duì)整個(gè)表加鎖。
存儲(chǔ)表的總行數(shù)贡定。
一個(gè)MYISAM表有三個(gè)文件:索引文件,表結(jié)構(gòu)文件可都,數(shù)據(jù)文件缓待。
采用非聚集索引蚓耽,索引文件的數(shù)據(jù)域存儲(chǔ)指向數(shù)據(jù)文件的指針。輔索引與主索引基本一致旋炒,但是輔索引不用保證唯一性步悠。
INNODB:支持ACID的事務(wù),支持事務(wù)的四種隔離級(jí)別瘫镇。
支持行級(jí)鎖以及外鍵約束鼎兽。因此可以支持寫并發(fā)。
不存儲(chǔ)總行數(shù)铣除。
一個(gè)INNODB引擎存儲(chǔ)在一個(gè)文件空間(共享表空間谚咬,表大小不受操作系統(tǒng)控制,一個(gè)表可能分布在多個(gè)文件里尚粘。)择卦。也有可能為多個(gè)(設(shè)置為獨(dú)立表,表大小受操作系統(tǒng)文件大小限制郎嫁,一般為2G).
主鍵索引采用聚集索引(索引的數(shù)據(jù)域存儲(chǔ)數(shù)據(jù)文件本身)秉继。輔索引的數(shù)據(jù)域存儲(chǔ)主鍵的值。因?yàn)閺妮o索引查找數(shù)據(jù)泽铛,需要先通過輔索引找到主鍵值尚辑,再訪問輔索引。最好使用自增主鍵盔腔,防止插入數(shù)據(jù)時(shí)為維持B+樹結(jié)構(gòu)杠茬,文件的大調(diào)整。

4. MySQL中INNODB支持的四種食物隔離級(jí)別名稱以及逐級(jí)之間的區(qū)別铲觉?

  1. read uncommited:讀到未提交數(shù)據(jù)(讀未提交)
  2. read commited: 讀已提交
  3. repeatable read:可重復(fù)讀
  4. serializable:串行事務(wù)

5. CHAR和VARCHAR的區(qū)別澈蝙?

  1. CHAR和VARCHAR類型在存儲(chǔ)和檢索方面不同。
  2. CHAR列長(zhǎng)度固定為創(chuàng)建表時(shí)聲明的長(zhǎng)度撵幽。長(zhǎng)度值范圍是1-255.當(dāng)實(shí)際存儲(chǔ)不足聲明長(zhǎng)度時(shí)它們被用空格填充到特定長(zhǎng)度灯荧,檢索CHAR值時(shí)需要?jiǎng)h除尾隨空格。
  3. VARCHAR是變長(zhǎng)的盐杂。聲明時(shí)的長(zhǎng)度是可用最大值逗载。

6. 主鍵和候選鍵有什么區(qū)別?

一個(gè)表只有一個(gè)主鍵链烈。
主鍵也是候選鍵厉斟,按照慣例,候選鍵可以被指定為主鍵强衡。并且可以用于任何外鍵引用擦秽。

7. myisamchk是用來做什么的?

用來壓縮MyISAM表,者減少了磁盤或內(nèi)存使用感挥。

8. 問答題

MyISAM Static 和 MyISAM Dynamic 有什么區(qū)別缩搅?
  • 在MyISAM Static上所有字段有固定寬度。 MyISAM Static在受損情況下更容易恢復(fù)触幼。
  • 動(dòng)態(tài)MyISAM(MyISAM Dynamic) 表將具有像TEXT,BLOB等字段硼瓣,以適應(yīng)不同長(zhǎng)度的數(shù)據(jù)類型。
如果一個(gè)表有一列定義為TIMESTAMP置谦。將發(fā)生什么堂鲤?

每當(dāng)行被更改時(shí),時(shí)間戳字段將獲取當(dāng)前時(shí)間戳媒峡。

列設(shè)置為AUTO INCREMENT時(shí)瘟栖,如果在表中達(dá)到最大值,會(huì)發(fā)生什么情況?

它會(huì)停止遞增,任何進(jìn)一步的插入都將產(chǎn)生錯(cuò)誤快毛,因?yàn)槊罔€已被使用凿滤。

怎樣才能找出最后一次插入時(shí)分配了那個(gè)自動(dòng)增量?
插入的時(shí)候遞增

最后一條id是4

查詢結(jié)果

這個(gè)題的答案就是LAST_INSERT_ID()函數(shù)。將返回由Auto_increment分配 最后一個(gè)值。并且不需要指定表名稱。

9. 你怎么看到為表格定義的所有索引缅茉?

命令行:show index from <tableName>
當(dāng)然了,比我我習(xí)慣用navicat男摧,那么就直接設(shè)計(jì)表蔬墩,然后有索引欄。

10. like聲明中的%和_是什么意思耗拓?

%對(duì)應(yīng)0或者更多個(gè)字符拇颅。而_代表一個(gè)字符。
比如 %xx%乔询。則只要這個(gè)字段中包含xx就可以匹配到樟插。
xx。則必須是四個(gè)字符竿刁。且第二個(gè)黄锤,第三個(gè)字符是xx。

11. 列對(duì)比運(yùn)算符是什么食拜?

在SELECT語(yǔ)句的列比較中使用的鸵熟,=, <>, <=, <, >=, >, <<, >>,<=>, AND, OR 或者LIKE運(yùn)算符。

12. BLOB 和 TEXT有什么區(qū)別负甸?

  • BLOB是一個(gè)二進(jìn)制對(duì)象流强,可容納可變數(shù)量的數(shù)據(jù)痹届。
  • TEXT是一個(gè)不區(qū)分大小寫的BLOB。

BLOB和TEXT類型之間的唯一區(qū)別在于對(duì)BLOB值進(jìn)行排序和比較時(shí)是區(qū)分大小寫的打月。而對(duì)TEXT值不區(qū)分大小寫短纵。

13. MyISAM表格將在哪里存儲(chǔ),并且還提供其存儲(chǔ)格式僵控?

每個(gè)MyISAM表格以三種格式存儲(chǔ)在磁盤上:

  • “.frm”文件存儲(chǔ)表的定義
  • 數(shù)據(jù)文件具有“.MYD”(myData)擴(kuò)展名
  • 索引文件具有“.MYI”(myIndex)擴(kuò)展名

14. 如何查看sql語(yǔ)句的最終執(zhí)行語(yǔ)句?

我們知道我們寫的sql語(yǔ)句還會(huì)經(jīng)過解析優(yōu)化后再去執(zhí)行鱼冀,查看實(shí)際執(zhí)行的語(yǔ)句方法(navicat中):
explain extended sql語(yǔ)句; -- 注意這個(gè)分號(hào)是必須的
show warnings
然后結(jié)果1是索引使用情況报破,結(jié)果2是實(shí)際執(zhí)行語(yǔ)句。如下圖:


demo

15. 如何顯示前50行千绪?

在MySQL中充易,limit 0,50就是查詢前50條。
其實(shí)分頁(yè)的實(shí)現(xiàn)就是基于差不多的思路荸型。

16. 可以使用多少列創(chuàng)建索引盹靴?

任何標(biāo)準(zhǔn)表最多可以創(chuàng)建16個(gè)索引列。

17. NOW()和 CURRENT_DATE()有什么區(qū)別瑞妇?

now()方法用于顯示當(dāng)前年月日時(shí)分秒稿静。而current_date()僅顯示年月日。

18. 什么是非標(biāo)準(zhǔn)字符串類型辕狰?

  • TINYTEXT
  • TEXT
  • MEDIUMTEXT
  • LONGTEXT

19. 什么是通用SQL函數(shù)改备?

有一些函數(shù)所有數(shù)據(jù)庫(kù)都支持的,叫做通用sql函數(shù)蔓倍。如下:

  • CONCAT(A,B) 連接兩個(gè)字符串值以創(chuàng)建單個(gè)字符串輸出悬钳。通常用于將兩個(gè)或者多個(gè)字段合并為一個(gè)字段。如下截圖偶翅。


    原表

    查詢結(jié)果
  • FORMAT(X,D) 格式化數(shù)字X到D有效數(shù)字默勾。 當(dāng)然了我個(gè)人是覺得這個(gè)其實(shí)用得不多,它的兄弟DATE_FORMAT用的倒是挺多的(我不知道這個(gè)是不是所有數(shù)據(jù)庫(kù)都支持)聚谁。然后用法如下:


    格式化日期
  • CURRDATE(),CURRTIME() 返回當(dāng)前日期或者時(shí)間

  • NOW() 將當(dāng)前日期和時(shí)間作為一個(gè)值返回

  • MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY().從日期中提取給定數(shù)據(jù)母剥。

  • HOUR(),MINUTE(),SECOND() 從時(shí)間中提取給定數(shù)據(jù)

  • DATEDIFF(A,B) 確定兩個(gè)日期之間的差異,通常用于計(jì)算年齡垦巴。使用方法如下圖:


    兩個(gè)日期相差的天數(shù)
  • SUBTIME(A,B) A時(shí)間戳減去B的時(shí)間媳搪。如下demo


    時(shí)間戳減去秒數(shù)
  • FROMDAYS(int) 將整數(shù)天數(shù)轉(zhuǎn)化為日期。這個(gè)天數(shù)好像是從366開始算一天骤宣。如下截圖


    測(cè)試demo

20. MySQL支持事務(wù)么秦爆?

默認(rèn)的缺省模式下,MySQL是autocommit模式的憔披,所有數(shù)據(jù)庫(kù)更新操作都會(huì)及時(shí)提交等限。所以缺省情況下是不支持事務(wù)的爸吮。
但是如果MySQL表類型是INNODB或者BDB的話,就可以使用事務(wù)處理望门。使用SET AUTOCOMMIT = 0就可以使MySQL允許在非autocommit模式形娇。非autocommit模式下,必須使用commit來提交更改或者rollback來回滾更改筹误。

21. MySQL里記錄貨幣用什么字段類型好桐早?

NUMERIC和DECIMAL類型被MySQL實(shí)現(xiàn)為同樣的類型,這在SQL92標(biāo)準(zhǔn)允許厨剪。
他們被用于保存準(zhǔn)確經(jīng)度是極其重要的值哄酝。例如與金錢有關(guān)的數(shù)據(jù)。
當(dāng)聲明一個(gè)類是這些類型之一時(shí)祷膳,精度和規(guī)模能被指定陶衅。
比如 salary DECIMAL(9,2)。9代表存儲(chǔ)值的總的位數(shù)直晨。而2代表小數(shù)點(diǎn)后的位數(shù)搀军。
這種情況下salary字段的值的范圍是:-9999999.99到9999999.99。

22. MySQL有關(guān)權(quán)限的表都有哪幾個(gè)勇皇?

MySQL服務(wù)器通過權(quán)限表來控制用戶對(duì)數(shù)據(jù)庫(kù)的訪問罩句,權(quán)限表存放在MySQL數(shù)據(jù)庫(kù)里。由MySQL_install_db腳本初始化儒士。這些權(quán)限表分別是:user的止,db,table_priv,columns_priv和host着撩。


如下五張權(quán)限表

23. 列的字符串類型可以是什么诅福?

  • SET
  • BLOB
  • ENUM
  • CHAR
  • TEXT

24. MySQL數(shù)據(jù)庫(kù)作發(fā)布系統(tǒng)的存儲(chǔ),一天五萬條以上的增量拖叙,預(yù)計(jì)運(yùn)維三年氓润,怎么優(yōu)化?

  1. 設(shè)計(jì)兩個(gè)的數(shù)據(jù)庫(kù)結(jié)構(gòu)薯鳍,允許部分?jǐn)?shù)據(jù)冗余咖气,盡量避免join查詢,提高效率挖滤。
  2. 選擇合適的表字段數(shù)據(jù)類型和存儲(chǔ)引擎崩溪,適當(dāng)?shù)奶砑铀饕?/li>
  3. MySQL庫(kù)主從讀寫分離。
  4. 找規(guī)律分表斩松,減少單表中的數(shù)據(jù)量提高查詢速度伶唯。
  5. 添加緩存機(jī)制,比如memcached等惧盹。
  6. 不經(jīng)常改動(dòng)的頁(yè)面生成靜態(tài)頁(yè)面乳幸。
  7. 書寫高效率的SQL瞪讼,比如不用select *。

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

  1. 讀寫分離
  2. 分段加鎖
  3. 減少鎖持有的時(shí)間
  4. 多個(gè)線程盡量以相同的順序去獲取資源

不能將鎖的粒度過于細(xì)化粹断。不然可能會(huì)出現(xiàn)線程的加鎖和釋放次數(shù)過多符欠,反而效率不如一次加一把大鎖。

26. 索引的底層實(shí)現(xiàn)原理和優(yōu)化

底層實(shí)現(xiàn)一般為hash或者B+樹瓶埋。(經(jīng)過優(yōu)化的B+樹)
主要是在所有的葉子節(jié)點(diǎn)中增加了指向下一個(gè)葉子節(jié)點(diǎn)的指針希柿。因此InnoDB建議大部分表使用默認(rèn)自增的主鍵作為主索引。

27. 什么情況下設(shè)置了索引但無法使用养筒?

  1. 以% 開頭的like語(yǔ)句狡汉,模糊匹配
  2. OR語(yǔ)句前后沒有同時(shí)使用索引
  3. 數(shù)據(jù)類型出現(xiàn)隱式轉(zhuǎn)化(比如varchar不加單引號(hào)轉(zhuǎn)成數(shù)字。)

28. 實(shí)踐中如何優(yōu)化MySQL

最好按照以下順序優(yōu)化:

  1. SQL語(yǔ)句以及索引的優(yōu)化
  2. 數(shù)據(jù)庫(kù)表結(jié)構(gòu)的優(yōu)化
  3. 系統(tǒng)配置的優(yōu)化
  4. 硬件的優(yōu)化

(附上一個(gè)阿里P8架構(gòu)師寫的優(yōu)化總結(jié):https://mikechen.cc/3305.html

29. 優(yōu)化數(shù)據(jù)庫(kù)的方法

  1. 選取最適用的字段屬性闽颇。盡可能的把字段設(shè)置為notnull。例如省份寄锐,性別等最好用枚舉兵多。
  2. 使用連接(join)來代替子查詢。
  3. 使用聯(lián)合(union) 來代替手動(dòng)創(chuàng)建的臨時(shí)表
  4. 事務(wù)處理
  5. 鎖定表橄仆,優(yōu)化事務(wù)處理
  6. 使用外鍵剩膘,優(yōu)化鎖定表
  7. 建立索引
  8. 優(yōu)化查詢語(yǔ)句

30. 簡(jiǎn)單描述MySQL中,索引盆顾,主鍵怠褐,唯一索引,聯(lián)合索引的區(qū)別您宪。對(duì)數(shù)據(jù)庫(kù)的性能有什么影響(從讀寫兩方面)

索引是一種特殊的文件(InnoDB數(shù)據(jù)表上的索引是表空間的一個(gè)組成部分)奈懒,它們包含著對(duì)數(shù)據(jù)表所有記錄的引用指針。
普通索引(由關(guān)鍵字key或index定義的索引)的唯一任務(wù)就是加快對(duì)數(shù)據(jù)的訪問速度宪巨。
普通索引允許被索引的數(shù)據(jù)列包含重復(fù)的值磷杏。如果能確定某個(gè)數(shù)據(jù)列將只包含彼此各不相同的值,在為這個(gè)數(shù)據(jù)列創(chuàng)建索引的時(shí)候就應(yīng)該用關(guān)鍵字UNIQUE把它定義為一個(gè)唯一索引捏卓。也就是說:唯一索引可以保證數(shù)據(jù)記錄的唯一性极祸。
主鍵是一種特殊的唯一索引。在一張表中只能定義一個(gè)主鍵索引怠晴。主鍵用于唯一標(biāo)識(shí)一條記錄遥金。使用關(guān)鍵字primary key來創(chuàng)建。
索引可以覆蓋多個(gè)數(shù)據(jù)列蒜田,如index(column A,columnB)索引稿械,這個(gè)就是聯(lián)合索引。
索引可以極大的提高數(shù)據(jù)的查詢速度物邑。但是會(huì)降低插入溜哮,刪除和更新表的速度滔金。因?yàn)樵趫?zhí)行這些寫操作時(shí),還要操作索引文件茂嗓。

31. 數(shù)據(jù)庫(kù)中的事務(wù)是什么餐茵?

事務(wù)(transaction)是作為一個(gè)單元的一組有序的數(shù)據(jù)庫(kù)操作。如果組中的所有操作都成功述吸,則認(rèn)為事務(wù)成功忿族,即使只有一個(gè)操作失敗,事務(wù)也不成功蝌矛。如果所有操作完成道批,事務(wù)則提交,其修改將作用于所有其他數(shù)據(jù)庫(kù)進(jìn)程入撒。如果一個(gè)操作失敗則事務(wù)將回滾隆豹,該事務(wù)的所有操作的影響都將取消。
事務(wù)特性:

  1. 原子性:即不可分割性茅逮,要么全部被執(zhí)行璃赡,要么全部不執(zhí)行。
  2. 一致性或可串性:事務(wù)的執(zhí)行使得數(shù)據(jù)庫(kù)從一種正確狀態(tài)轉(zhuǎn)換成另一種正確狀態(tài)献雅。
  3. 隔離性:事務(wù)正確提交之前碉考,不允許把該事務(wù)對(duì)數(shù)據(jù)庫(kù)的任何改變提供給任何其他事務(wù)。
  4. 持久性:事務(wù)正確提交后挺身,其結(jié)果將永久保存在數(shù)據(jù)庫(kù)中侯谁,即使在事務(wù)提交后有了其他故障,事務(wù)的處理結(jié)果也會(huì)得到保存章钾。

簡(jiǎn)而言之可以如下理解:
事務(wù)就是被綁定在一起作為一個(gè)邏輯單元的SQL語(yǔ)句組合墙贱,如果任何一個(gè)語(yǔ)句操作失敗則整個(gè)操作都失敗。就會(huì)回滾到操作前的狀態(tài)(或者上個(gè)節(jié)點(diǎn))贱傀。為了確保要么執(zhí)行要么不執(zhí)行就可以使用事務(wù)嫩痰。要將一組語(yǔ)句作為事務(wù)考慮,就要通過ACID測(cè)試窍箍。即原子性串纺,一致性,隔離性和持久性椰棘。

32纺棺, SQL注入漏洞產(chǎn)生的原因以及如何防止?

SQL注入產(chǎn)生的原因:程序開發(fā)過程中不規(guī)范書寫sql語(yǔ)句和對(duì)特殊字符進(jìn)行過濾邪狞,導(dǎo)致接口可以提交一些sql語(yǔ)句正常執(zhí)行祷蝌。(通俗點(diǎn)當(dāng)我們把一些參數(shù)拼接到sql語(yǔ)句時(shí),如果傳過來的不是一個(gè)參數(shù)值而是sql的一部分帆卓。從而執(zhí)行了和預(yù)計(jì)中完全不一樣的sql)巨朦。
防止sql注入的方式也很多米丘,簡(jiǎn)單說幾種:

  1. 開啟配置文件中magic_quotes_gpc和magic_quotes_runtime設(shè)置。
  2. sql語(yǔ)句書寫盡量不要省略雙引號(hào)和單引號(hào)糊啡。
  3. 過濾掉一些敏感詞拄查,比如update,insert棚蓄,delete堕扶,select,where等梭依。
  4. 對(duì)數(shù)據(jù)庫(kù)表的命名和字段的命名不要太直白稍算,盡量不讓人猜到。

33. 為表中的字段選擇合適的數(shù)據(jù)類型

字段類型優(yōu)先級(jí):整形>date,time>enum,char>varchar>blob,text
用言語(yǔ)講就是優(yōu)先考慮數(shù)字類型役拴,其次是日期或者二進(jìn)制類型糊探,最后是字符串類型。同級(jí)別的數(shù)據(jù)類型應(yīng)該優(yōu)先選擇占用空間小的數(shù)據(jù)類型河闰。

34. 存儲(chǔ)時(shí)期

  • Datetime:以yyyy-MM-dd HH:mm:ss格式存儲(chǔ)日期時(shí)間侧到。精確到秒,占用8個(gè)字節(jié)的存儲(chǔ)空間淤击,datetime類型與時(shí)區(qū)無關(guān)系。
  • Timestamp:以時(shí)間戳格式存儲(chǔ)故源,占用四個(gè)字節(jié)污抬。范圍自1970/1/1到2038/1/19.顯示依賴于所指定的時(shí)區(qū)。默認(rèn)這行數(shù)據(jù)修改時(shí)可以自動(dòng)的修改timestamp列的值绳军。
  • Date: 占用的字節(jié)數(shù)比字符串印机,datetime,int存儲(chǔ)要少门驾。使用date僅僅需要三個(gè)字符射赛。存儲(chǔ)年月日。還可以利用日期時(shí)間函數(shù)進(jìn)行日期間的計(jì)算奶是。
  • Time:存儲(chǔ)時(shí)間部分的數(shù)據(jù)楣责。

注意:不要使用字符串類型來存儲(chǔ)日期時(shí)間數(shù)據(jù)(因?yàn)槿掌陬愋捅茸址加玫拇鎯?chǔ)空間小,而且查找或者過濾聂沙,甚至一些時(shí)間計(jì)算上可以利用日期的函數(shù)秆麸。)
使用int存儲(chǔ)時(shí)間日期不如使用timestamp類型。

35. 對(duì)于關(guān)系型數(shù)據(jù)庫(kù)而言及汉,索引是相當(dāng)重要的概念沮趣,請(qǐng)回答以下幾個(gè)問題:

索引的目的是什么?
快速訪問數(shù)據(jù)庫(kù)表中的特定信息坷随。提高檢索速度房铭。
創(chuàng)建唯一性索引驻龟,保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。
加速表和表之間的鏈接缸匪。
使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí)翁狐,可以顯著減少查詢中分組和排序的時(shí)間。
索引對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的負(fù)面影響是什么豪嗽?
創(chuàng)建索引和維護(hù)索引需要耗費(fèi)時(shí)間谴蔑,這個(gè)時(shí)間隨著數(shù)據(jù)量的增加而增加。索引需要占用物理空間龟梦。不光是表需要占用數(shù)據(jù)空間隐锭,每個(gè)索引也需要占用物理空間。當(dāng)對(duì)表進(jìn)行增刪改的時(shí)候索引也要?jiǎng)討B(tài)維護(hù)计贰,這樣就降低了數(shù)據(jù)的維護(hù)速度钦睡。
為數(shù)據(jù)表建立索引的原則有哪些?
在最頻繁使用的躁倒,用以縮小查詢范圍的字段上建立索引荞怒。
在頻繁使用的,需要排序的字段上建立索引秧秉。
什么情況下不宜建立索引褐桌?
對(duì)于查詢中很少涉及到的列或者重復(fù)制比較多的列不宜建立索引。
對(duì)于一些特殊的數(shù)據(jù)類型比如blob象迎,text等荧嵌,不宜建立索引。

36. 解釋MySQL外連接砾淌,內(nèi)連接與自連接的區(qū)別

這個(gè)必須要先說一下交叉連接:交叉連接又叫笛卡爾積啦撮,它是指不用任何條件,直接一個(gè)表的所有記錄與另一個(gè)表的所有記錄一一匹配汪厨。
內(nèi)連接:是有條件的交叉連接赃春。根據(jù)某個(gè)條件篩選出符合條件的記錄,不符合條件的記錄不會(huì)出現(xiàn)在結(jié)果集中劫乱,即內(nèi)連接值連接匹配的行织中。(如下圖)

內(nèi)連接,外連接

外連接:如上圖衷戈,結(jié)果集不僅包含共有部分抠璃,共有+左表數(shù)據(jù)屬于左(外)連接。共有+右表數(shù)據(jù)屬于右(外)連接脱惰。這些數(shù)據(jù)全部包含的屬于全外連接搏嗡。
左外連接和右外連接中另一個(gè)表沒有的數(shù)據(jù)用null填充,MySQL目前不支持全外連接。

37. MySQL中事務(wù)回滾機(jī)制概述

事務(wù)是用戶定義的一個(gè)數(shù)據(jù)庫(kù)操作序列采盒。這些操作要么不做旧乞,要么全做,是一個(gè)不可分割的工作單位磅氨。事務(wù)回滾是指將該事務(wù)已經(jīng)完成的對(duì)數(shù)據(jù)庫(kù)的更新操作撤銷尺栖。
(正好這兩天我遇到了一個(gè)生活著的事務(wù)的例子:叫外賣的時(shí)候之前看了一家的小菜挺好,加購(gòu)以后要下單了才發(fā)現(xiàn)買這個(gè)小菜必須搭配某主食烦租。我看了下主食并不想要延赌,所以現(xiàn)在只有兩個(gè)操作:1.把主食也加購(gòu),2,不買小菜了叉橱。這個(gè)主食和小菜我們可以理解成一個(gè)事務(wù)挫以。要么全買,要么全不買窃祝。)

項(xiàng)目中掐松,要同時(shí)修改數(shù)據(jù)庫(kù)中兩個(gè)不同表時(shí),如果他們不是一個(gè)事務(wù)的話粪小,當(dāng)?shù)谝粋€(gè)表修改完大磺,可能第二個(gè)表的修改因?yàn)槟承┰驔]能修改。這個(gè)時(shí)候第一個(gè)表已經(jīng)是修改完的狀態(tài)探膊,而第二個(gè)表是未修改狀態(tài)杠愧。
而如果我們把這兩個(gè)操作放到一個(gè)事務(wù)中,第一個(gè)表修改完逞壁,第二個(gè)表因?yàn)楫惓]能修改的話流济,第一個(gè)表和第二個(gè)表都回到未修改狀態(tài),這個(gè)就是事務(wù)的回滾猾担。

38. SQL語(yǔ)句包括哪幾部分?每部分都有哪些操作關(guān)鍵字刺下?

SQL語(yǔ)句分四種:

  • 數(shù)據(jù)定義DDL
  • 數(shù)據(jù)操縱DML
  • 數(shù)據(jù)控制DCL
  • 數(shù)據(jù)查詢DQL

數(shù)據(jù)定義DDL:CREATE TABLE, ALTER TABLE, DROP TABLE, CREATE/DROP INDEX等绑嘹。(簡(jiǎn)單來說就是增刪改表,索引)
數(shù)據(jù)操縱DML: SELECT, INSERT, UPDATE, DELETE等(簡(jiǎn)單來說增刪改查記錄)
數(shù)據(jù)控制DCL: GRANT, REVOKE(這兩個(gè)比較少用到橘茉,是給數(shù)據(jù)庫(kù)用戶授權(quán)/撤銷授權(quán)的)
數(shù)據(jù)查詢DQL:SELECT

39. 完整性約束包括哪些工腋?

數(shù)據(jù)完整性是指數(shù)據(jù)的精確和可靠性。
分為以下四類:

  1. 實(shí)體完整性: 規(guī)定表的每一行在表中是唯一的實(shí)體畅卓。
  2. 域完整性:是指表中的列必須滿足某種特定的數(shù)據(jù)類型約束擅腰。其中約束又包括取值范圍,精度等規(guī)定翁潘。
  3. 參照完整性: 是指兩個(gè)表的主關(guān)鍵字和外關(guān)鍵字的數(shù)據(jù)應(yīng)一致趁冈。保證了表之間的數(shù)據(jù)的一致性。防止了數(shù)據(jù)丟失或者無意義的數(shù)據(jù)在數(shù)據(jù)庫(kù)中擴(kuò)散。
  4. 用戶定義的完整性: 不同的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)根據(jù)其應(yīng)用環(huán)境的不同渗勘,往往還需要一些特殊的約束條件沐绒,用戶定義的完整性即針對(duì)某個(gè)特定關(guān)系數(shù)據(jù)庫(kù)的約束條件。它反映某一具體應(yīng)用必須滿足的語(yǔ)義要求旺坠。

與表有關(guān)的約束:列的非空約束乔遮。表的主鍵約束,唯一約束取刃,指定類型約束蹋肮,外鍵約束等。

40. 什么是鎖璧疗?

數(shù)據(jù)庫(kù)是一個(gè)多用戶使用的共享資源坯辩。當(dāng)多個(gè)用戶并發(fā)的存取數(shù)據(jù)時(shí),在數(shù)據(jù)庫(kù)中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況病毡,若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存取不正確的數(shù)據(jù)濒翻,破壞數(shù)據(jù)庫(kù)的一致性。
加鎖是實(shí)現(xiàn)數(shù)據(jù)庫(kù)并發(fā)控制的一個(gè)非常重要的技術(shù)啦膜。當(dāng)事務(wù)在對(duì)某個(gè)數(shù)據(jù)對(duì)象進(jìn)行操作前有送,先向系統(tǒng)發(fā)出請(qǐng)求,對(duì)其加鎖僧家。加鎖后事務(wù)就對(duì)該數(shù)據(jù)對(duì)象有了一定的控制雀摘,在改事務(wù)釋放鎖之前,其他的事務(wù)不能對(duì)此數(shù)據(jù)對(duì)象進(jìn)行更新操作八拱。
基本鎖類型:表級(jí)鎖和行級(jí)鎖(這個(gè)第一個(gè)題好像就說了阵赠,還有個(gè)頁(yè)面鎖,其中優(yōu)缺點(diǎn)都有介紹)

41. 什么叫視圖肌稻?游標(biāo)是什么清蚀?

視圖是一種虛擬的表。具有和物理表相同的功能爹谭〖闲埃可以對(duì)視圖進(jìn)行增/改/查操作。視圖通常是由一個(gè)表或者多個(gè)表的行或列的子集诺凡。對(duì)視圖的修改不影響基本表东揣。
它使得我們獲取數(shù)據(jù)更容易,相比于多表查詢腹泌。
游標(biāo)是對(duì)查詢出來的結(jié)果集作為一個(gè)單元來有效的處理嘶卧。游標(biāo)可以定在該單元中的特定行。從結(jié)果集的當(dāng)前行檢索一行或者多行凉袱〗嬉鳎可以對(duì)結(jié)果集當(dāng)前行做修改。
一般不使用游標(biāo),但是當(dāng)需要逐條處理數(shù)據(jù)的時(shí)候运沦,游標(biāo)顯得極其重要泵额。

42. 什么是存儲(chǔ)過程?用什么來調(diào)用携添?

存儲(chǔ)過程是一個(gè)預(yù)編譯的SQL語(yǔ)句嫁盲。優(yōu)點(diǎn)是允許模塊化的設(shè)計(jì),就是說只需要?jiǎng)?chuàng)建一次以后在該程序中就可以調(diào)用多次烈掠。如果某次操作需要執(zhí)行多次SQL,使用存儲(chǔ)過程比單純sql語(yǔ)句執(zhí)行要快羞秤。可以用一個(gè)命令對(duì)象來調(diào)用存儲(chǔ)過程左敌。

43. 如何通俗的理解三個(gè)范式瘾蛋?

第一范式:列的不可再分。是對(duì)屬性的原子性約束矫限。要求屬性具有原子性哺哼,不可再分解。舉個(gè)例子:如果是存地址叼风,可以分為省市區(qū)詳細(xì)地址四個(gè)字段取董。而不是所有的地址放在一個(gè)字段。否則就是可再分的无宿,不具有原子性茵汰。
第二范式:在滿足第一范式的前提下,一行數(shù)據(jù)只做一件事孽鸡。這個(gè)是對(duì)記錄的唯一性約束蹂午。要求記錄有唯一標(biāo)識(shí),即實(shí)體的唯一性彬碱。打個(gè)比方:我們常用的下訂單功能:商品件數(shù)不定豆胸,但是訂單就是一個(gè)訂單。如果每個(gè)商品都保存這個(gè)訂單的信息(訂單號(hào)巷疼,下單時(shí)間晚胡,訂單金額等)就是冗余。這個(gè)時(shí)候我們應(yīng)該拆分成訂單表和訂單對(duì)應(yīng)商品表皮迟。保證一個(gè)表只做一件事搬泥。
第三范式:滿足1,2后桑寨,表中的每一列都直接與主鍵相關(guān)而不是間接相關(guān)伏尼。這個(gè)是對(duì)表的冗余性的約束。即任何字段不能由其他字段派生出來尉尾。它要求的是不要有冗余字段爆阶。這個(gè)怎么說呢,繼續(xù)第二范式的例子:用戶直接下訂單。也就是用戶和訂單是有關(guān)系的辨图。而訂單包含商品班套,也就是訂單和商品是有關(guān)系的。本質(zhì)上用戶購(gòu)買的是商品故河,但是Vň隆!我們不應(yīng)該在訂單商品表中摻雜用戶的信息鱼的。因?yàn)橛脩?>訂單->商品理盆,這個(gè)是間接的關(guān)系了。

任何脫離實(shí)際的要求都是純扯淡凑阶!注意這句話不是我說的猿规,是陽(yáng)哥(尚硅谷講師周陽(yáng))說的。也就是實(shí)際上范式落實(shí)到實(shí)際中是不能百分百遵守的宙橱,完全按照范式來不見得會(huì)做出好東西姨俩。因?yàn)橛袝r(shí)候?qū)嶋H的需求就是這么操蛋,阿里不都說了合理的冗余是必要的么师郑!下面簡(jiǎn)單說下范式化設(shè)計(jì)的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):可以盡量的減少數(shù)據(jù)冗余环葵,使得更新快,體積小呕乎。如果數(shù)據(jù)異常积担,數(shù)據(jù)修改比較容易。
缺點(diǎn):對(duì)于查詢需要多個(gè)表進(jìn)行關(guān)聯(lián)猬仁,使得寫更優(yōu)化帝璧,但是讀更復(fù)雜。更難進(jìn)行索引優(yōu)化湿刽。

44. 什么是基本表的烁?什么是視圖?

基本表是指本身獨(dú)立存在的表诈闺,在SQL中一個(gè)關(guān)系就對(duì)應(yīng)一個(gè)表渴庆。
視圖是從一個(gè)或者幾個(gè)基本表導(dǎo)出的表。視圖本身不獨(dú)立存儲(chǔ)在數(shù)據(jù)庫(kù)中雅镊,是一個(gè)虛表襟雷。

45. 視圖的優(yōu)點(diǎn)?

  1. 簡(jiǎn)化用戶的操作
  2. 視圖使用戶能以多種角度看待同一個(gè)數(shù)據(jù)仁烹。
  3. 試圖為數(shù)據(jù)庫(kù)提供了一定程度的邏輯獨(dú)立性
  4. 視圖能夠?qū)C(jī)密數(shù)據(jù)提供安全保護(hù)耸弄。

46. null是什么意思?

null這個(gè)值表示的是unknown(未知)卓缰,它不是“”(空串)计呈。任何值與null值比較都會(huì)是null砰诵。我們可以使用is null 來進(jìn)行null判斷。

47. 主鍵/外鍵/索引的區(qū)別捌显?

主鍵: 一條記錄的唯一標(biāo)識(shí)茁彭,不能有重復(fù)的,也不許為空扶歪。(主鍵約束包含非空和唯一約束理肺。)
作用是用來保證數(shù)據(jù)的完整性。
一個(gè)表只能有一個(gè)主鍵善镰。
外鍵:表的外鍵是另一個(gè)表的主鍵哲嘲。可以有重復(fù)媳禁,也可以有空值眠副。
作用是用來和其他表建立聯(lián)系。
一個(gè)表可以有多個(gè)外鍵竣稽。
索引: 為了提高查詢排序的速度而專門對(duì)一些列進(jìn)行排序囱怕。
一個(gè)表可以有多個(gè)索引。

48. 你可以用什么來確保表里的字段只接受特定范圍里的值毫别?

可以用Check限制娃弓。他在數(shù)據(jù)庫(kù)表里被定義,用來限制輸入該列的值岛宦。

49. 簡(jiǎn)單說下對(duì)SQL語(yǔ)句優(yōu)化的方法

  1. Where字句中台丛,表之間的鏈接必須寫在最前面±危可以過濾掉最大數(shù)量記錄的條件寫在where子句的末尾挽霉。having寫在最后。
  2. 用 exists代替in变汪,用not exists代替not in
  3. 避免在索引上使用計(jì)算
  4. 避免在索引上使用 is null和 is not null
  5. 對(duì)查詢進(jìn)行優(yōu)化侠坎,應(yīng)該盡量避免全表掃描,首先應(yīng)該考慮在where已經(jīng)order by涉及的列上建立索引裙盾。
  6. 應(yīng)盡量避免在where子句中對(duì)字段進(jìn)行null判斷实胸,否則會(huì)放棄使用索引而進(jìn)行全表掃描。
  7. 應(yīng)盡量避免在where子句中對(duì)字段進(jìn)行表達(dá)式操作番官,否則也會(huì)放棄使用索引而進(jìn)行全表掃描庐完。

至此,這本書中MySQL方面的面試題就結(jié)束啦徘熔!全文50個(gè)題目门躯。其中一個(gè)現(xiàn)在已經(jīng)很少用了所以我沒記錄。剩下別的其實(shí)也有很多重復(fù)的題目或者說比較老的題目近顷,不過多看看總沒有錯(cuò)生音!本篇筆記如果稍微幫到你了記得點(diǎn)個(gè)喜歡點(diǎn)個(gè)關(guān)注罚斗。也祝大家身體健健康康夭苗,工作順利吧!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杭朱,一起剝皮案震驚了整個(gè)濱河市饱须,隨后出現(xiàn)的幾起案子域醇,更是在濱河造成了極大的恐慌,老刑警劉巖蓉媳,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件譬挚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡酪呻,警方通過查閱死者的電腦和手機(jī)减宣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玩荠,“玉大人漆腌,你說我怎么就攤上這事〗赘裕” “怎么了闷尿?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)女坑。 經(jīng)常有香客問我填具,道長(zhǎng),這世上最難降的妖魔是什么匆骗? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任劳景,我火速辦了婚禮,結(jié)果婚禮上碉就,老公的妹妹穿的比我還像新娘枢泰。我一直安慰自己,他們只是感情好铝噩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布衡蚂。 她就那樣靜靜地躺著,像睡著了一般骏庸。 火紅的嫁衣襯著肌膚如雪毛甲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天具被,我揣著相機(jī)與錄音玻募,去河邊找鬼。 笑死一姿,一個(gè)胖子當(dāng)著我的面吹牛七咧,可吹牛的內(nèi)容都是我干的跃惫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼艾栋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼爆存!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蝗砾,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤先较,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后悼粮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闲勺,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年扣猫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了菜循。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡申尤,死狀恐怖债朵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瀑凝,我是刑警寧澤序芦,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站粤咪,受9級(jí)特大地震影響谚中,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寥枝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一宪塔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧囊拜,春花似錦某筐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蜜托,卻和暖如春抄囚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背橄务。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工幔托, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓重挑,卻偏偏與公主長(zhǎng)得像嗓化,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谬哀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容