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