note: mysql 跟效能有關的設定

2012062710:23

/etc/my.cnf 中幾個重要設定

skip-name-resolve

connect_timeout = 15
   
# default 5, 設成 15~20

max_connect_errors = 4294967295
  
# default 0,就設定一個超大的值,32位元的系統 最大就是 4bytes 4294967295、64位元的系統最大是18446744073709547520

    上面三個有詳細說明: Fixing Poor MySQL Default Configuration Values


另外 要記錄比較慢的 Query,加入這兩行:
log-slow-queries = /tmp/mysql-slow.log
long_query_time = 1   # 單位:秒

max_allowed_packet = 5M
   # default 1M  ,視系統資料的特性來改數值大小


另外常常有人寫到 thread_concurrency 這個變數
都說設成 CPU核心數*2
如 thread_concurrency = 8

不過 原文手冊寫 清楚寫了:
This variable is specific to Solaris systems, for which mysqld invokes the thr_setconcurrency() with the variable value.
This function enables applications to give the threads system a hint about the desired number of threads that should be run at the same time.


有關記憶體的設定
注意這個公式
key_buffer_size + (record_buffer + sort_buffer) * max_connections  
在 32 bits linux 上,要小於 2G


mysql> show status like 'Qca%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 46187     |
| Qcache_free_memory      | 179635600 |
| Qcache_hits             | 55031881  |
| Qcache_inserts          | 176565039 |
| Qcache_lowmem_prunes    | 839179    |
| Qcache_not_cached       | 430253    |
| Qcache_queries_in_cache | 76722     |
| Qcache_total_blocks     | 199762    |
+-------------------------+-----------+


hits / inserts = 0.31
命中率只有 0.31 次

query_cache_size = 256M  (256就可以了)
query_cache_type = 1  ( 0=關閉cache、1=快取所有結果)
0 (OFF, 不快取或重新得到結果)
1 (ON, 快取所有的結果,除了 SELECT SQL_NO_CACHE ... 查詢)
2 (DEMAND, 僅快取 SELECT SQL_CACHE ... 查詢)

query_cache_limit  = 1M  每筆資料 最大cache量
   **以上三個在 5.7.20起 已廢棄

query_cache_min_res_unit 這個變數從 4.1 被引進。 查詢的結果 (已被傳送到客戶端的資料) 在結果檢索期間被儲存到查詢快取中。因而,資料不會以一個大塊地處理。查詢快取在需要時分配塊用於處理這個資料,所以當一個塊被填充後,一個新的塊被分 配。甚為記憶體分配操作是昂貴的,查詢快取以最小的尺寸 query_cache_min_res_unit 分配塊。當一個查詢執行完成,最後的結果塊被修整到實際資料的尺寸大小,以便未使用的記憶體被釋放。
  • query_cache_min_res_unit 的預設值為 4 KB,在大多資料情況下已夠用了。
  • 如果你有許多查詢傳回一個較小的結果,預設的塊尺寸可能會引起記憶體碎片 (顯示為一個很大數量的閒置塊(Qcache_free_blocks),這將引起查詢快取不得不因缺乏記憶體(Qcache_lowmem_prunes)而從快取中刪除查詢)。在這種情況下,你應該減少 query_cache_min_res_unit
  • 如果你的主要查詢傳回的是大的結果集(查看 Qcache_total_blocksQcache_queries_in_cache),你可以通過增加 query_cache_min_res_unit 來增加性能。然而,要小心不要將它設得太大。

有關 Query Cache
這篇要讀一讀:Query Cache,看上去很美




Innodb 中的
SELECT COUNT(*) FROM MyTable
是全表掃描後算出筆數
不同於 MyISAM 會記錄資料總筆數

也許可以參考這個指令
得到一個參考值

SHOW TABLE STATUS LIKE 'MyTable' \G
*************************** 1. row ***************************
           Name: MyTable
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 925115
 Avg_row_length: 407
    Data_length: 377405440
Max_data_length: 0
   Index_length: 410599424
      Data_free: 4194304
 Auto_increment: 7749403
    Create_time: 2012-12-19 21:20:22
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: pack_keys=1
        Comment:
1 row in set (0.19 sec)


為什麼說參考
因為每次下這行命令
Rows 的值都會跳,每次不同








繼續補充中..


  •    (悄悄話) 2F
  • <悄悄話留言,不公開>
  •    (悄悄話) 1F
  • <悄悄話留言,不公開>