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

MySQL調優

編輯:MySQL綜合教程

 

調優思路:

1.數據庫設計與規劃--以後再修該很麻煩,估計數據量,使用什麼存儲引擎

2.數據的應用--怎樣取數據,sql語句的優化

3.mysql服務優化--內存的使用,磁盤的使用

4.操作系統的優化--內核、tcp連接數量

5.升級硬件設備

 

 

磁盤io規劃

raid技術:raid0[xfs]

swap分區:最好使用raid0

磁盤分區:一個庫放到一個分區上或一個磁盤上

物理分區

create table t1(id int,name char(20)) data directory='/data/' index directory ='/data';

mkdir /data

chown mysql.mysql /data

 

mysql> show variables like '%part%';

 

 

4.操作系統的優化

網卡bonding技術,

tcp連接數量限制

優化系統打開文件的最大限制

關閉操作系統不必要的服務

 

5.mysql服務優化

show status  看系統的資源

show variables  看變量,在my.cnf配置文件裡定義的

show warnings   查看最近一個sql語句產生的錯誤警告,看其他的需要看.err日志

show processlist顯示系統中正在運行的所有進程。

show errors

 

啟用mysql慢查詢:---分析sql語句,找到影響效率的SQL

 

log-slow-queries=/var/lib/mysql/slow.log 這個路徑對mysql用戶具有可寫權限

long_query_time=2   查詢超過2秒鐘的語句記錄下來

上面的2 是查詢的時間,即當一條SQL 執行時間超過5秒的時候才記錄,/var/lib/mysql/slow.log 是日志記錄的位置。

然後重新啟動MySQL服務

 

對查詢進行緩存

query_cache_size 使用多大內存來緩存查詢語句[+8M]

mysql> show variables like'%query%'

query_cache_size=8M

[root@st mysql]# vim /etc/my.cnf

 

 

mysql> show status like '%Qcache%';

Qcache_free_blocks:說明緩存太大了。緩存中相鄰內存的個數。數目大說明可能有碎片。FLUSH QUERY CACHE會對緩存中的碎片進行整理,從而得到一個空閒塊。[+8M]

Qcache_free_memory緩存中的空閒內存

Qcache_hits每次查詢在緩存中命中時就增大

Qcache_inserts每插入一個查詢時就增大。命中次數除以插入次數就是命中率。

Qcache_lowmen_prunes緩存出現內存不足並且必須要進行清理以便為更多查詢提供空間的次數。這個數字最好長時間看;如果這個數字在不斷增長就表示可能碎片非常嚴重,或者內存很少

Qcache_hits/Qcache_inserts 命中率

 

關鍵字緩沖區

mysql> show status like '%key%';

mysql> show variables like'key_buffer_size';

 

key_buffer_size  指定索引緩沖區的大小,它決定索引處理的速度,尤其是索引讀的速度。[+8M]

key_read_requests  請求總數

key_reads   代表命中磁盤的請求個數

(key_read_requests-key_read)/key_read_requests:命中率

key_buffer_size只對MyISAM表起作用。即使你不使用MyISAM表,但是內部的臨時磁盤表是MyISAM表,也要使用該值。可以使用檢查狀態值created_tmp_disk_tables得知詳情。

對於1G內存的機器,如果不使用MyISAM表,推薦值是16M(8-64M)。

 

臨時表空間大小:order by和group by時把數據放到臨時表裡。

tmp_table_size   占的是內存的大小,如果太小在排序時會出錯

created_tmp_tables  創建臨時表的數量

max_tmp_tables=32

tmpdir=/tmp  硬盤上臨時表所在的位置

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

innodb表:

創建表空間文件

[mysqld]

innodb_data_file_path=ibdata1:10M:autoextend

這個設置配置一個可擴展大小的尺寸為10MB的單獨文件,名為ibdata1。沒有給出文件的位置,所以默認的是在MySQL的數據目錄內。

如果你對最後的數據文件指定autoextend選項。如果數據文件耗盡了表空間中的自由空間,InnoDB就擴展數據文件。擴展的幅度是每次8MB。

要為一個自動擴展數據文件指定最大尺寸,請使用max屬性。下列配置允許ibdata1漲到極限的500MB:

[mysqld]

innodb_data_file_path=ibdata1:10M:autoextend:max:500M

InnoDB默認地在MySQL數據目錄創建表空間文件。要明確指定一個位置,請使用innodb_data_home_dir選項。比如,要使用兩個名為ibdata1和ibdata2的文件,但是要把他們創建到/ibdata,像如下一樣配置InnoDB:

[mysqld]

innodb_data_home_dir = /ibdata

innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend

 

mysql> show variables like 'innodb_buffer_pool_size';

innodb_buffer_pool_size

對於InnoDB表來說,innodb_buffer_pool_size的作用就相當於key_buffer_size對於MyISAM表的作用一樣。InnoDB使用該參數指定大小的內存來緩沖數據和索引。對於單獨的MySQL數據庫服務器,最大可以把該值設置成物理內存的80%。

根據MySQL手冊,對於2G內存的機器,推薦值是1G(50%)。

 

mysql> show variables like 'innodb_%per%';[建議打開]

innodb_file_per_table =1 為每一個表單獨創建一個表空間文件。

其他參數

skip-locking

取消文件系統的外部鎖,減少出錯幾率增強穩定性

 

skip-name-resolve

關閉mysql的dns反查功能。這樣速度就快了!

選項就能禁用DNS解析,連接速度會快很多。不過,這樣的話就不能在MySQL的授權表中使用主機名了而只能用ip格式。

 

wait_timeout=10 終止空閒時間超過10秒的鏈接,避免長連接[默認8個小時]

 

max_connect_errors=10 //10次連接失敗就鎖定,使用flush hosts 解鎖,

或mysqladmin flush-hosts解鎖

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL語句調優:

explain命令:查詢select。

.type

這列很重要,顯示了連接使用了哪種類別,有無使用索引

從最好到最差的連接類型為const、eq_reg、ref、range、indexhe和ALL

 

 

本文出自 “技術” 博客

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