程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> mysql tips 優化

mysql tips 優化

編輯:關於MYSQL數據庫
這篇文章值得一看。對TEXT BLOB字段存在的表,會因為刪除有無效數據,需要進行優化碎片壓縮容量。
optimize table 表名; 修改my.cnf,增加記錄執行時間超過long_query_time變量時間的SQL語句。
log-slow-querIEs       = /var/log/mysql/MySQL-slow.log 使用explain顯示SQL執行情況,為有問題的sql增加索引:
explain SELECT `ID`, `post_author`, `post_date`, `post_date_gmt`, `post_status`, `post_name`, `post_modified`, `post_modifIEd_gmt`, `post_parent`, `post_type` FROM `wp_posts` WHERE ( (post_status = 'publish' AND (post_type = 'post' OR post_type = '')) OR (post_status = 'publish' AND post_type = 'page') ) AND post_passWord='' ORDER BY post_modifIEd DESC\G; 使用set設置MySQL全局變量時,它只影響在更改後連接的從該全局變量初始化相應會話變量的客戶端。它不會影響已經連接上的客戶端的會話變量(甚至是執行SET GLOBAL語句的客戶端)。優化設置變量:
(這些變量在MYSQL的手冊都可以找到,我把認為需要調整的都列在這裡做記錄)。 MySQL變量 expire_logs_days 設置Binlog過期刪除時間,默認20天。back_log

MySQL有的主要連接請求的數量。當主MySQL線程在短時間內得到許多連接請求時發揮作用。主線程需要花一些時間(盡管很少)來檢查連接並啟動一個新線程。back_log值說明MySQL臨時停止響應新請求前在短時間內可以堆起多少請求。如果你需要在短時間內允許大量連接,可以增加該數值。

換句話說,該值為“進”TCP/IP連接幀聽隊列的大小。操作系統有該隊列自己的限制值。本手冊中Unix listen()系統調用頁應有更詳細的信息。該變量最大值請查閱OS文檔。企圖將back_log設置為高於你的操作系統限值是徒勞無益的。

join_buffer_size

用於完全聯接的緩沖區的大小(當不使用索引的時候使用聯接操作)。一般情況獲得快速聯接的最好方法是添加索引。當增加索引時不可能通過增加join_buffer_size值來獲得快速完全聯接。將為兩個表之間的每個完全聯接分配聯接緩沖區。對於多個表之間不使用索引的復雜聯接,需要多聯接緩沖區。

key_buffer_size

MyISAM表的索引塊分配了緩沖區,由所有線程共享。key_buffer_size是索引塊緩沖區的大小。鍵值緩沖區即為鍵值緩存的最大允許設定值為4GB。有效最大值可以更小,取決於可用物理RAM和操作系統或硬件平台強加的每個進程的RAM限制。增加該值,達到你可以提供的更好的索引處理(所有讀和多個寫操作)。通常為主要運行MySQL的機器內存的25%。但是,如果你將該值設得過大(例如,大於總內存的50%),系統將轉換為頁並變得極慢。MySQL依賴操作系統來執行數據讀取時的文件系統緩存,因此你必須為文件系統緩存留一些空間。

sort_buffer_size

每個排序線程分配的緩沖區的大小。增加該值可以加快ORDER BY或GROUP BY操作

使用SHOW STATUS語句並檢查Key_read_requests、Key_reads、Key_write_requests和Key_writes狀態變量來檢查鍵值緩沖區的性能。Key_reads/Key_read_requests比例一般應小於0.01。如果你使用更新和刪除,Key_writes/Key_write_requests比例通常接近1,但如果你更新時會同時影響到多行或如果你正使用DELAY_KEY_WRITE表選項,可能小得多。

interactive_timeout
wait_timeout #服務器關閉非交互連接之前等待活動的秒數。在線程啟動時,根據全局wait_timeout值或全局interactive_timeout值初始化會話wait_timeout值,取決於客戶端類型(由MySQL_real_connect()的連接選項CLIENT_INTERACTIVE定義)。

read_rnd_buffer_size

當排序後按排序後的順序讀取行時,則通過該緩沖區讀取行,避免搜索硬盤。將該變量設置為較大的值可以大大改進ORDER BY的性能。但是,這是為每個客戶端分配的緩沖區,因此你不應將全局變量設置為較大的值。相反,只為需要運行大查詢的客戶端更改會話變量。

join_buffer_size

用於完全聯接的緩沖區的大小(當不使用索引的時候使用聯接操作)。一般情況獲得快速聯接的最好方法是添加索引。當增加索引時不可能通過增加join_buffer_size值來獲得快速完全聯接。將為兩個表之間的每個完全聯接分配聯接緩沖區。對於多個表之間不使用索引的復雜聯接,需要多聯接緩沖區。

max_allowed_packet

