盘点那些面试中最常问的MySQL问题
? ? ? ? ?
1、MySQL中myisam與innodb的區(qū)別
MyISAM:
不支持事務(wù),但是每次查詢都是原子的;
支持表級鎖,即每次操作對整個(gè)表加鎖;
存儲表的總行數(shù);
一個(gè)MYISAM表有三個(gè)文件:索引文件、表結(jié)構(gòu)文件、數(shù)據(jù)文件;
采用非聚集索引,索引文件的數(shù)據(jù)域存儲指向數(shù)據(jù)文件的指針。輔索引與主索引基本一致,但是輔索引不用保證唯一性。
InnoDb:
支持ACID的事務(wù),支持事務(wù)的四種隔離級別;
支持行級鎖及外鍵約束:因此可以支持寫并發(fā);
不存儲總行數(shù);
一個(gè)InnoDb引擎存儲在一個(gè)文件空間(共享表空間,表大小不受操作系統(tǒng)控制,一個(gè)表可能分布在多個(gè)文件里),也有可能為多個(gè)(設(shè)置為獨(dú)立表空,表大小受操作系統(tǒng)文件大小限制,一般為2G),受操作系統(tǒng)文件大小的限制;
主鍵索引采用聚集索引(索引的數(shù)據(jù)域存儲數(shù)據(jù)文件本身),輔索引的數(shù)據(jù)域存儲主鍵的值;因此從輔索引查找數(shù)據(jù),需要先通過輔索引找到主鍵值,再訪問輔索引;最好使用自增主鍵,防止插入數(shù)據(jù)時(shí),為維持B+樹結(jié)構(gòu),文件的大調(diào)整。
兩者的適用場景:
因?yàn)镸yISAM相對簡單所以在效率上要優(yōu)于InnoDB.如果系統(tǒng)讀多,寫少。對原子性要求低。那么MyISAM最好的選擇。且MyISAM恢復(fù)速度快??芍苯佑脗浞莞采w恢復(fù)。
如果系統(tǒng)讀少,寫多的時(shí)候,尤其是并發(fā)寫入高的時(shí)候。InnoDB就是首選了。
擴(kuò)展問題:myisam與innodb引擎下select count(*)哪個(gè)更快,為什么?
知道的童鞋,歡迎留言說出正確答案~
2、MySQL INT和CHAR隱式類型轉(zhuǎn)換需要注意什么?
主要需要記住下面兩點(diǎn):
1、當(dāng)查詢字段是INT類型,如果查詢條件為CHAR,將查詢條件轉(zhuǎn)換為INT,如果是字符串前導(dǎo)都是數(shù)字,將截取前導(dǎo)數(shù)字用來比較,如果沒有前導(dǎo)數(shù)字,則轉(zhuǎn)換為0。
2.、當(dāng)查詢字段是CHAR/VARCHAR類型,如果查詢條件為INT,將查詢字段轉(zhuǎn)換為INT再進(jìn)行比較,可能會(huì)造成全表掃描。
答案解析
有如下一張測試表product,id為int類型,name為varchar類型。
+----+----------+ |?id?|?name???| +----+----------+ |??1?|?apple???| |??2?|?banana?| |??3?|?99cat???| +----+----------+情況1:
//?查詢條件轉(zhuǎn)化為數(shù)字1再比較 mysql>?select?*?from?product?where?id?=?\'1abc23\'; +----+---------+ |?id?|?name??| +----+---------+ |??1?|?apple??| +----+---------+情況2:
//?查詢字段全部轉(zhuǎn)化成數(shù)字,id:1和id:2字段值轉(zhuǎn)化為0,id:3轉(zhuǎn)化成99,再比較 mysql>?select?*?from?product?where?name=0; +----+----------+ |?id?|?name???| +----+----------+ |??1?|?apple???| |??2?|?banana?| +----+----------+3、MySQL 如何高效率隨機(jī)獲取N條數(shù)據(jù)?
假設(shè)表叫做mm_account。
ID連續(xù)的情況下(注意不能帶where,否則結(jié)果不好):
SELECT?* FROM?`mm_account`?AS?t1?JOIN?(SELECT?ROUND(RAND()?*?(SELECT?MAX(id)?FROM?`mm_account`))?AS?id)?AS?t2 WHERE?t1.id?>=?t2.id ORDER?BY?t1.id?ASC?LIMIT?4;ID不連續(xù)的情況下:
SELECT?*?FROM?`mm_account`? WHERE?id?>=?(SELECT?floor(RAND()?*?(SELECT?MAX(id)?FROM?`mm_account`)))??and?city="city_91"?and?showSex=1 ORDER?BY?id?LIMIT?4;如果有一個(gè)字段叫id,最快的方法如下(隨機(jī)獲取5條):
SELECT?*?FROM?mm_account? WHERE?id?>=?((SELECT?MAX(id)?FROM?mm_account)-(SELECT?MIN(id)?FROM?mm_account))?*?RAND()?+?(SELECT?MIN(id)?FROM?mm_account) limit?5;如果帶where語句,上面就不適合了,帶where語句請看下面:
SELECT?* FROM?`mm_account`?AS?t1?JOIN?(SELECT?ROUND(RAND()?*?( (SELECT?MAX(id)?FROM?`mm_account`?where?id<1000?)-(SELECT?MIN(id)?FROM?`mm_account`?where?id<1000?))+(SELECT?MIN(id)?FROM?`mm_account`?where?id<1000?))?AS?id)?AS?t2 WHERE?t1.id?>=?t2.id ORDER?BY?t1.id?LIMIT?5;4、說說你知道的MySQL的索引類型,并分別簡述一下各自的場景。
普通索引:沒有任何限制條件的索引,該索引可以在任何數(shù)據(jù)類型中創(chuàng)建。
唯一索引:使用UNIQUE參數(shù)可以設(shè)置唯一索引。創(chuàng)建該索引時(shí),索引列的值必須唯一,但允許有空值。通過唯一索引,用戶可以快速地定位某條記錄,主鍵索引是一種特殊的唯一索引。
全文索引:僅可用于 MyISAM 表,針對較大的數(shù)據(jù),生成全文索引耗時(shí)耗空間。
空間索引:只能建立在空間數(shù)據(jù)類型上。這樣可以提高系統(tǒng)獲取空間數(shù)據(jù)類型的效率。僅可用于 MyISAM 表,索引的字段不能為空值。使用SPATIAL參數(shù)可以設(shè)置索引為空間索引。
單列索引:只對應(yīng)一個(gè)字段的索引。
多列索引:在表的多個(gè)字段上創(chuàng)建一個(gè)索引。該索引指向創(chuàng)建時(shí)對應(yīng)的多個(gè)字段,用戶可以通過這幾個(gè)字段進(jìn)行查詢,想使用該索引,用戶必須使用這些字段中的一個(gè)字段。
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠(yuǎn)程辦公:常用的遠(yuǎn)程協(xié)助軟件,你都知道嗎?51單片機(jī)程序下載、ISP及串口基礎(chǔ)知識硬件:斷路器、接觸器、繼電器基礎(chǔ)知識
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的盘点那些面试中最常问的MySQL问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java项目构建基础:统一结果,统一异常
- 下一篇: Focal Loss 论文笔记