CentOS服務器下對mysql的優化

原文連接:html

CentOS服務器下對mysql的優化前端

 

1、mysql的優化思路mysql

mysql的優化分爲兩方面:linux

1. 服務器使用前的優化redis

2. 服務使用中的優化sql

2、mysql的基礎優化步驟數據庫

1. 硬件級優化centos

(1). 最好mysql本身使用一臺物理服務器緩存

(2). 內存和CPU方面,根據需求給予mysql服務器足夠大的內存和足夠多的CPU核數安全

(3). 避免使用Swap交換分區–交換時從硬盤讀取的它的速度很慢,有的DBA安裝系統時就不裝swap分區

(4). 若是是mysql主庫,硬盤能夠選用比較好的高速硬盤,系統用SSD固態硬盤,數據盤用sas替代sata硬盤,將操做系統和數據分區分開

(5). mysql產生的日誌與數據庫也放到不一樣的磁盤分區上面

(6). mysql數據庫硬盤格式化時,能夠指定更小的硬盤塊

(7). 關於作RAID方面,主庫儘可能作成RAID10,既提升了數據的讀寫速度也提到了數據的安全性

(8). 服務器雙線雙電,保障服務器運行穩定,不會由於忽然斷電影響業務和損壞磁盤數據

2. mysql數據庫設計優化

(1). 根據需求選擇正確的存儲引擎,好比說讀的特別猛就用MySAM,若是對事務性要求高就用InnoDB

(2). 設置合理的字段類型和字段長度,好比說你這個字段就20多個字段你設置成VARCHAR(255)就是對磁盤空間的浪費

(3). 默認值儘量的使用 NOT NULL,若是空值太多對mysql的查詢會有影響,尤爲是在查詢語句編寫上面

(4). 儘可能少的使用VARCHAR,TEXT,BLOB這三個字段

(5). 添加適當索引(index) [四種: 普通索引、主鍵索引、惟一索引unique、全文索引]

(6). 不要濫用索引,大表索引,小表不索引

(7). 表的設計合理化(符合3NF)

3. mysql配置參數的優化

這裏是mysql5.5版本的配置文件

vi my.cnf

[client]
port            = 3306           #mysql客戶端鏈接時的默認端口
socket          = /tmp/mysql.sock  #與mysql服務器本地通訊所使用的socket文件路徑

default-character-set = utf8  #指定默認字符集爲utf8
[mysql]
no-auto-rehash               #auto-rehash是自動補全的意思,就像咱們在linux命令行裏輸入命令的時候,使用tab鍵的功能是同樣的,這裏是默認的不自動補全
default-character-set = utf8  #指定默認字符集爲utf8
[mysqld]
user    = mysql
port    = 3306