包或任何生成的/中間字符串的最大大小。
包消息緩沖區初始化為net_buffer_length字節,但需要時可以增長到max_allowed_packet字節。該值默認很小,以捕獲大的(可能是錯誤的)數據包.如果你使用大的BLOB 列或長字符串,你必須增加該值。應同你想要使用的最大的BLOB一樣大。max_allowed_packet的協議限制為1GB。

query_cache_size #當設置query_cache_size變量為非零值時,應記住查詢緩存至少大約需要40KB來分配其數據結構。
query_cache_limit#不要緩存大於該值的結果。默認值是1048576(1MB)。 have_query_cache#有query cache
SHOW STATUS LIKE 'Qcache%';#顯示query cache情況
FLUSH QUERY CACHE#語句來清理查詢緩存碎片以提高內存使用性能。該語句不從緩存中移出任何查詢。
RESET QUERY CACHE語句從查詢緩存中移出所有查詢。FLUSH TABLES語句也執行同樣的工作。

Key_reads 是讀取本地磁盤索引,Key_read_request是讀取cache。

table_cache是打開表的緩存,max_connection是最大連接,table_cache=max_connection*N,N是一個連接最大使用的表緩存。這個可以在啟動時設置my.cnf。

索引放入cache中:

在MySQL5.1後可以自己建立每個表的內存cache,將索引放入cache

set global wp_posts_cache =20*1024;#建立一塊cache,可以在my.cnf設置

cache index wp_posts in wp_posts_cache;#將wp_posts表的索引放入cache

load index into cache wp_posts#預裝wp_posts表的索引進入cache

關閉磁盤atime

atime是讀取數據時回寫時間,可以關閉減少IO。

vi /etc/fstab    

對MySQL數據庫存放的掛載點修改為noatime

/dev/sda6       /var            ext3    noatime        0       2

mount -oremount /var

Qcache_free_blocks:當一個表被更新之後,和它相關的cache blocks將被free。但是這個block依然可能存在隊列中,除非是在隊列的尾部。這些blocks將會被統計到這個值來。可以用FLUSH QUERY CACHE語句來清空free blocks。
Qcache_free_memory:可用內存,如果很小,考慮增加query_cache_size
Qcache_hits:自MySQL進程啟動起,cache的命中數量
Qcache_inserts:自MySQL進程啟動起,被增加進QC的數量
Qcache_lowmem_prunes:由於內存過少而導致QC被刪除的條數。加大query_cache_size,盡可能保持這個值0增長。
Qcache_not_cached:自MySQL進程啟動起,沒有被cache的只讀查詢數量(包括select,show,use,desc等)
Qcache_querIEs_in_cache:當前被cache的SQL數量
Qcache_total_blocks:在QC中的blocks數。一個query可能被多個blocks存儲,而這幾個blocks中的最後一個,未 用滿的內存將會被釋放掉。例如一個QC結果要占6KB內存,如果query_cache_min_res_unit是4KB,則最後將會生成3個 blocks,第一個block用來存儲sql語句文本,這個不會被統計到query+cache_size裡,第二個block為4KB,第三個 block為2KB(先allocate4KB,然後釋放多余的2KB)。每個表,當第一個和它有關的SQL查詢被CACHE的時候,會使用一個 block來存儲表信息。也就是說,block會被用在三處地方:表信息,SQL文本,查詢結果。

innodb表的幾個參數

innodb_buffer_pool_size
Innodb的緩沖池會緩存數據和索引,所以不需要給系統的緩存留空間,如果只用Innodb,可以把這個值設為內存的70%-80%。和 key_buffer相同,如果數據量比較小也不怎麼增加,那麼不要把這個值設太高也可以提高內存的使用率。 innodb_additional_pool_size
這個的效果不是很明顯,至少是當操作系統能合理分配內存時。但你可能仍需要設成20M或更多一點以看Innodb會分配多少內存做其他用途。 innodb_log_file_size
對於寫很多尤其是大數據量時非常重要。要注意,大的文件提供更高的性能,但數據庫恢復時會用更多的時間。我一般用64M-512M,具體取決於服務器的空間。 innodb_log_buffer_size
默認值對於多數中等寫操作和事務短的運用都是可以的。如果經常做更新或者使用了很多blob數據,應該增大這個值。但太大了也是浪費內存,因為1秒鐘總會 flush(這個詞的中文怎麼說呢?)一次,所以不需要設到超過1秒的需求。8M-16M一般應該夠了。小的運用可以設更小一點。 innodb_flush_log_at_trx_commit
默認值1的意思是每一次事務提交或事務外的指令都需要把日志寫入(flush)硬盤,這是很費時的。特別是使用電池供電緩存(Battery backed up cache)時。設成2對於很多運用,特別是從MyISAM表轉過來的是可以的,它的意思是不寫入硬盤而是寫入系統緩存。日志仍然會每秒flush到硬盤,所以你一般不會丟失超過1-2秒的更新。設成0會更快一點,但安全方面比較差,即使MySQL掛了也可能會丟失事務的數據。而值2只會在整個操作系統掛了時才可能丟數據。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved