您好,登錄后才能下訂單哦!
本文主要給大家介紹影響數據庫查詢速度、MySQL性能的幾個因素,希望可以給大家補充和更新些知識,如有其它問題需要了解的可以持續在億速云行業資訊里面關注我的更新文章的。
QPS:
Queries Per Second
意思是“每秒查詢率”,是一臺云服務器每秒能夠相應的查詢次數,是對一個特定的查詢服務器在規定時間內所處理流量多少的衡量標準。TPS:是
TransactionsPerSecond
的縮寫,也就是事務數/秒。它是軟件測試結果的測量單位。客戶機在發送請求時開始計時,收到服務器響應后結束計時,以此來計算使用的時間和完成的事務個數。
Tips:最好不要在主庫上數據庫備份,大型活動前取消這樣的計劃。
sql
:超高的QPS
與TPS
。max_connection
默認100
,一般把連接數設置得大一些)。CPU
使用率:CPU
資源耗盡出現宕機。IO
:磁盤IO
性能突然下降、大量消耗磁盤性能的計劃任務。解決:更快磁盤設備、調整計劃任務、做好磁盤維護。select *
進行查詢重要
)10
個G
1.慢查詢:很難在短時間內過濾出需要的數據
查詢字區分度低 -> 要在大數據量的表中篩選出來其中一部分數據會產生大量的磁盤io
-> 降低磁盤效率
2.對DDL
影響:
建立索引需要很長時間:
MySQL -v<5.5
建立索引會鎖表MySQL -v>=5.5
建立索引會造成主從延遲(mysql
建立索引,先在組上執行,再在庫上執行)修改表結構需要長時間的鎖表:會造成長時間的主從延遲('480秒延遲')
分庫分表把一張大表分成多個小表
難點:
重要
)ACID
屬性1、原子性(
atomicity
):全部成功,全部回滾失敗。銀行存取款。2、一致性(consistent):銀行轉賬的總金額不變。
3、隔離性(isolation):
隔離性等級:
READ UNCOMMITED
) 臟讀,兩個事務之間互相可見;READ COMMITED
)符合隔離性的基本概念,一個事務進行時,其它已提交的事物對于該事務是可見的,即可以獲取其它事務提交的數據。REPEATABLE READ
) InnoDB的默認隔離等級
。事務進行時,其它所有事務對其不可見,即多次執行讀,得到的結果是一樣的!SERIALIZABLE
) 在讀取的每一行數據上都加鎖,會造成大量的鎖超時和鎖征用,嚴格數據一致性且沒有并發是可使用。 查看系統的事務隔離級別:show variables like '%iso%'
;
開啟一個新事務:begin
;
提交一個事務:commit
;
修改事物的隔離級別:set session tx_isolation='read-committed'
;
4、持久性(
DURABILITY
):從數據庫的角度的持久性,磁盤損壞就不行了
redo log
機制保證事務更新的一致性和持久性
運行時間長,操作數據比較多的事務;
風險:鎖定數據太多,回滾時間長,執行時間長。
解決思路:
SELECT
操作,保證事務中只有必要的寫操作。非常重要
)MyISAM
: 不支持事務,表級鎖。InnoDB
: 支持事務,支持行級鎖,事務ACID
。數據庫結構設計和SQL語句。(重點優化)
分三層:客戶端->服務層->存儲引擎
MySQL
是插件式的存儲引擎
,其中存儲引擎分很多種。只要實現符合mysql存儲引擎的接口,可以開發自己的存儲引擎!MySQL5.5
及之后版本默認的存儲引擎:InnoDB
。
show variables like 'innodb_file_per_table
如果innodb_file_per_table 為 ON 將建立獨立的表空間,文件為tablename.ibd;
如果innodb_file_per_table 為 OFF 將數據存儲到系統的共享表空間,文件為ibdataX(X為從1開始的整數);
.frm
:是服務器層面產生的文件,類似服務器層的數據字典,記錄表結構。
MySQL5.6
及以后默認)獨立表空間1.1 系統表空間無法簡單的收縮文件大小,造成空間浪費,并會產生大量的磁盤碎片。
1.2 獨立表空間可以通過optimeze table
收縮系統文件,不需要重啟服務器也不會影響對表的正常訪問。
2.1 如果對多個表進行刷新時,實際上是順序進行的,會產生IO瓶頸。
2.2 獨立表空間可以同時向多個文件刷新數據。
強烈建立對Innodb 使用獨立表空間,優化什么的更方便,可控。
使用mysqldump 導出所有數據庫數據(存儲過程、觸發器、計劃任務一起都要導出 )可以在從服務器上操作。
停止MYsql 服務器,修改參數(my.cnf加入innodb_file_per_table),并刪除Inoodb相關文件(可以重建Data目錄)。
重啟MYSQL,并重建Innodb系統表空間。
或者 Alter table
同樣可以的轉移,但是無法回收系統表空間中占用的空間。
Innodb
是一種事務性存儲引擎。ACID
特性。Redo Log
和Undo Log
Redo Log:實現事務的持久性(已提交的事務)。
Undo Log:未提交的事務,獨立于表空間,需要隨機訪問,可以存儲在高性能io設備上。
Undo
日志記錄某數據被修改前的值,可以用來在事務失敗時進行rollback
;Redo
日志記錄某數據塊被修改后的值,可以用來恢復未寫入data file
的已成功事務更新的數據。
MySQL的事務支持不是綁定在MySQL服務器本身,而是與存儲引擎相關
將table_name加表級鎖命令:lock table table_name write
; 寫鎖會阻塞其它用戶對該表的‘讀寫’操作,直到
寫鎖被釋放:unlock tables
;
(1)阻塞是由于資源不足引起的排隊等待現象。
(2)死鎖是由于兩個對象在擁有一份資源的情況下申請另一份資源,而另一份資源恰好又是這兩對象正持有的,導致兩對象無法完成操作,且所持資源無法釋放。
參考條件:
Innobd
免費在線備份)總結:**Innodb
大法好。
注意:
**盡量別使用混合存儲引擎,比如回滾會出問題在線熱備問題。
確定可以使用的內存上限。
內存的使用上限不能超過物理內存,否則容易造成內存溢出;(對于32位操作系統,MySQL只能試用3G以下的內存。)
確定MySQL的每個連接
單獨
使用的內存。
sort_buffer_size #定義了每個線程排序緩存區的大小,MySQL在有查詢、需要做排序操作時才會為每個緩沖區分配內存(直接分配該參數的全部內存);
join_buffer_size #定義了每個線程所使用的連接緩沖區的大小,如果一個查詢關聯了多張表,MySQL會為每張表分配一個連接緩沖,導致一個查詢產生了多個連接緩沖;
read_buffer_size #定義了當對一張MyISAM進行全表掃描時所分配讀緩沖池大小,MySQL有查詢需要時會為其分配內存,其必須是4k的倍數;
read_rnd_buffer_size #索引緩沖區大小,MySQL有查詢需要時會為其分配內存,只會分配需要的大小。
注意:
以上四個參數是為一個線程分配的,如果有100個連接,那么需要×100。
MySQL數據庫實例:
①MySQL是
單進程多線程
(而oracle是多進程),也就是說MySQL
實例在系統上表現就是一個服務進程,即進程;②MySQL實例是線程和內存組成,實例才是真正用于操作數據庫文件的;
一般情況下一個實例操作一個或多個數據庫;集群情況下多個實例操作一個或多個數據庫。
如何為緩存池分配內存:Innodb_buffer_pool_size
,定義了Innodb所使用緩存池的大小,對其性能十分重要,必須足夠大,但是過大時,使得Innodb 關閉時候需要更多時間把臟頁從緩沖池中刷新到磁盤中;
總內存-(每個線程所需要的內存*連接數)-系統保留內存
key_buffer_size
,定義了MyISAM所使用的緩存池的大小,由于數據是依賴存儲操作系統緩存的,所以要為操作系統預留更大的內存空間;
select sum(index_length) from information_schema.talbes where engine='myisam'
注意:即使開發使用的表全部是Innodb表,也要為MyISAM預留內存,因為MySQL系統使用的表仍然是MyISAM表。
max_connections
控制允許的最大連接數, 一般2000更大。
不要使用外鍵約束保證數據的完整性。
看了以上關于影響數據庫查詢速度、MySQL性能的幾個因素,希望能給大家在實際運用中帶來一定的幫助。本文由于篇幅有限,難免會有不足和需要補充的地方,如有需要更加專業的解答,可在官網聯系我們的24小時售前售后,隨時幫您解答問題的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。