/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_blocks
和Qcache_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 的值都會跳,每次不同
繼續補充中..