究竟是什么影響了MySQL的性能

1.影響數(shù)據(jù)庫性能的幾個(gè)方面

????服務(wù)器硬件

????服務(wù)器系統(tǒng)

????數(shù)據(jù)庫存儲(chǔ)引擎的選擇(MySQL的插件式存儲(chǔ)引擎)

????MyISAM:不支持事務(wù),表級(jí)鎖。

????InnoDB:事務(wù)級(jí)存儲(chǔ)引擎,完美支持行級(jí)鎖,事務(wù)ACID特性。

????數(shù)據(jù)庫參數(shù)配置

????數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)和SQL語句的編寫和優(yōu)化

2.CPU資源和可用內(nèi)存大?。ǚ?wù)器硬件)

對(duì)MySQL性能有影響的硬件資源:CPU資源和可用內(nèi)存大小

(1)目前版本的MySQL不支持多CPU對(duì)同一SQL的并發(fā)處理。

(2)內(nèi)存的大小直接影響了數(shù)據(jù)庫的效率。

(3)MyISAM把索引緩存到內(nèi)存中,而數(shù)據(jù)通過操作系統(tǒng)來進(jìn)行緩存。

(4)InnoDB會(huì)同時(shí)在內(nèi)存中緩存數(shù)據(jù)和索引,從而提高數(shù)據(jù)庫運(yùn)行效率。

(5)內(nèi)存雖然是越多越好,但是對(duì)性能的影響是有限的,并不能通過增加內(nèi)存來無限的增加性能。

(6)在讀取數(shù)據(jù)時(shí),先讀取緩存,緩存沒有再讀取硬盤;在寫入數(shù)據(jù)時(shí),也可以將數(shù)據(jù)寫入緩存,然后將多次寫入變成一次寫入,將數(shù)據(jù)一次性從緩存寫入硬盤。

(7)選擇內(nèi)存時(shí)應(yīng)該選擇服務(wù)器主板支持的最大內(nèi)存頻率,頻率越高速度越快。

3.磁盤的配置和選擇

無論如何,數(shù)據(jù)最終都要在磁盤上實(shí)現(xiàn)永久存儲(chǔ),所以IO子系統(tǒng)比內(nèi)存更加重要。

常用的磁盤IO系統(tǒng):

使用傳統(tǒng)機(jī)器硬盤:

????特點(diǎn):最常見,使用最多,價(jià)格性對(duì)低,存儲(chǔ)空間較大,讀寫速度較慢。

傳統(tǒng)機(jī)器硬盤讀取數(shù)據(jù)的過程:

????移動(dòng)磁頭到磁盤表面上的正確位置

????等待磁盤旋轉(zhuǎn),使的所需的數(shù)據(jù)在磁頭之下

????等待磁盤旋轉(zhuǎn)過去,所有所需的數(shù)據(jù)都被磁頭讀出

????(1,2為訪問時(shí)間。3為傳輸時(shí)間)

如何選擇傳統(tǒng)機(jī)器硬盤:

????存儲(chǔ)容量

????傳輸速度

????訪問時(shí)間

????主軸轉(zhuǎn)速

????物理尺寸

使用RAID增強(qiáng)傳統(tǒng)機(jī)器硬盤的性能:

????概述:RAID是磁盤冗余隊(duì)列的簡稱。簡單來說RAID的作用就是可以把多個(gè)容量較小的磁盤組成一組容量更大的磁盤,并提供數(shù)據(jù)冗余來保證數(shù)據(jù)完整性的技術(shù)。

常用RAID級(jí)別:

RAID 0:最早出現(xiàn)的RAID模式,也稱之為數(shù)據(jù)條帶。是組建磁盤陣列中最簡單的一種形式,只需要2塊以上的硬盤即可,成本低,可以提高整個(gè)磁盤的性能和吞吐量。RAID 0沒有提供冗余或錯(cuò)誤修復(fù)能力,但是實(shí)現(xiàn)成本是最低的。

RAID 1:又稱為磁盤鏡像,原理是把一個(gè)磁盤的數(shù)據(jù)鏡像到另一個(gè)磁盤上,也就是說數(shù)據(jù)在寫入一塊磁盤的同時(shí),會(huì)在另一塊閑置的磁盤上生成鏡像文件,在不影響性能情況下最大限度的保證系統(tǒng)的可靠性和可修復(fù)性。