character-set-server = utf8    #設置服務器端的字符編碼
socket  = /tmp/mysql.sock
basedir = /application/mysql
datadir = /mysqldata
skip-locking                  #避免MySQL的外部鎖定,減小出錯概率加強穩定性。
open_files_limit    = 10240    #MySQL打開的文件描述符限制,默認最小1024;當open_files_limit沒有被配置的時候,比較max_connections*5和ulimit -n的值,哪一個大用哪一個,當open_file_limit被配置的時候,比較open_files_limit和max_connections*5的值,哪一個大用哪一個。
back_log = 500                #back_log參數的值指出在MySQL暫時中止響應新請求以前的短期內多少個請求可 以被存在堆棧中。 若是系統在一個短期內有不少鏈接,則須要增大該參數的值,該參數值指定到來的TCP/IP鏈接的偵聽隊列的大小。不一樣的操做系統在這個隊列大小上有它自 己的限制。 試圖設back_log高於你的操做系統的限制將是無效的。默認值爲50。對於Linux系統推薦設置爲小於512的整數。
max_connections = 800        #MySQL的最大鏈接數,若是服務器的併發鏈接請求量比較大,建議調高此值,以增長並行鏈接數量,固然這創建在機器能支撐的狀況下,由於若是鏈接數越多, 介於MySQL會爲每一個鏈接提供鏈接緩衝區,就會開銷越多的內存,因此要適當調整該值,不能盲目提升設值。能夠過’conn%’通配符查看當前狀態的鏈接 數量,以定奪該值的大小。
max_connect_errors = 3000    #對於同一主機,若是有超出該參數值個數的中斷錯誤鏈接,則該主機將被禁止鏈接。如需對該主機進行解禁,執行:FLUSH HOST。
table_cache = 614            #物理內存越大,設置就越大.默認爲2402,調到512-1024最佳
external-locking = FALSE     #使用–skip-external-locking MySQL選項以免外部鎖定。該選項默認開啓
max_allowed_packet =8M       #設置最大包,限制server接受的數據包大小,避免超長SQL的執行有問題 默認值爲16M,當MySQL客戶端或mysqld服務器收到大於max_allowed_packet字節的信息包時,將發出「信息包過大」錯誤,並關閉鏈接。對於某些客戶端,若是通訊信息包過大,在執行查詢期間,可能會遇「丟失與MySQL服務器的鏈接」錯誤。默認值16M。
sort_buffer_size = 6M        #用於表間關聯緩存的大小,查詢排序時所能使用的緩衝區大小。注意:該參數對應的分配內存是每鏈接獨佔,若是有100個鏈接,那麼實際分配的總共排序緩衝區大小爲100 × 6 = 600MB。因此,對於內存在4GB左右的服務器推薦設置爲6-8M。
join_buffer_size = 6M       #聯合查詢操做所能使用的緩衝區大小,和sort_buffer_size同樣,該參數對應的分配內存也是每鏈接獨享。
thread_cache_size = 100       #服務器線程緩存這個值表示能夠從新利用保存在緩存中線程的數量,當斷開鏈接時若是緩存中還有空間,那麼客戶端的線程將被放到緩存中,若是線程從新被請求, 那麼請求將從緩存中讀取,若是緩存中是空的或者是新的請求,那麼這個線程將被從新建立,若是有不少新的線程,增長這個值能夠改善系統性能.經過比較 Connections 和 Threads_created 狀態的變量,能夠看到這個變量的做用
thread_concurrency = 8        #設置thread_concurrency的值的正確與否, 對mysql的性能影響很大, 在多個cpu(或多核)的狀況下,錯誤設置了thread_concurrency的值, 會致使mysql不能充分利用多cpu(或多核), 出現同一時刻只能一個cpu(或核)在工做的狀況。thread_concurrency應設爲CPU核數的2倍. 好比有一個雙核的CPU, 那麼thread_concurrency的應該爲4; 2個雙核的cpu, thread_concurrency的值應爲8,屬重點優化參數
query_cache_size = 2M         #指定MySQL查詢緩衝區的大小,在數據庫寫入量或是更新量也比較大的系統,該參數不適合分配過大。並且在高併發,寫入量大的系統,建系把該功能禁掉。
query_cache_limit = 1M         #默認是4KB,設置值大對大數據查詢有好處,但若是你的查詢都是小數據查詢,就容易形成內存碎片和浪費
query_cache_min_res_unit = 2k   #MySQL參數中query_cache_min_res_unit查詢緩存中的塊是以這個大小進行分配的,使用下面的公式計算查詢緩存的平均大小,根據計算結果設置這個變量,MySQL就會更有效地使用查詢緩存,緩存更多的查詢,減小內存的浪費。
default_table_type = InnoDB     #默認表的引擎爲InnoDB
thread_stack = 192K             #限定用於每一個數據庫線程的棧大小。默認設置足以知足大多數應用transaction_isolation = READ-COMMITTED #設定默認的事務隔離級別.可用的級別以下:

READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE,1.READ UNCOMMITTED-讀未提交2.READ COMMITTE-讀已提交3.REPEATABLE READ -可重複讀4.SERIALIZABLE -串行
tmp_table_size = 246M             #tmp_table_size 的默認大小是 32M。若是一張臨時表超出該大小,MySQL產生一個 The table tbl_name is full 形式的錯誤,若是你作不少高級 GROUP BY 查詢,增長 tmp_table_size 值。
max_heap_table_size = 246M          #內存表,內存表不支持事務,內存表使用哈希散列索引把數據保存在內存中,所以具備極快的速度,適合緩存中小型數據庫,可是使用上受到一些限制
long_query_time = 1                 #記錄時間超過1秒的查詢語句
log_long_format                     #
log-error = /logs/error.log         #開啓mysql錯誤日誌,該選項指定mysqld保存錯誤日誌文件的位置
log-slow-queries = /logs/slow.log   #慢查詢日誌文件路徑
pid-file = /pids/mysql.pid
log-bin = /binlog/mysql-bin         #binlog日誌位置以及binlog的名稱
relay-log = /relaylog/relay-bin     #relaylog日誌位置以名稱
binlog_cache_size = 1M              #binlog_cache_size 就是知足兩點的:一個事務,在沒有提交(uncommitted)的時候,產生的日誌,記錄到Cache中;等到事務提交(committed)須要提交的時候,則把日誌持久化到磁盤,默認是32K。
max_binlog_cache_size = 32M         #binlog緩存最大使用的內存
max_binlog_size = 2M                #一個binlog日誌的大小
expire_logs_days = 7                #保留7天的binlog
key_buffer_size = 124M              #索引緩存大小: 它決定了數據庫索引處理的速度,尤爲是索引讀的速度
read_buffer_size = 16M              #MySql讀入緩衝區大小。對錶進行順序掃描的請求將分配一個讀入緩衝區,MySql會爲它分配一段內存緩衝區。read_buffer_size變量控制這一緩衝區的大小。若是對錶的順序掃描請求很是頻繁,而且你認爲頻繁掃描進行得太慢,能夠經過增長該變量值以及內存緩衝區大小提升其性能
read_rnd_buffer_size = 2M           #MySQL的隨機讀緩衝區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,MySQL會首先掃描一遍該緩衝,以免磁盤搜索,提升查詢速度,若是須要排序大量數據,可適當調高該值。但MySQL會爲每一個客戶鏈接發放該緩衝空間,因此應儘可能適當設置該值,以免內存開銷過大
bulk_insert_buffer_size = 1M        #批量插入數據緩存大小,能夠有效提升插入效率,默認爲8M
myisam_sort_buffer_size = 1M        #MyISAM表發生變化時從新排序所需的緩衝
myisam_max_sort_file_size = 10G     #MySQL重建索引時所容許的最大臨時文件的大小 (當 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE). 若是文件大小比此值更大,索引會經過鍵值緩衝建立(更慢)
myisam_repair_threads = 1           #若是一個表擁有超過一個索引, MyISAM 能夠經過並行排序使用超過一個線程去修復他們.這對於擁有多個CPU以及大量內存狀況的用戶,是一個很好的選擇.
myisam_recover                      #自動檢查和修復沒有適當關閉的 MyISAM 表
lower_case_table_names = 1          #讓mysql不區分大小寫
skip-name-resolve                   #禁用DNS解析,鏈接速度會快不少。不過,這樣的話就不能在MySQL的受權表中使用主機名了而只能用ip格式。
#slave-skip-errors = 1032,1062       #這是選填項讓slave庫跳過哪些錯誤繼續同步
#replicate-ignore-db=mysql           #選填,同步時候哪一個數據庫不一樣步設置
server-id = 1

