mysql負變數 MySQL 設定變數的副作用

2021-10-25 14:18:42 字數 1966 閱讀 7856

有時可以通過名稱推斷乙個變數的作用。例如,max_heap_table_size的作用就行聽起來那樣:它指定隱式記憶體臨時表最大允許的大小。然而,命名的約定並不完全一樣,所以不能總是通過名稱來猜測乙個變數有什麼效果。

讓我們來看一些常用的變數和動態修改它們的效果:

key_buffer_size

設定這個變數可以一次性為鍵緩衝區(也叫鍵快取)分配所有指定的空間。然而,作業系統不會真的立刻分配記憶體,而是到使用時才真正分配。例如設定鍵緩衝的大小為1gb,並不意味著伺服器立刻分配1gb的記憶體。

mysql允許建立多個鍵快取。如果把非預設鍵快取的這個變數設定為0,mysql將丟棄存在該鍵快取中的索引,轉而使用預設鍵快取,並且當不再有任何引用時會刪除該鍵快取。為乙個不存在的鍵快取設定這個變數,將會建立新的鍵快取。對乙個已經存在的鍵快取設定非零值,會導致重新整理該鍵快取的內容。這會阻塞所有嘗試訪問該鍵快取的操作,知道重新整理操作完成。

table_cache_size

thread_cache_size

query_cache_size

mysql在啟動的時候,一次性分配並且初始化這塊記憶體。如果修改這個變數(即使設定為與當前一樣的值),mysql會立刻刪除所有快取的查詢,重新分配這片快取到指定大小,並且重新初始化記憶體。這可能花費較長的時間,在完成初始化之前伺服器都無法提供服務,因為mysql是逐個清理快取的查詢,不是一次性全部刪掉。

read_buffer_size

mysql只會在有查詢需要時才會為該快取分配記憶體,並且會一次性分配該引數指定大小的全部記憶體。

read_rnd_buffer_size

mysql只會在有查詢需要使用時才會為該快取分配記憶體,並且只會分配需要的記憶體大小而不是全部指定的大小。

sort_buffer_size

mysql只會在有查詢需要做排序操作才會為該快取分配記憶體。然後,一旦需要排序,mysql就會立刻分配該引數指定的大小的全部記憶體,而不管該排序是否需要這麼大的記憶體。

這裡不是乙個完整的引數列表,這裡的目的只是簡單的告訴大家,當修改一些常見的變數時,會有哪些期望的行為發生。

對於連線級別的設定,不要輕易地在全域性級別增加它們的值,除非確認這樣做是對的。有一些快取會一次性分配指定大小的全部記憶體,而不管實際上是否需要這麼大,所以乙個很大的全域性設定可能導致浪費大量的記憶體。更好的方法是,當查詢需要時在連線級別單獨調大這些值。

最常見的例子是sort_buffer_size,該引數控制排序操作的快取大小,應該在配置檔案裡把它配置的小一些,然後在某些查詢需要排序時,再在連線中把它調大。在分配記憶體後,mysql會執行一些初始化的工作。

另外,即使是非常小的排序操作,排序快取也會分配全部的大小的記憶體,所以如果把引數設定得超過平均排序需求太多,將會浪費很多記憶體,增加額外的記憶體分配開銷。許多讀者認為記憶體分配是乙個很簡單的操作,聽到記憶體分配的代價可能會很吃驚。不需要深入很多技術細節就可以將清楚為什麼記憶體分配也是昂貴的操作,記憶體分配包括了位址空間的分配,這相對來說是比較昂貴的。特別是在linux上,記憶體分配根據大小使用多種開銷不同的策略。

總的來說,設定很大的排序快取代價可能非常高,所以除非確定必須要這麼大,否則不要增加排序快取的大小。

如果查詢必須使用乙個更大的排序快取才能比較好地執行,可以在查詢執行前增加sort_buffer_size的值,執行完成後恢復default。

eg:set @@session.sort_buffer_size := ;

#execute the query

set @@session.sort_buffer_size := default;

可以將類似的**封在函式中以方便使用。其它可以設定的單個連線級別的變數有read_buffer_size,read_rnd_buffer_size,tmp_table_size,以及myisam_sort_buffer_size。

特別說明:本文章是來自的一章節。

個人感悟:理解可動態更改的變數產生的影響是蠻重要的,一不小心,可能導致負載飛一般的暴漲,cpu刷刷的飆公升,甚至宕機。

好的東西是拿出來分享的,那樣它就會更美!!!

mysql負變數 MySQL的變數

系統變數 系統定義好的變數,大部分時候使用者根本不需要使用系統變數。系統變數是用來控 務器表現的。如 autocommit,auto increment increment等。檢視系統變數 檢視所有變數 show variables 檢視範圍變數 show variables like 變數名 修改...

mysql非負索引 mysql 索引

聚集索引以及非聚集索引用的是b 樹索引。聚簇索引 單單從定義來看是不是顯得有點抽象,打個比方,乙個表就像是我們以前用的新華字典,聚集索引就像是拼音目錄,而每個字存放的頁碼就是我們的資料實體地址。非聚集索引 其實按照定義,除了聚集索引以外的索引都是非聚集索引,只是人們想細分一下非聚集索引,分成普通索引...

mysql設定環境變數

設定或修改系統日誌有效期 set global expire logs days 8 show variables like expire logs days 設定或修改系統最大連線數 set global max connections 2648 show variables like max c...