久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL優化經驗是怎樣的

176次閱讀
沒有評論

共計 10485 個字符,預計需要花費 27 分鐘才能閱讀完成。

MySQL 優化經驗是怎樣的,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

MySQL 優化經驗

同時在線訪問量繼續增大 對于 1G 內存的服務器明顯感覺到吃力嚴重時甚至每天都會死機 或者時不時的服務器卡一下 這個問題曾經困擾了我半個多月 MySQL 使用是很具伸縮性的算法,因此你通常能用很少的內存運行或給 MySQL 更多的被存以得到更好的性能。

安裝好 mysql 后,配制文件應該在 /usr/local/mysql/share/mysql 目錄中,配制文件有幾個,有 my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf, 不同的流量的網站和不同配制的服務器環境,當然需要有不同的配制文件了。

一般的情況下,my-medium.cnf 這個配制文件就能滿足我們的大多需要;一般我們會把配置文件拷貝到 /etc/my.cnf 只需要修改這個配置文件就可以了,使用 mysqladmin variables extended-status –u root –p 可以看到目前的參數,有3個配置參數是最重要的,即 key_buffer_size,query_cache_size,table_cache。

key_buffer_size 只對 MyISAM 表起作用,

key_buffer_size 指定索引緩沖區的大小,它決定索引處理的速度,尤其是索引讀的速度。一般我們設為 16M, 實際上稍微大一點的站點 這個數字是遠遠不夠的,通過檢查狀態值 Key_read_requests 和 Key_reads, 可以知道 key_buffer_size 設置是否合理。比例 key_reads / key_read_requests 應該盡可能的低,至少是 1:100,1:1000 更好(上述狀態值可以使用 SHOW STATUS LIKE‘key_read%’獲得)。或者如果你裝了 phpmyadmin 可以通過服務器運行狀態看到, 筆者推薦用 phpmyadmin 管理 mysql,以下的狀態值都是本人通過 phpmyadmin 獲得的實例分析:

這個服務器已經運行了 20 天

key_buffer_size – 128M 
key_read_requests – 650759289 
key_reads - 79112

比例接近 1:8000 健康狀況非常好

另外一個估計 key_buffer_size 的辦法 把你網站數據庫的每個表的索引所占空間大小加起來看看以此服務器為例: 比較大的幾個表索引加起來大概 125M 這個數字會隨著表變大而變大。

從 4.0.1 開始,MySQL 提供了查詢緩沖機制。使用查詢緩沖,MySQL 將 SELECT 語句和查詢結果存放在緩沖區中,今后對于同樣的 SELECT 語句(區分大小寫),將直接從緩沖區中讀取結果。根據 MySQL 用戶手冊,使用查詢緩沖最多可以達到 238% 的效率。

通過調節以下幾個參數可以知道 query_cache_size 設置得是否合理

Qcache inserts 
Qcache hits 
Qcache lowmem prunes 
Qcache free blocks 
Qcache total blocks

Qcache_lowmem_prunes 的值非常大,則表明經常出現緩沖不夠的情況, 同時 Qcache_hits 的值非常大,則表明查詢緩沖使用非常頻繁,此時需要增加緩沖大小 Qcache_hits 的值不大,則表明你的查詢重復率很低,這種情況下使用查詢緩沖反而會影響效率,那么可以考慮不用查詢緩沖。此外,在 SELECT 語句中加入 SQL_NO_CACHE 可以明確表示不使用查詢緩沖。

Qcache_free_blocks,如果該值非常大,則表明緩沖區中碎片很多 query_cache_type 指定是否使用查詢緩沖

我設置:

query_cache_size = 32M 
query_cache_type= 1

得到如下狀態值:

Qcache queries in cache 12737  表明目前緩存的條數  
Qcache inserts 20649006 
Qcache hits 79060095  看來重復查詢率還挺高的  
Qcache lowmem prunes 617913 有這么多次出現緩存過低的情況  
Qcache not cached 189896   
Qcache free memory 18573912 目前剩余緩存空間  
Qcache free blocks 5328  這個數字似乎有點大 碎片不少  
Qcache total blocks 30953

如果內存允許 32M 應該要往上加點