innodb_additional_mem_pool_size = 4M #InnoDB 存儲的數據目錄信息和其它內部數據結構的內存池大小。應用程序裏的表越多,你須要在這裏分配越多的內存,默認是2M
innodb_buffer_pool_size = 2048M         #這對Innodb表來講很是重要。Innodb相比MyISAM表對緩衝更爲敏感。MyISAM能夠在默 認的 key_buffer_size 設置下運行的能夠,然而Innodb在默認的 設置下卻跟蝸牛似的。因爲Innodb把數據和索引都緩存起來,無需留給操做系統太多的內存,所以若是隻須要用Innodb的話則能夠設置它高達 70-80% 的可用內存。一些應用於 key_buffer 的規則有 — 若是你的數據量不大,而且不會暴增,那麼無需把 innodb_buffer_pool_size 設置的太大了
innodb_file_io_threads = 4            #文件IO的線程數,通常爲 4
innodb_thread_concurrency = 8         #你的服務器CPU有幾個就設置爲幾,建議用默認通常爲8
innodb_flush_log_at_trx_commit = 2    #默認爲1,若是將此參數設置爲1,將在每次提交事務後將日誌寫入磁盤。爲提供性能,能夠設置爲0或2,但要承擔在發生故障時丟失數據的風險。設置爲0表示事務日誌寫入日誌文件,而日誌文件每秒刷新到磁盤一次。設置爲2表示事務日誌將在提交時寫入日誌,但日誌文件每次刷新到磁盤一次。
innodb_log_buffer_size = 2M           #此參數肯定些日誌文件所用的內存大小,以M爲單位。緩衝區更大能提升性能,但意外的故障將會丟失數據.MySQL開發人員建議設置爲1-8M之間
innodb_log_file_size = 4M             #此參數肯定數據日誌文件的大小,以M爲單位,更大的設置能夠提升性能,但也會增長恢復故障數據庫所需的時間
innodb_log_files_in_group = 3         #爲提升性能,MySQL能夠以循環方式將日誌文件寫到多個文件。推薦設置爲3M
innodb_max_dirty_pages_pct = 90      #Buffer_Pool中Dirty_Page所佔的數量,直接影響InnoDB的關閉時間。參數 innodb_max_dirty_pages_pct能夠直接控制了Dirty_Page在Buffer_Pool中所佔的比率,並且幸運的是 innodb_max_dirty_pages_pct是能夠動態改變的。因此,在關閉InnoDB以前先調小,強制數據塊Flush一段時間,則可以大大縮短MySQL關閉的時間。
innodb_lock_wait_timeout = 120        #InnoDB 有其內置的死鎖檢測機制,能致使未完成的事務回滾。可是,若是結合InnoDB使用MyISAM的lock tables 語句或第三方事務引擎,則InnoDB沒法識別死鎖。爲消除這種可能性,能夠將innodb_lock_wait_timeout設置爲一個整數值,指示 MySQL在容許其餘事務修改那些最終受事務回滾的數據以前要等待多長時間(秒數)
innodb_file_per_table = 0             #獨享表空間(關閉)
[mysqldump]
quick
max_allowed_packet = 16M

4. 架構優化

(1). 前端用memcached,redis等緩存分擔數據庫壓力

(2). 數據庫讀寫分離,負載均衡

(3). 數據庫分庫分表

(4). 存儲可採起分佈式

5. 後期優化

主要是多觀察,後期就是維護工做了,觀察服務器負載是須要添加硬件了,仍是有語句有問題啊,仍是參數要修改了。

6. 查詢優化(摘抄別人的)

63. 使用慢查詢日誌去發現慢查詢。
64. 使用執行計劃去判斷查詢是否正常運行。
65. 老是去測試你的查詢看看是否他們運行在最佳狀態下 –長此以往性能總會變化。
66. 避免在整個表上使用count(*),它可能鎖住整張表。
67. 使查詢保持一致以便後續類似的查詢可使用查詢緩存。
68. 在適當的情形下使用GROUP BY而不是DISTINCT。
69. 在WHERE, GROUP BY和ORDER BY子句中使用有索引的列。
70. 保持索引簡單,不在多個索引中包含同一個列。
71. 有時候MySQL會使用錯誤的索引,對於這種狀況使用USE INDEX。
72. 檢查使用SQL_MODE=STRICT的問題。
73. 對於記錄數小於5的索引字段,在UNION的時候使用LIMIT不是是用OR.
74. 爲了 避免在更新前SELECT,使用INSERT ON DUPLICATE KEY或者INSERT IGNORE ,不要用UPDATE去實現。
75. 不要使用 MAX,使用索引字段和ORDER BY子句。
76. 避免使用ORDER BY RAND().

77。LIMIT M,N實際上能夠減緩查詢在某些狀況下,有節制地使用。78。在WHERE子句中使用UNION代替子查詢。79。對於UPDATES(更新),使用 SHARE MODE(共享模式),以防止獨佔鎖。80。在從新啓動的MySQL,記得來溫暖你的數據庫,以確保您的數據在內存和查詢速度快。81。使用DROP TABLE,CREATE TABLE DELETE FROM從表中刪除全部數據。82。最小化的數據在查詢你須要的數據,使用*消耗大量的時間。83。考慮持久鏈接,而不是多個鏈接,以減小開銷。84。基準查詢,包括使用服務器上的負載,有時一個簡單的查詢能夠影響其餘查詢。85。當負載增長您的服務器上,使用SHOW PROCESSLIST查看慢的和有問題的查詢。86。在開發環境中產生的鏡像數據中 測試的全部可疑的查詢。

相關文章
相關標籤/搜索