RAID 5:又稱之為分布式奇偶校驗(yàn)磁盤陣列。通過分布式奇偶檢驗(yàn)塊把數(shù)據(jù)分散到多個(gè)磁盤上,這樣如果任何一個(gè)盤數(shù)據(jù)失效,都可以從奇偶校驗(yàn)塊中重建。但是如果兩塊磁盤失效,則整個(gè)卷的數(shù)據(jù)都無法恢復(fù)。

RAID 10 :又稱分片的鏡像。它是對(duì)磁盤先做RAID 1之后對(duì)兩種RAID 1的磁盤再做RAID 0,所以對(duì)讀寫都有良好的性能,相對(duì)于RAID 5 重建起來更簡單,速度也更快。

使用固態(tài)存儲(chǔ)SSD和PCIE卡:

????特點(diǎn):相比機(jī)械磁盤固態(tài)磁盤有更好的隨機(jī)讀寫性能,能更好的支持并發(fā),但是也更容易損壞。

使用場(chǎng)景:

????適用于存在大量隨機(jī)I/O的場(chǎng)景

????適用于解決單線程負(fù)載的I/O瓶頸

????使用網(wǎng)絡(luò)存儲(chǔ)NAS和SAN:

含義:NAS和SAN是兩種外部文件存儲(chǔ)設(shè)備加載到服務(wù)器上的方法。

區(qū)別:

????SAN設(shè)備通過光纖連接到服務(wù)器,設(shè)備通過塊接口訪問,服務(wù)器可以將其當(dāng)做硬盤使用。順序讀寫快,隨機(jī)讀寫慢。

????NAS設(shè)備使用網(wǎng)絡(luò)連接,通過基于文件的協(xié)議如NFS或SMB來訪問。

網(wǎng)絡(luò)存儲(chǔ)使用的場(chǎng)景:

????并不適合MySQL數(shù)據(jù)庫存儲(chǔ)數(shù)據(jù)文件。

????適合數(shù)據(jù)庫備份

4.MySQL體系結(jié)構(gòu)

客戶端

MySQL服務(wù)層:包括連接管理器、查詢緩存、查詢解析、查詢優(yōu)化器。比如select語句也是在MySQL服務(wù)層來實(shí)現(xiàn)的。

存儲(chǔ)引擎層:存儲(chǔ)引擎是針對(duì)于表的而不是針對(duì)于庫的(一個(gè)庫中的不同表可以使用不同的存儲(chǔ)引擎)

5.MySQL常用存儲(chǔ)引擎之MyISAM

1.MySQL5.5之前版本默認(rèn)存儲(chǔ)引擎

2.MyISAM存儲(chǔ)引擎表由MYD(數(shù)據(jù)文件)和MYI(索引文件)組成

3.MyISAM的特性:

????并發(fā)性與所級(jí)別

????表損壞修復(fù)

????MyISAM表支持的索引類型(全文索引)

????MyISAM表支持?jǐn)?shù)據(jù)壓縮

4.MyISAM的限制:

????版本<MySQL5.0時(shí)默認(rèn)表大小為4G

????如存儲(chǔ)大表則要修改MAX_Rows和AVG_ROW_LENGTH

????版本>MySQL5.0時(shí)默認(rèn)支持為256TB

5.適用場(chǎng)景:

????非事務(wù)型應(yīng)用

????只讀類應(yīng)用

????空間類應(yīng)用

6.MySQL常用存儲(chǔ)引擎之Innodb

Innodb使用表空間進(jìn)行 數(shù)據(jù)存儲(chǔ)

????參數(shù):innodb_file_per_table

????參數(shù)為on,則表示獨(dú)立表空間:tablename.ibd;

????參數(shù)為OFF,則表示系統(tǒng)表空間:ibdataX.

系統(tǒng)表空間和獨(dú)立表空間要如何選擇:

????系統(tǒng)表空間無法簡單的收縮文件大小

????獨(dú)立表空間可以通過optimize table命令收縮系統(tǒng)文件

????系統(tǒng)表空間會(huì)產(chǎn)生IO瓶頸

????獨(dú)立表空間可以同時(shí)向多個(gè)文件刷新數(shù)據(jù)

