新聞中心
數(shù)據(jù)庫是現(xiàn)代軟件系統(tǒng)中至關重要的一環(huán)。在大多數(shù)現(xiàn)代應用程序中,幾乎每個子系統(tǒng)都與數(shù)據(jù)庫交互,提供數(shù)據(jù)存儲和處理的核心服務。在這種情況下,數(shù)據(jù)庫的穩(wěn)定性和可靠性非常關鍵。如果數(shù)據(jù)庫遇到阻塞,應用程序將會崩潰,從而導致系統(tǒng)停機和數(shù)據(jù)丟失。這對于任何企業(yè)來說都是一場災難,因此解決阻塞問題非常重要。

為了避免阻塞,我們需要理解發(fā)生阻塞的原因以及如何加以預防和解決。
數(shù)據(jù)庫中的阻塞是指在一個事務中發(fā)生了某些阻塞操作,而另一個事務無法運行的情況。例如,如果一個事務在讀取一個表的某些數(shù)據(jù),而另一個事務試圖修改該表,則修改事務將被阻塞,直到讀取事務完成。
在理想情況下,數(shù)據(jù)庫應該是無阻塞的。但在現(xiàn)實中,很難避免阻塞的發(fā)生。可惜的是,一旦阻塞出現(xiàn),它通常會導致嚴重的后果。
以下是一些處理高訪問量數(shù)據(jù)庫阻塞的實用技巧:
1. 使用合適的索引
索引是優(yōu)化數(shù)據(jù)庫查詢的關鍵組成部分。如果您的數(shù)據(jù)庫中沒有合適的索引,查詢可能需要花費很長時間。索引可以在查詢過程中快速定位數(shù)據(jù),這樣查詢就會更快,更有效。
2. 分布式架構
分布式架構是防止高訪問量數(shù)據(jù)庫阻塞的一種解決方案。在分布式架構中,數(shù)據(jù)存儲在多個節(jié)點上,并且每個節(jié)點都可以獨立地處理查詢。這使得每個節(jié)點都可以處理自己的負載,從而減少阻塞發(fā)生的可能性。
3. 定期維護
定期維護數(shù)據(jù)庫是非常重要的。定期維護包括數(shù)據(jù)庫備份、重建索引、清理垃圾數(shù)據(jù)等操作。這些操作可以保持數(shù)據(jù)庫的良好狀態(tài),并減少阻塞發(fā)生的可能性。
4. 避免長時間事務
長時間事務是一種阻塞高發(fā)事件。這種情況下,一個事務會持有某個數(shù)據(jù)庫資源,而另一個事務將無法訪問該資源,反之亦然。為了避免這種情況的發(fā)生,開發(fā)人員應該盡量避免設計長時間事務。
5. 資源限制
為了避免阻塞,也可以使用資源限制工具。例如,內存限制可以防止一個事務占用大量內存,而長時間持有該內存。同樣地,CPU限制可以防止一個事務使用全部CPU資源,使其他事務無法運行。
阻塞是數(shù)據(jù)庫中比較常見的問題。為了避免阻塞,數(shù)據(jù)庫應該使用合適的索引、分布式架構、定期維護、避免長時間事務和資源限制等技術。在阻塞的發(fā)生時,我們需要對其進行分析和解決,以免出現(xiàn)更大的問題。不能夠忽略的是,定期升級數(shù)據(jù)庫及其相關組件,及時將數(shù)據(jù)庫和操作系統(tǒng)的安全補丁打上,以保障數(shù)據(jù)庫的安全性。
成都網站建設公司-創(chuàng)新互聯(lián),建站經驗豐富以策略為先導10多年以來專注數(shù)字化網站建設,提供企業(yè)網站建設,高端網站設計,響應式網站制作,設計師量身打造品牌風格,熱線:028-86922220如何解決數(shù)據(jù)庫數(shù)據(jù)量大的問題
解決數(shù)據(jù)庫數(shù)據(jù)量大的問題,分庫或者分表都是辦法之一。
分庫:編程會復雜一些;但是適合更大缺乎量的伏讓悉數(shù)據(jù)庫數(shù)據(jù)量。
分表:數(shù)據(jù)文件可能還是滑凳偏大。
網站訪問量大 怎樣優(yōu)化mysql數(shù)據(jù)庫
I硬件配置優(yōu)化
CPU選擇:多核的CPU,主頻高的CPU
內存:更大的內存
磁盤選擇:更快的轉速、RAID、陣列卡,
網絡環(huán)境選擇:盡量部署在局域網、SCI、光纜、千兆網、雙網線和數(shù)提供冗余、0.0.0.0多端口綁定監(jiān)聽
II操作系統(tǒng)級優(yōu)化
使用64位的操作系統(tǒng),更好的使用大內存擾棚燃。
設置noatime,nodiratime
$ cat /etc/fstab
LABEL=//ext3 defaults,noatime,nodiratime
/dev/sda/dataxfs defaults,noatime,nodiratime
優(yōu)化內核參數(shù)
net.ipv4.tcp_keepalive_time=7200
net.ipv4.tcp_max_syn_backlog=1024
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.neigh.default.gc_thresh3 = 2023
net.ipv4.neigh.default.gc_thresh2 = 1024
net.ipv4.neigh.default.gc_thresh1 = 256
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.tcp_syncookies = 1
net.core.netdev_max_backlog = 2023
net.core.dev_weight = 64
net.ipv4.tcp_rmem =777216
net.ipv4.tcp_wmem =777216
net.ipv4.tcp_rfc1337 = 1
net.ipv4.tcp_sack = 0
net.ipv4.tcp_fin_timeout = 20
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_max_orphans = 32768
net.core.optmem_max = 20230
net.core.rmem_default =
net.core.rmem_max =
net.core.wmem_default =
net.core.wmem_max =
net.core.somaxconn = 500
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_max_tw_buckets = 18000
net.ipv4.ip_forward = 0
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.ip_local_port_range =
kernel.shmmax =
vm.swappiness=0
加大文件描述符限制
Vim /etc/security/limits.conf
加上
*soft nofile
*hard nofile
文件系統(tǒng)選擇 xfs
/dev/sda/dataxfs defaults,noatime,nodiratime
III Mysql設計優(yōu)化
III.1存儲引擎的選擇
Myisam:數(shù)據(jù)庫并發(fā)不大,讀多寫少,而且都能很好的用緩虛到索引,sql語句比較簡單的應用,TB數(shù)據(jù)倉庫
Innodb:并發(fā)訪問大,寫操作比較多,有外鍵、事務等需求的應用,系統(tǒng)內存較大。
III.2命名規(guī)則
多數(shù)開發(fā)語言命名規(guī)則:比如MyAdress
多數(shù)開源思想命名規(guī)則:my_address
避免隨便命名
III.3字段類型選擇
字段類型的選擇的一般原則:
根據(jù)需求選擇合適的字段類型,在滿足需求的情況下字段類型盡可能小。
只分配滿足需求的最小字符數(shù),不要太慷慨。
原因:更小的字段類型更小的字符數(shù)占用更少的內存,占用更少的磁盤空間,占用更少的磁盤IO,以及占用更少的帶寬。
III.3.1 整型:
見如下圖:
類型
字節(jié)
最小值
更大值
(帶符號的/無符號的)
(帶符號的/無符號的)
TINYINT
-128
127
255
ALLINT
-32768
32767
65535
MEDIUMINT
INT
BIGINT
775808
75807
551615
根據(jù)滿足需求的最小整數(shù)為選擇原則,能用INT的就不要用BIGINT。
用無符號INT存儲IP,而非CHAR(15)。
III.3.2 浮點型:
類型
字節(jié)
精度類型
使用場景
FLOAT(M,D)
單精度
精度要求不高,數(shù)值比較小
DOUBLE(M,D)(REAL)
雙精度
精度要求不高,數(shù)值比較大
DECIMAL(M,D)(NUMERIC)
M+2
自定義精度
精度要求很高的場景
III.3.3 時間類型
類型
取值范圍
存儲空間
零值表示法
DATE
~
3字節(jié)
TIME
-838:59:59~838:59:59
3字節(jié)
00:00:00
DATETIME
:00:00~:59:59
8字節(jié)
:00:00
TIMESTAMP
~2023年的某個時刻
4字節(jié)
YEAR
YEAR(4):1901~2155 YEAR(2):1970~2023
1字節(jié)
0000
III.3.4 字符類型
類型
更大長度
占用存儲空間
CHAR
M字節(jié)
M字節(jié)
VARCHAR
M字節(jié)
M+1字節(jié)
TINYBLOD,TINYTEXT
2^8-1字節(jié)
L+1字節(jié)
BLOB,TEXT
2^16-1字節(jié)
L+2
MEDIUMBLOB,MEDIUMTEXT
2^24-1字節(jié)
L+3
LONGBLOB,LONGTEXT
2^32-1字節(jié)
L+4
ENUM(‘value1′,’value2’,…)
65535個成員
1或2字節(jié)
SET(‘value1′,’value2’,…)
64個成員
1,2,3,4或8字節(jié)
注:L表示可變長度的意思
對于varchar和char的選擇要根據(jù)引擎和具體情況的不同來選擇,主要依據(jù)如下原則:
1. 如果列數(shù)據(jù)項的大小一致或者相差不大,則使用char。
2. 如果列數(shù)據(jù)項的大小差異相當大,則使用varchar。
3. 對于MyISAM表,盡量使用Char,對于那些經常需要修改而容易形成碎片的myisam和isam數(shù)據(jù)表就更是如此,它的缺點就是占用磁盤空間。
4. 對于InnoDB表,因為它的數(shù)據(jù)行內部存儲格式對固定長度的數(shù)據(jù)行和可變長度的數(shù)據(jù)行不加區(qū)分(所有數(shù)據(jù)行共用一個表頭部分,這個標頭部分存放著指向各有關數(shù)據(jù)列的指針),所以使用char類型不見得會比使用varchar類型好。事實上,因為char類型通常要比varchar類型占用更多的空 間,所以從減少空間占用量和減少磁盤i/o的角度,使用varchar類型反而更有利。
5.表中只要存在一個varchar類型的字段,那么所有的char字段都會自動變成varchar類型,因此建議定長和變長的數(shù)據(jù)分開。
III.4編碼選擇
單字節(jié) latin1
多字節(jié) utf8(漢字占3個字節(jié),英文字母占用一個字節(jié))
如果含有中文字符的話更好都統(tǒng)一采用utf8類型,避免亂碼的情況發(fā)生。
III.5主鍵選擇原則
注:這里說的主鍵設計主要是針對INNODB引擎
1. 能唯一的表示行。
2. 顯式的定義一個數(shù)值類型自增字段的主鍵,這個字段可以僅用于做主鍵,不做其他用途。
3. MySQL主鍵應該是單列的,以便提高連接和篩選操作的效率。
4. 主鍵字段類型盡可能小,能用ALLINT就不用INT,能用INT就不用BIGINT。
5. 盡量保證不對主鍵字段進行更新修改,防止主鍵字段發(fā)生變化,引發(fā)數(shù)據(jù)存儲碎片,降低IO性能。
6. MySQL主鍵不應包含動態(tài)變化的數(shù)據(jù),如時間戳、創(chuàng)建時間列、修改時間列等。
7. MySQL主鍵應當有計算機自動生成。
8. 主鍵字段放在數(shù)據(jù)表的之一順序。
推薦采用數(shù)值類型做主鍵并采用auto_increment屬性讓其自動增長。
III.6其他需要注意的地方
NULL OR NOT NULL
盡可能設置每個字段為NOT NULL,除非有特殊的需求,原因如下:
1. 使用含有NULL列做索引的話會占用更多的磁盤空間,因為索引NULL列需要而外的空間來保存。
2. 進行比較的時候,程序會更復雜。
3. 含有NULL的列比較特殊,SQL難優(yōu)化,如果是一個組合索引,那么這個NULL 類型的字段會極大影響整個索引的效率。
索引
索引的缺點:極大地加速了查詢,減少掃描和鎖定的數(shù)據(jù)行數(shù)。
索引的缺點:占用磁盤空間,減慢了數(shù)據(jù)更新速度,增加了磁盤IO。
添加索引有如下原則:
1. 選擇唯一性索引。
2. 為經常需要排序、分組和聯(lián)合操作的字段建立索引。
3. 為常作為查詢條件的字段建立索引。
4. 限制索引的數(shù)據(jù),索引不是越多越好。
5. 盡量使用數(shù)據(jù)量少的索引,對于大字段可以考慮前綴索引。
6. 刪除不再使用或者很少使用的索引。
7. 結合核心SQL優(yōu)先考慮覆蓋索引。
8. 忌用字符串做主鍵。
反范式設計
適當?shù)氖褂萌哂嗟姆捶妒皆O計,以空間換時間有的時候會很高效。
IV Mysql軟件優(yōu)化
開啟mysql復制,實現(xiàn)讀寫分離、負載均衡,將讀的負載分攤到多個從服務器上,提高服務器的處理能力。
使用推薦的GA版本,提升性能
利用分區(qū)新功能進行大數(shù)據(jù)的數(shù)據(jù)拆分
VMysql配置優(yōu)化
注意:全局參數(shù)一經設置,隨服務器啟動預占用資源。
key_buffer_size參數(shù)
mysql索引緩沖,如果是采用myisam的話要重點設置這個參數(shù),根據(jù)(key_reads/key_read_requests)判斷
innodb_buffer_pool_size參數(shù)
INNODB 數(shù)據(jù)、索引、日志緩沖最重要的引擎參數(shù),根據(jù)(hit riatos和FILE I/O)判斷
wait_time_out參數(shù)
線程連接的超時時間,盡量不要設置很大,推薦10s
max_connections參數(shù)
服務器允許的更大連接數(shù),盡量不要設置太大,因為設置太大的話容易導致內存溢出,需要通過如下公式來確定:
SET @k_bytes = 1024;
SET @m_bytes = @k_bytes * 1024;
SET @g_bytes = @m_bytes * 1024;
SELECT
(
@@key_buffer_size + @@query_cache_size + @@tmp_table_size+
@@innodb_buffer_pool_size + @@innodb_additional_mem_pool_size+
@@innodb_log_buffer_size+
@@max_connections *
( @@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size+
@@join_buffer_size + @@binlog_cache_size + @@thread_stack
) )
/ @g_bytes AS MAX_MEMORY_USED_GB;
thread_concurrency參數(shù)
線程并發(fā)利用數(shù)量,(cpu+disk)*2,根據(jù)(os中顯示的請求隊列和tickets)判斷
sort_buffer_size參數(shù)
獲得更快的–ORDER BY,GROUP BY,SELECT DISTINCT,UNION DISTINCT
read_rnd_buffer_size參數(shù)
當根據(jù)鍵進行分類操作時獲得更快的–ORDER BY
join_buffer_size參數(shù)
join連接使用全表掃描連接的緩沖大小,根據(jù)select_full_join判斷
read_buffer_size參數(shù)
全表掃描時為查詢預留的緩沖大小,根據(jù)select_scan判斷
tmp_table_size參數(shù)
臨時內存表的設置,如果超過設置就會轉化成磁盤表,根據(jù)參數(shù)(created_tmp_disk_tables)判斷
innodb_log_file_size參數(shù)(默認5M)
記錄INNODB引擎的redo log文件,設置較大的值意味著較長的恢復時間。
? innodb_flush_method參數(shù)(默認fdatasync)
Linux系統(tǒng)可以使用O_DIRECT處理數(shù)據(jù)文件,避免OS級別的cache,O_DIRECT模式提高數(shù)據(jù)文件和日志文件的IO提交性能
innodb_flush_log_at_trx_commit(默認1)
表示每秒進行一次log寫入cache,并flush log到磁盤。
表示在每次事務提交后執(zhí)行l(wèi)og寫入cache,并flush log到磁盤。
表示在每次事務提交后,執(zhí)行l(wèi)og數(shù)據(jù)寫入到cache,每秒執(zhí)行一次flush log到磁盤。
VI Mysql語句級優(yōu)化
1. 性能查的讀語句,在innodb中統(tǒng)計行數(shù),建議另外弄一張統(tǒng)計表,采用myisam,定期做統(tǒng)計.一般的對統(tǒng)計的數(shù)據(jù)不會要求太精準的情況下適用。
2. 盡量不要在數(shù)據(jù)庫中做運算。
3. 避免負向查詢和%前綴模糊查詢。
4. 不在索引列做運算或者使用函數(shù)。
5. 不要在生產環(huán)境程序中使用select * from 的形式查詢數(shù)據(jù)。只查詢需要使用的列。
6. 查詢盡可能使用limit減少返回的行數(shù),減少數(shù)據(jù)傳輸時間和帶寬浪費。
7. where子句盡可能對查詢列使用函數(shù),因為對查詢列使用函數(shù)用不到索引。
8. 避免隱式類型轉換,例如字符型一定要用’’,數(shù)字型一定不要使用’’。
9. 所有的SQL關鍵詞用大寫,養(yǎng)成良好的習慣,避免SQL語句重復編譯造成系統(tǒng)資源的浪費。
10. 聯(lián)表查詢的時候,記得把小結果集放在前面,遵循小結果集驅動大結果集的原則。
數(shù)據(jù)庫訪問量大 如何阻止阻塞的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于數(shù)據(jù)庫訪問量大 如何阻止阻塞,高訪問量數(shù)據(jù)庫如何避免阻塞,如何解決數(shù)據(jù)庫數(shù)據(jù)量大的問題,網站訪問量大 怎樣優(yōu)化mysql數(shù)據(jù)庫的信息別忘了在本站進行查找喔。
成都創(chuàng)新互聯(lián)科技有限公司,經過多年的不懈努力,公司現(xiàn)已經成為一家專業(yè)從事IT產品開發(fā)和營銷公司。廣泛應用于計算機網絡、設計、SEO優(yōu)化、關鍵詞排名等多種行業(yè)!
分享名稱:高訪問量數(shù)據(jù)庫如何避免阻塞(數(shù)據(jù)庫訪問量大如何阻止阻塞)
網頁地址:http://www.5511xx.com/article/dhoipdc.html


咨詢
建站咨詢
