Mysql(MyISAM)的讀寫互斥鎖問題的解決方法
由於沒辦法在短期內增加讀的伺服器,所以採取對Mysql進行了一些配置,以犧牲資料實時性為代價,來換取所有伺服器的生命安全。呵呵,具體相關調整以及思路如下:
MyISAM在讀操作佔主導的情況下是很高效的。可一旦出現大量的讀寫併發,同InnoDB相比,MyISAM的效率就會直線下降,而且,MyISAM和 InnoDB的資料儲存方式也有顯著不同:通常,在MyISAM裡,新資料會被附加到資料檔案的結尾,可如果時常做一些UPDATE,DELETE操作之後,資料檔案就不再是連續的,形象一點來說,就是資料檔案裡出現了很多洞洞,此時再插入新資料時,按預設設定會先看這些洞洞的大小是否可以容納下新資料,如果可以,則直接把新資料儲存到洞洞裡,反之,則把新資料儲存到資料檔案的結尾。之所以這樣做是為了減少資料檔案的大小,降低檔案碎片的產生。但 InnoDB裡則不是這樣,在InnoDB裡,由於主鍵是cluster的,所以,資料檔案始終是按照主鍵排序的,如果使用自增ID做主鍵,則新資料始終是位於資料檔案的結尾。
瞭解了這些基礎知識,下面說說MyISAM幾個容易忽視的配置選項:
concurrent_insert:
通常來說,在MyISAM裡讀寫操作是序列的,但當對同一個表進行查詢和插入操作時,為了降低鎖競爭的頻率,根據concurrent_insert的設定,MyISAM是可以並行處理查詢和插入的:
當concurrent_insert=0時,不允許併發插入功能。
當concurrent_insert=1時,允許對沒有洞洞的表使用併發插入,新資料位於資料檔案結尾(預設)。
當concurrent_insert=2時,不管表有沒有洞洞,都允許在資料檔案結尾併發插入。
這樣看來,把concurrent_insert設定為2是很划算的,至於由此產生的檔案碎片,可以定期使用OPTIMIZE TABLE語法最佳化。
max_write_lock_count:
預設情況下,寫操作的優先順序要高於讀操作的優先順序,即便是先傳送的讀請求,後傳送的寫請求,此時也會優先處理寫請求,然後再處理讀請求。這就造成一個問題:一旦我發出若干個寫請求,就會堵塞所有的讀請求,直到寫請求全都處理完,才有機會處理讀請求。此時可以考慮使用max_write_lock_count:
max_write_lock_count=1
有了這樣的設定,當系統處理一個寫操作後,就會暫停寫操作,給讀操作執行的機會。
low-priority-updates:
我們還可以更乾脆點,直接降低寫操作的優先順序,給讀操作更高的優先順序。
low-priority-updates=1
綜合來看,concurrent_insert=2是絕對推薦的,至於max_write_lock_count=1和low-priority-updates=1,則視情況而定,如果可以降低寫操作的優先順序,則使用low-priority-updates=1,否則使用max_write_lock_count=1。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3016/viewspace-2803841/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL MyISAM引擎的讀鎖與寫鎖MySql
- 讀寫鎖 ReentrantReadWriteLock 與 互斥鎖 的效率
- MYSQL中 TYPE=MyISAM 錯誤的解決方法MySql
- 什麼是鎖?深入分析解讀MySQL鎖,解決幻讀問題!MySql
- Golang 讀寫鎖RWMutex 互斥鎖Mutex 原始碼詳解GolangMutex原始碼
- mysql myisam的鎖機制MySql
- Go語言中的互斥鎖和讀寫鎖(Mutex和RWMutex)GoMutex
- mysql大小寫問題解決MySql
- Mysql中的鎖機制——MyISAM表鎖MySql
- MySQL優化篇系列文章(二)——MyISAM表鎖與InnoDB鎖問題MySql優化
- MySQL是怎麼解決幻讀問題的?MySql
- Linux中常見的檔案讀寫錯誤問題及解決方法!Linux
- golang RWMutex讀寫互斥鎖原始碼分析GolangMutex原始碼
- JUC之讀寫鎖問題
- MySQL鎖問題分析-全域性讀鎖MySql
- Mysql使用kill命令解決死鎖問題MySql
- mysql的ERROR 1231 (42000)問題原因及解決方法MySqlError
- Mysql中文亂碼問題的最佳解決方法MySql
- 部署專案遇到的mysql問題以及解決方法MySql
- (MariaDB/MySQL)MyISAM儲存引擎讀、寫操作的優先順序MySql儲存引擎
- Python | 多執行緒死鎖問題的巧妙解決方法Python執行緒
- 遇到問題的解決方法
- 手把手教你分析解決MySQL死鎖問題MySql
- Golang 基礎值速學之二十一(讀寫鎖互斥鎖)Golang
- Mysql mysql lost connection to server during query 問題解決方法MySqlServer
- 面試官:你說說互斥鎖、自旋鎖、讀寫鎖、悲觀鎖、樂觀鎖的應用場景面試
- 線上MySQL讀寫分離,出現寫完讀不到問題如何解決MySql
- mysql insert into ... select的鎖問題MySql
- 測試MySQL鎖的問題MySql
- 解決python3 json資料包含中文的讀寫問題PythonJSON
- but no encoding declared;問題的解決方法Encoding
- 解決bash: mysql: command not found的問題MySql
- 使用EasyX製作遊戲需要讀寫檔案時遇到編碼問題的解決方法遊戲
- mysql登入遇到ERROR 1045問題解決方法MySqlError
- mysql使用source 命令亂碼問題解決方法MySql
- 面試官:Zookeeper怎麼解決讀寫、雙寫併發不一致問題,以及共享鎖的實現原理?面試
- Python中的互斥鎖Python
- Shiro效能優化:解決Session頻繁讀寫問題優化Session