建議:

????對(duì)Innodb使用獨(dú)立表空間

把原來存在于系統(tǒng)表空間中的表轉(zhuǎn)移到獨(dú)立表空間中的方法:

????使用mysqldump導(dǎo)出所有數(shù)據(jù)庫表數(shù)據(jù)

????停止MySQL服務(wù),修改參數(shù),并刪除Innodb相關(guān)文件

????重啟MySQL服務(wù),重建Innodb系統(tǒng)表空間

????重新導(dǎo)入數(shù)據(jù)

????Innodb存儲(chǔ)引擎的特性

????Innodb是一種事務(wù)型存儲(chǔ)引擎

????完全支持事務(wù)的ACID特性

????日志類型:Redo Log 和 Undo Log

????Redo Log 實(shí)現(xiàn)事務(wù)的持久性 存儲(chǔ)的是已經(jīng)提交的事務(wù)(提交失敗或者回滾),順序?qū)懭搿?/p>

????Undo Log 實(shí)現(xiàn)的是未提交的事務(wù),隨機(jī)讀寫。

????Innodb支持行級(jí)鎖

????行級(jí)鎖可以最大程度的支持并發(fā)

????行級(jí)鎖是由存儲(chǔ)引擎層實(shí)現(xiàn)的

什么是鎖

????鎖的主要作用是管理共享資源的并發(fā)訪問

????鎖用于實(shí)現(xiàn)事務(wù)的隔離性

鎖的類型

????共享鎖(讀鎖)

? ? 獨(dú)占鎖(寫鎖)

鎖的粒度

????表級(jí)鎖

? ? 行級(jí)鎖

阻塞和死鎖

????什么是阻塞:事務(wù)中的兼容性關(guān)系,比如一個(gè)事務(wù)的鎖需要等待另一個(gè)事務(wù)的鎖的釋放。

????什么是死鎖:兩個(gè)或者兩個(gè)以上的事務(wù),在執(zhí)行過程中,相互占用了對(duì)方等待的資源。數(shù)據(jù)庫系統(tǒng)會(huì)自動(dòng)發(fā)現(xiàn)死鎖,可以由系統(tǒng)自動(dòng)處理。處理方式是:將死鎖中占用資源最少的事務(wù)回滾,能使其他事務(wù)進(jìn)行下去。

Innodb狀態(tài)檢查

????提供了一個(gè)獨(dú)特的性能監(jiān)控工具:show engine innodb status。如果想使用要在兩次間隔時(shí)間至少30秒。

使用場(chǎng)景

????MySQL5.7版本之后開始支持全文索引空間函數(shù)。

7.MySQL常用存儲(chǔ)引擎之CSV

文件系統(tǒng)存儲(chǔ)特點(diǎn):

????數(shù)據(jù)以文本方式存儲(chǔ)在文件中

????.CSV文件存儲(chǔ)表內(nèi)容

????.CSM文件存儲(chǔ)表的元數(shù)據(jù)如表狀態(tài)和數(shù)據(jù)量????

????.frm文件存儲(chǔ)表結(jié)構(gòu)信息

特點(diǎn):

????以CSV格式進(jìn)行數(shù)據(jù)存儲(chǔ)

????所有列必須都是不能為NULL的

????不支持索引,不適合大表,不適合在線處理

????可以對(duì)數(shù)據(jù)文件直接編輯,保存文本文件內(nèi)容

使用場(chǎng)景:

????適合作為數(shù)據(jù)交換的中間表??梢詫㈦娮颖砀瘢╡xcel)存儲(chǔ)為CSV文件,存儲(chǔ)到MySQL數(shù)據(jù)目錄下。

8.MySQL常用存儲(chǔ)引擎之Archive

文件系統(tǒng)存儲(chǔ)特點(diǎn):

????以zlib對(duì)表數(shù)據(jù)進(jìn)行壓縮,磁盤I/O更少

????數(shù)據(jù)存儲(chǔ)在ARZ為后綴的文件中

Archive存儲(chǔ)引擎的特點(diǎn):

????只支持insert和select操作

????只允許在自增ID列上加索引

使用場(chǎng)景:

????日志和數(shù)據(jù)采集類應(yīng)用

