mysql 快取設定 mysql快取設定

2021-10-17 11:33:23 字數 3583 閱讀 5345

伺服器端的設定

mysql優化首先要知道mysql快取是如何工作以及如何設定,下面是我從別人部落格上覆制過來了,初學者。

mysql每個表都可以表示為磁碟上的乙個檔案,必須先開啟,後讀取。為了加快從檔案中讀取資料的過程,mysqld 對這些開啟檔案進行了快取,其最大數目由 /etc/mysqld.conf 中的 table_cache 指定。清單 1 給出了顯示與開啟表有關的活動的方式。

清單 1. 顯示開啟表的活動

mysql> show status like 'open%tables';

| variable_name | value |

| open_tables | 5000 |

| opened_tables | 195 |

2 rows in set (0.00 sec)

清單 4 說明目前有 5,000 個表是開啟的,有 195 個表需要開啟,因為現在快取中已經沒有可用檔案描述符了(由於統計資訊在前面已經清除了,因此可能會存在 5,000 個開啟表中只有 195 個開啟記錄的情況)。如果 opened_tables 隨著重新執行 show status 命令快速增加,就說明快取命中率不夠。如果 open_tables 比 table_cache 設定小很多,就說明該值太大了(不過有空間可以增長總不是什麼壞事)。例如,使用 table_cache = 5000 可以調整表的快取。

與表的快取類似,對於執行緒來說也有乙個快取。 mysqld 在接收連線時會根據需要生成執行緒。在乙個連線變化很快的繁忙伺服器上,對執行緒進行快取便於以後使用可以加快最初的連線。

清單 2 顯示如何確定是否快取了足夠的執行緒。

清單 2. 顯示執行緒使用統計資訊

mysql> show status like 'threads%';

| variable_name | value |

| threads_cached | 27 |

| threads_connected | 15 |

| threads_created | 838610 |

| threads_running | 3 |

4 rows in set (0.00 sec)

此處重要的值是 threads_created,每次 mysqld 需要建立乙個新執行緒時,這個值都會增加。如果這個數字在連續執行 show status 命令時快速增加,就應該嘗試增大執行緒快取。例如,可以在 my.cnf 中使用 thread_cache = 40 來實現此目的。

關鍵字緩衝區儲存了 myisam 表的索引塊。理想情況下,對於這些塊的請求應該來自於記憶體,而不是來自於磁碟。清單 3 顯示了如何確定有多少塊是從磁碟中讀取的,以及有多少塊是從記憶體中讀取的。

清單 3. 確定關鍵字效率

mysql> show status like '%key_read%';

| variable_name | value |

| key_read_requests | 163554268 |

| key_reads | 98247 |

2 rows in set (0.00 sec)

key_reads 代表命中磁碟的請求個數, key_read_requests 是總數。命中磁碟的讀請求數除以讀請求總數就是不中比率 —— 在本例中每 1,000 個請求,大約有 0.6 個沒有命中記憶體。如果每 1,000 個請求中命中磁碟的數目超過 1 個,就應該考慮增大關鍵字緩衝區了。例如,key_buffer = 384m 會將緩衝區設定為 384mb。

臨時表可以在更高階的查詢中使用,其中資料在進一步進行處理(例如 group by 字句)之前,都必須先儲存到臨時表中;理想情況下,在記憶體中建立臨時表。但是如果臨時表變得太大,就需要寫入磁碟中。清單 4 給出了與臨時表建立有關的統計資訊。

清單 4. 確定臨時表的使用

mysql> show status like 'created_tmp%';

| variable_name | value |

| created_tmp_disk_tables | 30660 |

| created_tmp_files | 2 |

| created_tmp_tables | 32912 |

3 rows in set (0.00 sec)

每次使用臨時表都會增大 created_tmp_tables;基於磁碟的表也會增大 created_tmp_disk_tables。對於這個比率,並沒有什麼嚴格的規則,因為這依賴於所涉及的查詢。長時間觀察 created_tmp_disk_tables 會顯示所建立的磁碟表的比率,您可以確定設定的效率。 tmp_table_size 和 max_heap_table_size 都可以控制臨時表的最大大小,因此請確保在 my.cnf 中對這兩個值都進行了設定。

下面這些設定針對於每個會話。在設定這些數字時要十分謹慎,因為它們在乘以可能存在的連線數時候,這些選項表示大量的記憶體!您可以通過**修改會話中的這些數字,或者在 my.cnf 中為所有會話修改這些設定。

當 mysql 必須要進行排序時,就會在從磁碟上讀取資料時分配乙個排序緩衝區來存放這些資料行。如果要排序的資料太大,那麼資料就必須儲存到磁碟上的臨時檔案中,並再次進行排序。如果 sort_merge_passes 狀態變數很大,這就指示了磁碟的活動情況。清單 5 給出了一些與排序相關的狀態計數器資訊。

清單 5. 顯示排序統計資訊

mysql> show status like "sort%";

| variable_name | value |

| sort_merge_passes | 1 |

| sort_range | 79192 |

| sort_rows | 2066532 |

| sort_scan | 44006 |

4 rows in set (0.00 sec)

如果 sort_merge_passes 很大,就表示需要注意 sort_buffer_size。例如, sort_buffer_size = 4m 將排序緩衝區設定為 4mb。

mysql 也會分配一些記憶體來讀取表。理想情況下,索引提供了足夠多的資訊,可以唯讀入所需要的行,但是有時候查詢(設計不佳或資料本性使然)需要讀取表中大量資料。要理解這種行為,需要知道執行了多少個 select 語句,以及需要讀取表中的下一行資料的次數(而不是通過索引直接訪問)。實現這種功能的命令如清單 6 所示。

清單 6. 確定表掃瞄比率

mysql> show status like "com_select";

| variable_name | value |

| com_select | 318243 |

1 row in set (0.00 sec)

mysql> show status like "handler_read_rnd_next";

| variable_name | value |

| handler_read_rnd_next | 165959471 |

1 row in set (0.00 sec)

handler_read_rnd_next / com_select 得出了表掃瞄比率 —— 在本例中是 521:1。如果該值超過 4000,就應該檢視 read_buffer_size,例如 read_buffer_size = 4m。如果這個數字超過了 8m,就應該與開發人員討論一下對這些查詢進行調優了

mysql中如果設定查詢快取

可將如下語句 query cache size 268435456 query cache type 1 query cache limit 1048576 存放到 etc my.cnf檔案的 mysqld 下 然後重啟mysql資料庫 service mysqld restart 就會啟動mysq...

Mysql Cache配置使用 mysql快取配置

如果 mysql server 負載比較高,處理非常繁忙的話,可以啟動query cache 以加速響應時間,啟動方法可以在my.cnf linux 或my.ini windows 中加入不以下專案 redhat下面是 etc my.cnf debian和ubuntu是在 etc mysql my....

mysql 快取 mysql 快取機制解讀

首先講解一下,快取的原理 快取存在乙個hash表中,通過查詢sql,查詢資料庫,客戶端協議等作為key,在判斷命中前,命中條件 1 mysql不會解析sql,而是使用sql去查詢快取,2 sql上的任何字元的不同,如空格,注釋,都會導致快取不命中。3 如果查詢有不確定的資料like now curr...