大型網(wǎng)購(gòu)網(wǎng)站開(kāi)發(fā)框架谷歌應(yīng)用商店下載
面試數(shù)據(jù)庫(kù)八股文五問(wèn)五答第四期
作者:程序員小白條,個(gè)人博客
相信看了本文后,對(duì)你的面試是有一定幫助的!
?點(diǎn)贊?收藏?不迷路!?
1)什么情況下 mysql 會(huì)索引失效?
- 不使用索引列進(jìn)行查詢(xún):當(dāng)查詢(xún)條件不包含索引列時(shí),MySQL無(wú)法使用索引進(jìn)行快速查找,而會(huì)進(jìn)行全表掃描,導(dǎo)致索引失效。
- 使用函數(shù)或表達(dá)式對(duì)索引列進(jìn)行操作:當(dāng)查詢(xún)條件對(duì)索引列進(jìn)行函數(shù)操作或表達(dá)式計(jì)算時(shí),MySQL無(wú)法直接使用索引,而會(huì)進(jìn)行全表掃描。
- 數(shù)據(jù)量過(guò)小:當(dāng)表中的數(shù)據(jù)量過(guò)小時(shí),MySQL可能會(huì)選擇全表掃描而不是使用索引,因?yàn)槿頀呙璧拈_(kāi)銷(xiāo)更小。
- 索引列數(shù)據(jù)重復(fù)度過(guò)高:當(dāng)索引列的數(shù)據(jù)重復(fù)度過(guò)高時(shí),MySQL可能會(huì)放棄使用索引,因?yàn)槿頀呙璧拈_(kāi)銷(xiāo)更小。
- 索引列數(shù)據(jù)類(lèi)型不匹配:當(dāng)查詢(xún)條件中的數(shù)據(jù)類(lèi)型與索引列的數(shù)據(jù)類(lèi)型不匹配時(shí),MySQL無(wú)法使用索引進(jìn)行查找,而會(huì)進(jìn)行全表掃描。
2)B+ 樹(shù)和 B 樹(shù)的區(qū)別是什么?
- 數(shù)據(jù)存儲(chǔ)方式:B樹(shù)中的每個(gè)節(jié)點(diǎn)存儲(chǔ)的是鍵值對(duì),而B(niǎo)+樹(shù)中的每個(gè)節(jié)點(diǎn)只存儲(chǔ)鍵,數(shù)據(jù)存儲(chǔ)在葉子節(jié)點(diǎn)上。
- 葉子節(jié)點(diǎn)的指針:B樹(shù)中的葉子節(jié)點(diǎn)包含了指向數(shù)據(jù)的指針,而B(niǎo)+樹(shù)中的葉子節(jié)點(diǎn)只包含鍵和指向下一個(gè)葉子節(jié)點(diǎn)的指針。
- 葉子節(jié)點(diǎn)的順序訪(fǎng)問(wèn):B樹(shù)中的葉子節(jié)點(diǎn)是通過(guò)指針連接在一起的,可以進(jìn)行范圍查詢(xún)。而B(niǎo)+樹(shù)中的葉子節(jié)點(diǎn)是通過(guò)鏈表連接在一起的,只能進(jìn)行單個(gè)鍵的查詢(xún)。
- 索引的高度:B樹(shù)的高度比B+樹(shù)的高度要高,因?yàn)锽樹(shù)中的每個(gè)節(jié)點(diǎn)都包含了數(shù)據(jù)。
- 索引的掃描效率:B+樹(shù)的葉子節(jié)點(diǎn)連續(xù)存儲(chǔ)數(shù)據(jù),可以更快地進(jìn)行范圍查詢(xún)和順序訪(fǎng)問(wèn),因此在大數(shù)據(jù)量的情況下,B+樹(shù)的掃描效率更高。
3)如果處理慢查詢(xún)?
- 優(yōu)化查詢(xún)語(yǔ)句:檢查慢查詢(xún)?nèi)罩?#xff0c;分析查詢(xún)語(yǔ)句的執(zhí)行計(jì)劃,優(yōu)化查詢(xún)語(yǔ)句的索引使用和查詢(xún)邏輯,盡量減少查詢(xún)的開(kāi)銷(xiāo)。
- 優(yōu)化表結(jié)構(gòu):通過(guò)添加合適的索引、調(diào)整字段類(lèi)型和長(zhǎng)度、拆分大表等方式優(yōu)化表結(jié)構(gòu),提高查詢(xún)的性能。
- 配置合適的參數(shù):調(diào)整MySQL的配置參數(shù),如緩沖區(qū)大小、連接數(shù)等,以滿(mǎn)足查詢(xún)的需求,提高查詢(xún)的效率。
- 使用緩存:使用緩存技術(shù),如Redis或Memcached,將熱點(diǎn)數(shù)據(jù)緩存起來(lái),減少對(duì)數(shù)據(jù)庫(kù)的查詢(xún)次數(shù)。
- 分析和監(jiān)控:使用工具進(jìn)行慢查詢(xún)分析和性能監(jiān)控,找出慢查詢(xún)的原因和瓶頸,并進(jìn)行相應(yīng)的優(yōu)化。
4)Linux 如果排查 MySQL 問(wèn)題
- 查看日志文件:查看MySQL的錯(cuò)誤日志文件,通常位于/var/log/mysql/目錄下,查看是否有異常報(bào)錯(cuò)信息。
- 使用命令行工具:使用命令行工具如mysqladmin或mysqlshow查看MySQL的運(yùn)行狀態(tài)、進(jìn)程列表、連接數(shù)等信息。
- 使用性能監(jiān)控工具:使用性能監(jiān)控工具如MySQL Performance Schema、Percona Toolkit等來(lái)監(jiān)控MySQL的性能指標(biāo)和查詢(xún)執(zhí)行情況。
- 檢查系統(tǒng)資源:使用命令如top、htop等來(lái)查看系統(tǒng)的CPU、內(nèi)存、磁盤(pán)等資源使用情況,是否有資源瓶頸。
- 分析慢查詢(xún):使用慢查詢(xún)?nèi)罩净蛐阅鼙O(jiān)控工具,分析慢查詢(xún)的執(zhí)行計(jì)劃、索引使用情況等,找出慢查詢(xún)的原因并進(jìn)行優(yōu)化。
5)數(shù)據(jù)庫(kù)分表如何操作
- 設(shè)計(jì)分表策略:根據(jù)業(yè)務(wù)需求和數(shù)據(jù)特點(diǎn),設(shè)計(jì)合適的分表策略,如按照時(shí)間、地理位置、用戶(hù)ID等進(jìn)行分表。
- 創(chuàng)建分表結(jié)構(gòu):根據(jù)分表策略,創(chuàng)建對(duì)應(yīng)的分表結(jié)構(gòu),包括表名、字段、索引等。
- 遷移數(shù)據(jù):將原有的數(shù)據(jù)遷移到分表中,可以使用INSERT INTO SELECT語(yǔ)句或數(shù)據(jù)導(dǎo)入工具進(jìn)行數(shù)據(jù)遷移。
- 修改應(yīng)用程序:修改應(yīng)用程序的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)邏輯,根據(jù)分表策略動(dòng)態(tài)選擇訪(fǎng)問(wèn)的分表。
- 維護(hù)分表:定期維護(hù)分表,包括數(shù)據(jù)清理、數(shù)據(jù)遷移、索引優(yōu)化等,以保證分表的性能和數(shù)據(jù)的一致性。