9.MySQL常用存儲(chǔ)引擎只Memory

文件系統(tǒng)存儲(chǔ)特點(diǎn):

也稱為HEAP存儲(chǔ)引擎,所以數(shù)據(jù)保存在內(nèi)存中。

功能特點(diǎn):

????支持HASH索引和BTree索引

????HASH索引適合等值查找

????BTree索引適合范圍查找

????所有字段都為固定長度 varchar(10)= char(10)

????不支持BLOG和TEXT等大字段

????Memory存儲(chǔ)引擎使用表級(jí)鎖

????最大大小由max_heap_table_size參數(shù)決定

容易混淆的概念:

????Memory存儲(chǔ)引擎表:

????臨時(shí)表:

????系統(tǒng)使用臨時(shí)表:

????超過限制使用Myisam臨時(shí)表

????未超限制使用Memory表

????create temporary table 建立的臨時(shí)表:

使用場(chǎng)景:

????用于查找或者是映射表,例如郵編和地區(qū)的對(duì)應(yīng)表

????用于保存數(shù)據(jù)分析中產(chǎn)生的中間表

????用于緩存周期性聚合數(shù)據(jù)的結(jié)果表

10.MySQL常用存儲(chǔ)引擎之Federated

特點(diǎn):

????提供了訪問遠(yuǎn)程MySQL服務(wù)器上表的方法

????本地不存儲(chǔ)數(shù)據(jù),數(shù)據(jù)全部放到遠(yuǎn)程服務(wù)器上

????本地需要保存表結(jié)構(gòu)和遠(yuǎn)程服務(wù)器的連接信息

如何使用:

????默認(rèn)禁止,啟用需要在啟動(dòng)時(shí)增加federated參數(shù)

????mysql://user_name[:password]@host_name[:port_num]/db_name/tbl_name

????user_name,password:本地連接到遠(yuǎn)程的用戶名和密碼

????host_name:遠(yuǎn)程MySQL服務(wù)器的IP

????port_num:遠(yuǎn)程MySQL服務(wù)器的端口號(hào)

????db_name:我們所要在本地去映射的服務(wù)器的名字

????tbl_name:映射的表的名字

使用場(chǎng)景:

????偶爾的統(tǒng)計(jì)分析及手工查詢

11.如何選擇正確的存儲(chǔ)引擎

參考條件:

????事務(wù)

????備份

????崩潰恢復(fù)

????存儲(chǔ)引擎的特有特性

12.MySQL服務(wù)器參數(shù)

MySQL獲取配置信息路徑:

????命令行參數(shù):mysqld_safe -- datadir=/data/sql_data

????配置文件

MySQL配置參數(shù)的作用域

????全局參數(shù)

????set global 參數(shù)名=參數(shù)值;

? ? set @@global.參數(shù)名 :=參數(shù)值;

????會(huì)話參數(shù)

????set【session】參數(shù)名 = 參數(shù)值;

????set@@session.參數(shù)名:= 參數(shù)值;

內(nèi)存配置相關(guān)參數(shù):

????確定可以使用的內(nèi)存的上限

????確定需要為操作系統(tǒng)保留多少內(nèi)存

????如何為緩存池分配內(nèi)存

????Innodb_buffer_pool_size

????總內(nèi)存 - (每個(gè)線程所需要的內(nèi)存*連接數(shù))- 系統(tǒng)保留內(nèi)存

????key_buffer_size(MyISAM)

????確定MySQL的每個(gè)連接使用的內(nèi)存

????sort_buffer_size

????join_buffer_size

????read_buffer_size

????read_rnd_buffer_size

安全相關(guān)配置參數(shù):

????expire_logs_days 指定自動(dòng)清理binlog的天數(shù)

????max_allowed_packet 控制MySQL可以接受的包的大小

????skip_name_resolve 禁用DNS查找????

????sysdate_is_now 確保sysdate()返回確定性日期

????read_only禁止非super權(quán)限的用戶寫權(quán)限(保證主從復(fù)制的一致性)

????skip_slave_start 禁用slave自動(dòng)恢復(fù)

????sql_mode 設(shè)置MySQL所使用的SQL模式

????strict_trans_tables

????no_engine_subtitution

????no_zero_date

????no_zero_in_date

????only_full_group_by

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容