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