MyISAM幾個容易忽視的配置選項

2021-09-24 10:29:54 字數 1325 閱讀 7331

為什麼80%的碼農都做不了架構師?>>>

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。

ES容易忽視的集群配置

一 前言 目前生產系統由solr轉es了,在這邊就記錄下在使用過程中容易忽視的配置吧,其實我也是才用,如果有什麼錯誤的地方,多指正。二 配置 1 es的段合併是限速設定 預設是20mb s 如果是ssd磁碟建議增大 put cluster settings 如果臨時匯入資料先可以不要合併,再開啟的時...

C 與C語言容易忽視的幾個差異

7次 c和c 之間的關係非常的密切,我們也都知道c 是從c擴充而來的,但是這並不表示c 對c完全相容。c 並不是c的超集,c的有些特性在c 中並不適用。看完 c專家程式設計 之後,從中了解到了幾個。簡單總結一下。1 在c 中,使用者 不能呼叫main函式,但在c語言中卻是允許的。所以可以遞迴呼叫ma...

容易被PHP程式設計師忽視的幾個要點

前幾天就想好好整理上次遇到的問題,但是工作比較忙,就放到週末來寫吧。上次和同事溝通需求的時候,他給了一段他寫好了的 我執行的時候發現了幾個bug,都是由於程式不嚴謹,考慮不周到,在這裡寫下來,和有一定php開發基礎的朋友分享一下。1 foreach陣列一定先判斷型別 發現很多php程式設計師在for...