table_cache 指定表高速緩存的大小。每當 MySQL 訪問一個表時,如果在表緩沖區中還有空間,該表就被打開并放入其中,這樣可以更快地訪問表內容。通過檢查峰值時間的狀態值 Open_tables 和 Opened_tables,可以決定是否需要增加 table_cache 的值。如果你發現 open_tables 等于 table_cache,并且 opened_tables 在不斷增長,那么你就需要增加 table_cache 的值了(上述狀態值可以使用 SHOW STATUS LIKE‘Open%tables’獲得)。注意,不能盲目地把 table_cache 設置成很大的值。如果設置得太高,可能會造成文件描述符不足,從而造成性能不穩定或者連接失敗。

對于有 1G 內存的機器,推薦值是 128-256。

筆者設置 table_cache = 256

得到以下狀態:

Open tables 256 
Opened tables 9046

雖然 open_tables 已經等于 table_cache,但是相對于服務器運行時間來說, 已經運行了 20 天,opened_tables 的值也非常低。因此,增加 table_cache 的值應該用處不大。如果運行了 6 個小時就出現上述值 那就要考慮增大 table_cache。

如果你不需要記錄 2 進制 log 就把這個功能關掉,注意關掉以后就不能恢復出問題前的數據了,需要您手動備份,二進制日志包含所有更新數據的語句,其目的是在恢復數據庫時用它來把數據盡可能恢復到最后的狀態。另外,如果做同步復制 (Replication) 的話,也需要使用二進制日志傳送修改情況。

log_bin 指定日志文件,如果不提供文件名,MySQL 將自己產生缺省文件名。MySQL 會在文件名后面自動添加數字引,每次啟動服務時,都會重新生成一個新的二進制文件。此外,使用 log-bin-index 可以指定索引文件;使用 binlog-do-db 可以指定記錄的數據庫;使用 binlog-ignore-db 可以指定不記錄的數據庫。注意的是:binlog-do-db 和 binlog-ignore-db 一次只指定一個數據庫,指定多個數據庫需要多個語句。而且,MySQL 會將所有的數據庫名稱改成小寫,在指定數據庫時必須全部使用小寫名字,否則不會起作用。

關掉這個功能只需要在他前面加上 #號

#log-bin

開啟慢查詢日志(slow query log) 慢查詢日志對于跟蹤有問題的查詢非常有用。它記錄所有查過 long_query_time 的查詢,如果需要,還可以記錄不使用索引的記錄。下面是一個慢查詢日志的例子:

開啟慢查詢日志,需要設置參數 log_slow_queries、long_query_times、log-queries-not-using-indexes。

log_slow_queries 指定日志文件,如果不提供文件名,MySQL 將自己產生缺省文件名。long_query_times 指定慢查詢的閾值,缺省是 10 秒。log-queries-not-using-indexes 是 4.1.0 以后引入的參數,它指示記錄不使用索引的查詢。筆者設置 long_query_time=10

筆者設置:

sort_buffer_size = 1M 
max_connections=120 
wait_timeout =120 
back_log=100 
read_buffer_size = 1M 
thread_cache=32 
interactive_timeout=120 
thread_concurrency = 4

參數說明:

back_log

要求 MySQL 能有的連接數量。當主要 MySQL 線程在一個很短時間內得到非常多的連接請求,這就起作用,然后主線程花些時間 (盡管很短) 檢查連接并且啟動一個新線程。back_log 值指出在 MySQL 暫時停止回答新請求之前的短時間內多少個請求可以被存在堆棧中。只有如果期望在一個短時間內有很多連接,你需要增加它,換句話說,這值對到來的 TCP/IP 連接的偵聽隊列的大小。你的操作系統在這個隊列大小上有它自己的限制。Unix listen(2)系統調用的手冊頁應該有更多的細節。檢查你的 OS 文檔找出這個變量的最大值。試圖設定 back_log 高于你的操作系統的限制將是無效的。

max_connections

并發連接數目最大,120 超過這個值就會自動恢復,出了問題能自動解決

thread_cache

沒找到具體說明,不過設置為 32 后 20 天才創建了 400 多個線程 而以前一天就創建了上千個線程 所以還是有用的

thread_concurrency

# 設置為你的 cpu 數目 x2, 例如,只有一個 cpu, 那么 thread_concurrency=2 
#有 2 個 cpu, 那么 thread_concurrency=4 
skip-innodb 
#去掉 innodb 支持

代碼:

