后端面試題(二):談一談你對 MySQL 性能優(yōu)化的理解。
-----
MySQL 作為一種免費開源的關(guān)系型數(shù)據(jù)庫,深受著互聯(lián)網(wǎng)公司的喜愛。
因此,它也成為了技術(shù)面試官最常問的問題之一。
今天,我們就通過普通人與高手的形式,帶大家深入了解 MySQL 的性能優(yōu)化技
巧
-----
普通人
MySQL 的性能優(yōu)化主要在于對 SQL 執(zhí)行的優(yōu)化,因為慢的 SQL 執(zhí)行會帶來不好的用戶體驗,所以我們要關(guān)注 SQL 的執(zhí)行時間,比如有些沒有創(chuàng)建索引的列,我們
要創(chuàng)建索引,不合理的聯(lián)表查詢我們要簡化或者規(guī)避。
比如,在我以前的一個項目中,我的 SQL 沒有索引執(zhí)行,所以平均執(zhí)行都需要很多的時間。后面我加上了索引就好多了。
高手
常見的 SQL 優(yōu)化規(guī)則:
1. SQL 的查詢一定要基于索引來進行數(shù)據(jù)掃描
1. 避免索引列上使用函數(shù)或者運算,這樣會導(dǎo)致索引失效
1. where 字句中 like %號,盡量放置在右邊
1. 使用索引掃描,聯(lián)合索引中的列從左往右,命中越多越好.
1. 盡可能使用 SQL 語句用到的索引完成排序,避免使用文件排序的方式
1. 查詢有效的列信息即可.少用 * 代替列信息
1. 永遠用小結(jié)果集驅(qū)動大結(jié)果集。
MySQL 的性能優(yōu)化我認為可以分為 4 大部分
1. 硬件和操作系統(tǒng)層面的優(yōu)化
1. 架構(gòu)設(shè)計層面的優(yōu)化
1. MySQL 程序配置優(yōu)化
1. SQL 優(yōu)化
1. 硬件及操作系統(tǒng)層面優(yōu)化
從硬件層面來說,影響 Mysql 性能的因素有,CPU、可用內(nèi)存大小、磁盤讀寫速度、網(wǎng)絡(luò)帶寬從操作系層面來說,應(yīng)用文件句柄數(shù)、操作系統(tǒng)網(wǎng)絡(luò)的配置都會影響到 Mysql性能。這部分的優(yōu)化一般由 DBA 或者運維工程師去完成。在硬件基礎(chǔ)資源的優(yōu)化中,我們重點應(yīng)該關(guān)注服務(wù)本身承載的體量,然后提出合理的指標(biāo)要求,避免出現(xiàn)資源浪費!
架構(gòu)設(shè)計層面的優(yōu)化
MySQL 是一個磁盤 IO 訪問量非常頻繁的關(guān)系型數(shù)據(jù)庫,在高并發(fā)和高性能的場景中.MySQL 數(shù)據(jù)庫必然會承受巨大的并發(fā)壓力,而此時,我們的優(yōu)化方式可以分為幾個部分。
1. 搭建 Mysql 主從集群,單個 Mysql 服務(wù)容易單點故障,一旦服務(wù)器宕機,將會導(dǎo)致依賴 Mysql 數(shù)據(jù)庫的應(yīng)用全部無法響應(yīng)。 主從集群或者主主集群可以保證服務(wù)的高可用性。
2. 讀寫分離設(shè)計,在讀多寫少的場景中,通過讀寫分離的方案,可以避免讀寫沖突導(dǎo)致的性能影響。
3. 引入分庫分表機制,通過分庫可以降低單個服務(wù)器節(jié)點的 IO 壓力,通過分表的方式可以降低單表數(shù)據(jù)量,從而提升 sql 查詢的效率。
4. 針對熱點數(shù)據(jù),可以引入更為高效的分布式數(shù)據(jù)庫,比如 Redis、MongoDB等,他們可以很好的緩解 Mysql 的訪問壓力,同時還能提升數(shù)據(jù)檢索性能。
MySQL 程序配置優(yōu)化
MySQL 是一個經(jīng)過互聯(lián)網(wǎng)大廠驗證過的生產(chǎn)級別的成熟數(shù)據(jù)庫,對于 Mysql 數(shù)據(jù)庫本身的優(yōu)化,一般是通過 Mysql 中的配置文件 my.cnf 來完成的,比如。Mysql5.7 版本默認的最大連接數(shù)是 151 個,這個值可以在 my.cnf 中修改。
緩存池 bufferpoll 的默認大小配置等
由于這些配置一般都和用戶安裝的硬件環(huán)境以及使用場景有關(guān)系,因此這些配置官方只會提供一個默認值,具體情況還得由使用者來修改。