在平常的的開發過程當中接觸到了SQLServer和MySQL數據庫的操做性問題,多是之前接觸的都是SQL Server,纔開始接觸MySQL,總感受使用MySQL沒有使用SQLserver那麼順手,一些關鍵的系統函數,好比說開窗、行轉列、列轉行、自增字段等一系列的問題,雖然最後都找到了替代的方案,可是解決性能問題仍是頗費了一些功夫的。對比了一下SQL Server、MySQL在Windows環境下、MySQL在linux環境下的性能,一樣的一個存儲過程,在存儲過程當中創建了八個臨時表,並循環向每一個臨時表裏插入了十萬條數據,字段大概有十二個左右,最後查詢出數據,在SQL Server下用了6秒時間,在Linux下的MySQL中用了3秒多的時間,而在Windows環境下的MySQL改成了一千條數據耗費了六十多秒的時間。總的來講性能上的差異仍是很大的,下面就來談談Linux下的MySQL的配置文件。mysql
設置慢查詢時間的長度,以及慢查詢日誌存放的位置:linux
long_query_time=1
slow_query_log_file = /var/log/mysql/mysql-slow.logsql
避免Mysql的外部鎖定,減小出錯概率,加強穩定性:
skip-external-locking數據庫
禁止MySql對外部鏈接進行DNS解析,使用這一選項能夠消除MySQL進行NDS解析的時間。但##須要注意的是:若是開啓該選項,則全部遠程主機鏈接受權都要使用IP地址方式了,不然MYSQL將沒法正常處理鏈接請求。
skip-name-resolve緩存
back_log參數的值指出在MySQL暫時中止響應新請求以前,短期內的多少個請求能夠被存,在對堆棧中,若是系統短期內有不少鏈接,則需>要增大該參數的值,該參數值指定到來的TCP/IP鏈接的監聽隊列的大小。不一樣的操做系統在這個隊列的大小有本身的限制,將back_log設定得高於操做系統的限制將是無效的,其默認值爲50,對於LINUX系統而言,推薦設置爲小於512的整數:服務器
back_log=1200 binlog_cache_size=64M網絡
索引緩衝區大小,增長它可獲得更好的索引處理性能,對於內存在4GB左右的服務器,該參數可設置爲256M或384M。若是該參數值設置的過大>反而會使服務器的總體效率下降:函數
key_buffer_size=512M性能
設定在網絡傳輸中一次消息傳輸量的最大值,系統默認值爲1MB,最大值是1GB,必須設定爲1024的倍數,單位爲字節:操作系統
max_allowed_packet=64M
設置MySQL每一個線程的堆棧大小,默認值足夠大,可知足普通操做。可設置範圍爲128KB至4GB,默認192K:
thread_stack=64M sort_buffer_size=64M
max_connect_errors = 6000 open_files_limit = 65535
table_open_cache=256 max_heap_table_size=16M
設置Thread Cache池中能夠緩存的鏈接池線程最大數量,可設置爲0-16384,默認爲0。1GB內存咱們配置爲8,2GB內存咱們配置爲16,4GB或4GB以上內在咱們配置爲64:
thread_cache_size=128
指定Mysql查詢緩衝區的大小,能夠經過在Mysql控制檯觀察,若是Qcache_lowmem_prunes的值很是大,則代表常常出現緩衝不夠的狀況,若是 Qcache_hits的值很是大,則代表查詢緩衝使用的很是頻繁 :
query_cache_size=64M
query_cache_limit=64M
設置內在臨時表最大值,若是超過該值,則會將臨時表寫入磁盤,其範圍爲1KB至4GB:
tmp_table_size=64M
指定MYSQL容許的最大鏈接進程數,若是在訪問程序時常常出現TOO MANY CONNECTIONS的錯誤提示,則須要增大該參數值:
max_connections=1500
max_user_connections=1500
指定一個請求的最大鏈接時間,對於4GB左右內在的服務器來講,能夠將其設置爲5-10:
wait_timeout=100
該參數取值爲服務器邏輯CPU數量*2,好比,服務器有兩個物理CPU,每一個物理CPU支持HT超線程,因此實際取值4*2=8,這也是目前雙四核主流 服務器的配置:
join_buffer_size = 64M
開啓該選項能夠完全關閉MYSQL的TCP/IP鏈接方式,若是WEB服務器是以遠程鏈接的方式訪問MYSQL的數據庫服務器,則不要開啓該選項,不然>將沒法正常鏈接。 skip-networking 抱怨Innodb比MyISAM慢 100倍?那麼你大概是忘了調整這個值。默認值1的意思是每一次事務提交或事務外的指令都須要把日誌寫入(flush) 硬盤,這是很費時的。特別是使用電池供電緩存(Battery backed up cache)時。設成2對於不少運用,特別是從MyISAM錶轉過來的是能夠的>,它的意思是不寫入硬盤而是寫入系統緩存。日誌仍然會每秒flush到硬 盤,因此你通常不會丟失超過1-2秒的更新。設成0會更快一點,但安>全方面比較差,即便MySQL掛了也可能會丟失事務的數據。而值2只會在整個操做系#統 掛了時纔可能丟數據:
innodb_flush_log_at_trx_commit=2
這是 InnoDB 存儲引擎的事務日誌所使用的緩衝區。相似於 Binlog Buffer,InnoDB 在寫事務日誌的時候,爲了提升性能,也是先將信息寫>入 Innofb Log Buffer 中,當知足 innodb_flush_log_trx_commit 參數所設置的相應條件(或者日誌緩衝區寫滿)以後,纔會將日誌寫到文>件(或者同步到磁盤)中。能夠經過 innodb_log_buffer_size 參數設置其可使用的最大內存空間:
innodb_log_buffer_size=64M
innodb_buffer_pool_size=64M
innodb_log_file_size=1G
innodb_file_per_table=1
innodb_read_io_threads=10
innodb_write_io_threads=10
innodb_flush_method=O_DIRECT
innodb_io_capacity=1000
innodb_io_capacity_max=1000
innodb_lru_scan_depth=500
innodb_thread_concurrency=0
innodb_autoinc_lock_mode=2
innodb_log_files_in_group=3
innodb_max_dirty_pages_pct=90
innodb_lock_wait_timeout=100
bulk_insert_buffer_size = 16M
innodb_thread_concurrency = 8
innodb_purge_threads = 1
tmp_table_size 的默認大小是 32M。若是一張臨時表超出該大小,MySQL產生一個 The table tbl_name is full 形式的錯誤,若是你作不少 #高級 GROUP BY 查詢,增長 tmp_table_size 值:
tmp_table_size=512M
隨機讀取數據緩衝區使用內存(read_rnd_buffer_size):和順序讀取相對應,當 MySQL 進行非順序讀取(隨機讀取)數據塊的時候,會利用>這個緩衝區暫存讀取的數據。如根據索引信息讀取表數據,根據排序後的結果集與表進行Join等等。總的來講,就是當數據塊的讀取須要知足>必定的順序的狀況下,MySQL 就須要產生隨機讀取,進而使用到 read_rnd_buffer_size 參數所設置的內存緩衝區:
read_rnd_buffer_size=128M
你最好在定義數據庫命名規則的時候就所有采用小寫字母加下劃線的組合,而不使用任何的大寫字母:
lower_case_table_names=1
設置校驗模式 :
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
默認配置沒開查詢緩存:
explicit_defaults_for_timestamp
須要記錄進制日誌的數據庫.若是有多個數據庫可用逗號分隔,或者使用多個binlog-do-db選項:
binlog-do-db=showeedb
不須要記錄進制日誌的數據庫.若是有多個數據庫可用逗號分隔,或者使用多個binlog-do-db選項 :
binlog-ignore-db=mysql
須要進行同步的數據庫.若是有多個數據庫可用逗號分隔,或者使用多個replicate-do-db選項:
replicate-do-db=showeedb
不須要同步的數據庫.若是有多個數據庫可用逗號分隔,或者使用多個replicate-ignore-db選項:
replicate-ignore-db=mysql,test
同步參數:
server-id=1
log_bin=/var/log/mysql/mysql-bin
保證slave掛在任何一臺master上都會接收到另外一個master的寫入信息:
log-slave-updates
sync_binlog=1
auto_increment_offset=1
auto_increment_increment=2
過濾掉一些沒什麼大問題的錯誤:
slave-skip-errors=all