# Example MySQL config file for medium systems. 
# 
# This is for a system with little memory (32M - 64M) where MySQL plays 
# an important part, or systems up to 128M where MySQL is used together with 
# other programs (such as a web server) 
# 
# You can copy this file to 
# /etc/my.cnf to set global options, 
# mysql-data-dir/my.cnf to set server-specific options (in this 
# installation this directory is /var/lib/mysql) or 
# ~/.my.cnf to set user-specific options. 
# 
# In this file, you can use all long options that a program supports. 
# If you want to know which options a program supports, run the program 
# with the  --help  option. 
# The following options will be passed to all MySQL clients 
[client] 
#password = your_password 
port = 3306 
socket = /tmp/mysql.sock 
#socket = /var/lib/mysql/mysql.sock 
# Here follows entries for some specific programs 
# The MySQL server 
[mysqld] 
port = 3306 
socket = /tmp/mysql.sock 
#socket = /var/lib/mysql/mysql.sock 
skip-locking 
key_buffer = 128M 
max_allowed_packet = 1M 
table_cache = 256 
sort_buffer_size = 1M 
net_buffer_length = 16K 
myisam_sort_buffer_size = 1M 
max_connections=120 
#addnew config 
wait_timeout =120 
back_log=100 
read_buffer_size = 1M 
thread_cache=32 
skip-innodb 
skip-bdb 
skip-name-resolve 
join_buffer_size=512k 
query_cache_size = 32M 
interactive_timeout=120 
long_query_time=10 
log_slow_queries= /usr/local/mysql4/logs/slow_query.log 
query_cache_type= 1 
# Try number of CPU s*2 for thread_concurrency 
thread_concurrency = 4 
#end new config 
# Don t listen on a TCP/IP port at all. This can be a security enhancement, 
# if all processes that need to connect to mysqld run on the same host. 
# All interaction with mysqld must be made via Unix sockets or named pipes. 
# Note that using this option without enabling named pipes on Windows 
# (via the  enable-named-pipe  option) will render mysqld useless! 
# 
#skip-networking 
# Replication Master Server (default) 
# binary logging is required for replication 
#log-bin 
# required unique id between 1 and 2^32 - 1 
# defaults to 1 if master-host is not set 
# but will not function as a master if omitted 
server-id = 1 
# Replication Slave (comment out master section to use this) 
# 
# To configure this host as a replication slave, you can choose between 
# two methods : 
# 
# 1) Use the CHANGE MASTER TO command (fully described in our manual) - 
# the syntax is: 
# 
# CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=, 
# MASTER_USER=, MASTER_PASSWORD= ; 
# 
# where you replace , , by quoted strings and 
# by the master s port number (3306 by default). 
# 
# Example: 
# 
# CHANGE MASTER TO MASTER_HOST= 125.564.12.1 , MASTER_PORT=3306, 
# MASTER_USER= joe , MASTER_PASSWORD= secret  
# 
# OR 
# 
# 2) Set the variables below. However, in case you choose this method, then 
# start replication for the first time (even unsuccessfully, for example 
# if you mistyped the password in master-password and the slave fails to 
# connect), the slave will create a master.info file, and any later 
# change in this file to the variables  values below will be ignored and 
# overridden by the content of the master.info file, unless you shutdown 
# the slave server, delete master.info and restart the slaver server. 
# For that reason, you may want to leave the lines below untouched 
# (commented) and instead use CHANGE MASTER TO (see above) 
# 
# required unique id between 2 and 2^32 - 1 
# (and different from the master) 
# defaults to 2 if master-host is set 
# but will not function as a slave if omitted 
#server-id = 2 
# 
# The replication master for this slave - required 
#master-host = 
# 
# The username the slave will use for authentication when connecting 
# to the master - required 
#master-user = 
# 
# The password the slave will authenticate with when connecting to 
# the master - required 
#master-password = 
# 
# The port the master is listening on. 
# optional - defaults to 3306 
#master-port = 
# 
# binary logging - not required for slaves, but recommended 
#log-bin 
# Point the following paths to different dedicated disks 
#tmpdir = /tmp/ 
#log-update = /path-to-dedicated-directory/hostname 
# Uncomment the following if you are using BDB tables 
#bdb_cache_size = 4M 
#bdb_max_lock = 10000 
# Uncomment the following if you are using InnoDB tables 
#innodb_data_home_dir = /var/lib/mysql/ 
#innodb_data_file_path = ibdata1:10M:autoextend 
#innodb_log_group_home_dir = /var/lib/mysql/ 
#innodb_log_arch_dir = /var/lib/mysql/ 
# You can set .._buffer_pool_size up to 50 - 80 % 
# of RAM but beware of setting memory usage too high 
#innodb_buffer_pool_size = 16M 
#innodb_additional_mem_pool_size = 2M 
# Set .._log_file_size to 25 % of buffer pool size 
#innodb_log_file_size = 5M 
#innodb_log_buffer_size = 8M 
#innodb_flush_log_at_trx_commit = 1 
#innodb_lock_wait_timeout = 50 
[mysqldump] 
quick 
max_allowed_packet = 16M 
[mysql] 
no-auto-rehash 
# Remove the next comment character if you are not familiar with SQL 
#safe-updates 
[isamchk] 
key_buffer = 20M 
sort_buffer_size = 20M 
read_buffer = 2M 
write_buffer = 2M 
[myisamchk] 
key_buffer = 20M 
sort_buffer_size = 20M 
read_buffer = 2M 
write_buffer = 2M 
[mysqlhotcopy] 
interactive-timeout

補充

優化 table_cachetable_cache 指定表高速緩存的大小。每當 MySQL 訪問一個表時,如果在表緩沖區中還有空間,該表就被打開并放入其中,這樣可以更快地訪問表內容。通過檢查峰值時間的狀態值 Open_tables 和 Opened_tables,可以決定是否需要增加 table_cache 的值。如果你發現 open_tables 等于 table_cache,并且 opened_tables 在不斷增長,那么你就需要增加 table_cache 的值了(上述狀態值可以使用 SHOW STATUS LIKE‘Open%tables’獲得)。注意,不能盲目地把 table_cache 設置成很大的值。如果設置得太高,可能會造成文件描述符不足,從而造成性能不穩定或者連接失敗。對于有 1G 內存的機器,推薦值是 128-256。

案例 1:該案例來自一個不是特別繁忙的服務器 table_cache – 512open_tables – 103opened_tables – 1273uptime – 4021421 (measured in seconds)該案例中 table_cache 似乎設置得太高了。在峰值時間,打開表的數目比 table_cache 要少得多。

案例 2:該案例來自一臺開發服務器。table_cache – 64open_tables – 64opened-tables – 431uptime – 1662790 (measured in seconds)雖然 open_tables 已經等于 table_cache,但是相對于服務器運行時間來說,opened_tables 的值也非常低。因此,增加 table_cache 的值應該用處不大。案例 3:該案例來自一個 upderperforming 的服務器 table_cache – 64open_tables – 64opened_tables – 22423uptime – 19538 該案例中 table_cache 設置得太低了。雖然運行時間不到 6 小時,open_tables 達到了最大值,opened_tables 的值也非常高。這樣就需要增加 table_cache 的值。優化 key_buffer_sizekey_buffer_size 指定索引緩沖區的大小,它決定索引處理的速度,尤其是索引讀的速度。通過檢查狀態值 Key_read_requests 和 Key_reads,可以知道 key_buffer_size 設置是否合理。比例 key_reads / key_read_requests 應該盡可能的低,至少是 1:100,1:1000 更好(上述狀態值可以使用 SHOW STATUS LIKE‘key_read%’獲得)。key_buffer_size 只對 MyISAM 表起作用。即使你不使用 MyISAM 表,但是內部的臨時磁盤表是 MyISAM 表,也要使用該值。可以使用檢查狀態值 created_tmp_disk_tables 得知詳情。對于 1G 內存的機器,如果不使用 MyISAM 表,推薦值是 16M(8-64M)。

案例 1:健康狀況 key_buffer_size – 402649088 (384M)key_read_requests – 597579931key_reads – 56188 案例 2:警報狀態 key_buffer_size – 16777216 (16M)key_read_requests – 597579931key_reads – 53832731 案例 1 中比例低于 1:10000,是健康的情況;案例 2 中比例達到 1:11,警報已經拉響。

關于 MySQL 優化經驗是怎樣的問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注丸趣 TV 行業資訊頻道了解更多相關知識。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-19發表,共計10485字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 安福县| 尼玛县| 开江县| 陆良县| 德清县| 沐川县| 苍溪县| 灵宝市| 厦门市| 镇赉县| 康保县| 雷波县| 扬州市| 泾阳县| 黄石市| 绍兴市| 红安县| 虎林市| 铅山县| 运城市| 西昌市| 香港 | 巫山县| 化德县| 隆回县| 合作市| 宁波市| 沂南县| 于田县| 文昌市| 灵武市| 佛教| 汉中市| 二手房| 合阳县| 望江县| 大冶市| 广西| 德江县| 启东市| 顺平县|