1. 程式人生 > 實用技巧 >(一)mysql介紹

(一)mysql介紹

MySQL 是一個關係型資料庫管理系統,由瑞典 MySQL AB 公司開發,目前屬於 Oracle 公司。MySQL 是一種關聯資料庫管理系統,關聯資料庫將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

1.mysql安裝

原始碼包安裝:https://www.cnblogs.com/kevingrace/p/6109679.html

2.配置引數參考my.cnf

client

[client]
port = 3306

mysqld

[mysqld]
#預設儲存引擎INNODB
default-storage-engine=INNODB
#GROUP_CONCAT長度
group_concat_max_len =99999

#埠號
port = 3306

#套接字檔案
#這裡要注意:有時候重啟mysql會提示/tmp/mysql.sock不存在,此時通常會由於兩種情況導致,解決方法可以參考我之前記錄的文章,親測有效:https://www.cnblogs.com/zhangweizhong/p/12179452.html
socket = /usr/local/mysql/mysql.sock

#pid寫入檔案位置
pid-file = /usr/local/mysql/mysqld.pid

#資料庫檔案位置
datadir = /home/data/mysql/data

#控制檔案開啟的個數;
open_files_limit = 10240

#SQL模式
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

#當外部鎖定(external-locking)起作用時,每個程序若要訪問資料表,
#則必須等待之前的程序完成操作並解除鎖定。由於伺服器訪問資料表時經常需要等待解鎖,
#因此在單伺服器環境下external locking會讓MySQL效能下降。
#所以在很多Linux發行版的源中,MySQL配置檔案中預設使用了skip-external-locking來避免external locking。
skip-external-locking

#跳過DNS反向解析
skip-name-resolve

#關閉TIMESTAMP型別預設值
explicit_defaults_for_timestamp

#不受client字符集影響,保證sever端字符集
skip-character-set-client-handshake

 

#初始連線字符集UTF8
init-connect='SET NAMES utf8'

 

#預設資料庫字符集
character-set-server=utf8

#查詢快取0,1,2,分別代表了off、on、demand
query_cache_type = 1

#單位秒,握手時間超過connect_timeout,連線請求將會被拒絕
connect_timeout = 20

 

#設定在多少秒沒收到主庫傳來的Binary Logs events之後,從庫認為網路超時,Slave IO執行緒會重新連線主庫。
#該引數的預設值是3600s ,然而時間太久會造成資料庫延遲或者主備庫直接的連結異常不能及時發現。
#將 slave_net_timeout 設得很短會造成 Master 沒有資料更新時頻繁重連。一般線上設定為5s
slave_net_timeout = 30

 

#這個引數用來配置從伺服器的更新是否寫入二進位制日誌,這個選項預設是不開啟的,
#但是,如果這個從伺服器B是伺服器A的從伺服器,同時還作為伺服器C的主伺服器,那麼就需要開發這個選項,
#這樣它的從伺服器C才能獲得它的二進位制日誌進行同步操作
log-slave-updates=1

#用於slave伺服器,io執行緒會把server id與自己相同的event寫入日誌,與log-slave-updates選項衝突
replicate-same-server-id=0

server_id=10112879101

# 開啟二進位制日誌功能.
# 在複製(replication)配置中,作為MASTER主伺服器必須開啟此項
# 如果你需要從你最後的備份中做基於時間點的恢復,你也同樣需要二進位制日誌
log-bin =/home/data/mysql/binlog/mysql-bin.log

#relay-log日誌
relay-log=mysql-relay-bin

#master-info-repository以及relay-log-info-repository開啟以啟用崩潰安全的二進位制日誌/從伺服器功能(在事務表而不是平面檔案中儲存資訊)
master-info-repository=TABLE
relay-log-info-repository=TABLE

#不寫入binlog二進位制日誌中的資料庫
binlog-ignore-db=mysql # No sync databases
binlog-ignore-db=test # No sync databases
binlog-ignore-db=information_schema # No sync databases
binlog-ignore-db=performance_schema # No sync databases

#寫入binlog二進位制日誌中資料庫
binlog-do-db=business_db
binlog-do-db=user_db
binlog-do-db=plocc_system

#清理binlog
expire-logs-days=15
max_binlog_size = 1073741824 # Bin logs size ( 1G )

#使binlog在每1000次binlog寫入後與硬碟同步
sync_binlog = 1000

#指定只複製哪個庫的資料
replicate-do-db=business_db
replicate-do-db=user_db
replicate-do-db=plocc_system

#開啟事件排程器Event Scheduler
event_scheduler=1

#MySQL能暫存的連線數量。當主要MySQL執行緒在一個很短時間內得到非常多的連線請求,這就起作用。
#如果MySQL的連線資料達到max_connections時,新來的請求將會被存在堆疊中,以等待某一連線釋放資源,
#該堆疊的數量即back_log,如果等待連線的數量超過back_log,將不被授予連線資源
#如果系統在短時間內有很多連線,則需要增大該引數的值,該引數值指定到來的TCP/IP連線的監聽佇列的大小。預設值50。
back_log = 500

#MySQL允許最大的程序連線數,
#如果經常出現Too Many Connections的錯誤提示,則需要增大此值。
max_connections = 6000

#每個使用者的最大的程序連線數
max_user_connection = 3000

#每個客戶端連線請求異常中斷的最大次數,如果達到了此限制.
#這個客戶端將會被MySQL服務阻止,直到執行了”FLUSH HOSTS” 或者服務重啟
#非法的密碼以及其他在連結時的錯誤會增加此值.
#檢視 “Aborted_connects” 狀態來獲取全域性計數器
max_connect_errors = 6000

#表調整緩衝區大小。
#table_cache 引數設定表快取記憶體的數目。每個連線進來,都會至少開啟一個表快取。
#因此,table_cache 的大小應與 max_connections 的設定有關。例如,對於 200 個並行執行的連線,應該讓表的快取至少有 200 × N ,這裡 N 是應用可以執行的查詢的一個聯接中表的最大數量。此外,還需要為臨時表和檔案保留一些額外的檔案描述符。
#當Mysql訪問一個表時,如果該表在快取中已經被開啟,則可以直接訪問快取;如果還沒有被快取但是在 Mysql 表緩衝區中還有空間,那麼這個表就被開啟並放入表緩衝區;如果表快取滿了,則會按照一定的規則將當前未用的表釋放,或者臨時擴大表快取來存放,使用表快取的好處是可以更快速地訪問表中的內容。
#執行 flush tables 會清空快取的內容。
#一般來說,可以通過檢視資料庫執行峰值時間的狀態值 Open_tables 和 Opened_tables ,判斷是否需要增加 table_cache 的值(其中 open_tables 是當前開啟的表的數量, Opened_tables 則是已經開啟的表的數量)。
#即如果open_tables接近table_cache的時候,並且Opened_tables這個值在逐步增加,那就要考慮增加這個#值的大小了。還有就是Table_locks_waited比較高的時候,也需要增加table_cache。
table_cache = 614

#表描述符快取大小,可減少檔案開啟/關閉次數
table_open_cache = 2048

#設定在網路傳輸中一次訊息傳輸量的最大值。系統預設值 為1MB,最大值是1GB,必須設定1024的倍數。
#當與大的BLOB欄位一起工作時相當必要
max_allowed_packet = 64M

# 在一個事務中binlog為了記錄SQL狀態所持有的cache大小
# 如果你經常使用大的,多宣告的事務,你可以增加此值來獲取更大的效能.
# 所有從事務來的狀態都將被緩衝在binlog緩衝中然後在提交後一次性寫入到binlog中
# 如果事務比此值大, 會使用磁碟上的臨時檔案來替代.
# 此緩衝在每個連線的事務第一次更新狀態時被建立
binlog_cache_size = 1M

# 獨立的記憶體表所允許的最大容量.
# 此選項為了防止意外建立一個超大的記憶體表導致用盡所有的記憶體資源.
max_heap_table_size = 256M 

#Sort_Buffer_Size被用來處理類似ORDER BY以及GROUP BY佇列所引起的排序,每一個要做排序的請求,都會分到一個sort_buffer_size大的快取
#Sort_Buffer_Size 是一個connection級引數,在每個connection(session)第一次需要使用這個buffer的時候,一次性分配設定的記憶體。
#Sort_Buffer_Size 並不是越大越好,由於是connection級的引數,過大的設定+高併發可能會耗盡系統記憶體資源。例如:500個連線將會消耗 500*sort_buffer_size(8M)=4G記憶體
#如果超過Sort_Buffer_Size設定的大小,MySQL會將資料寫入磁碟來完成排序,導致效率降低。
#屬重點優化引數
sort_buffer_size = 8M

#用於表間關聯快取的大小,和sort_buffer_size一樣,該引數對應的分配記憶體也是每個連線獨享。
#大部分表關聯都比較影響查詢效能,
#所以將此值設大能夠減輕效能影響。
#通過 “Select_full_join” 狀態變數查看錶關聯的數量
join_buffer_size = 8M

#thread_cache_size表示可以重新利用儲存在快取中執行緒的數量,當斷開連線時如果快取中還有空間,那麼客戶端的執行緒將被放到快取中,
#如果執行緒重新被請求,那麼請求將從快取中讀取,如果快取中是空的或者是新的請求,那麼這個執行緒將被重新建立,如果有很多新的執行緒,減少執行緒建立的開銷
#可以通過比較 Connections 和 Threads_created 狀態變數,來檢視thread_cache_size的設定是否起作用。
#設定規則:1GB 記憶體配置為8,2GB配置為16,3GB配置為32,4GB或更高記憶體,可配置更大。
thread_cache_size = 128

#此值表示允許應用程式在同一時間執行的執行緒的數量.
#設定thread_concurrency的值的正確與否,對mysql的效能影響很大, 在多個cpu(或多核)的情況下,錯誤設定了thread_concurrency的值, 會導致mysql不能充分利用多cpu(或多核), 出現同一時刻只能一個cpu(或核)在工作的情況。
#thread_concurrency應設為CPU核數的2倍
#屬重點優化引數
thread_concurrency = 8

#此值用來緩衝 SELECT 的結果並且在下一次同樣查詢的時候不再執行直接返回結果,如果你有大量的相同的查詢並且很少修改表,那麼query_cache_size可以極大的提高資料庫效能,
#需要注意的是:有時候資料庫出現了效能問題,大家就習慣的認為把這個值調大就行了。然而,這個引數加大後也引發了一系列問題。
#我們首先分析一下 query_cache_size的工作原理:一個SELECT查詢在DB中工作後,DB會把該語句快取下來,當同樣的一個SQL再次來到DB裡呼叫時,DB在該表沒發生變化的情況下把結果從快取中返回給Client。
#這裡有一個關建點,就是DB在利用Query_cache工作時,要求該語句涉及的表在這段時間內沒有發生變更。那如果該表在發生變更時,Query_cache裡的資料又怎麼處理呢?
#首先要把Query_cache和該表相關的語句全部置為失效,然後在寫入更新。那麼如果Query_cache非常大,該表的查詢結構又比較多,查詢語句失效也慢,一個更新或是Insert就會很慢,這樣看到的就是Update或是Insert怎麼這麼慢了。
#所以在資料庫寫入量或是更新量也比較大的系統,該引數不適合分配過大。而且在高併發,寫入量大的系統,建議把該功能禁掉。
#重點優化引數
query_cache_size = 64M

#指定單個查詢能夠使用的緩衝區大小,只有小於此設定值的結果才會被緩衝
#此設定用來保護查詢緩衝,防止極大的結果集將其他所有的查詢結果都覆蓋
#預設為1M
query_cache_limit = 2M

#被全文檢索索引的最小的字長.
#你也許希望減少它,如果你需要搜尋更短字的時候.
#注意在你修改此值之後,
#你需要重建你的 FULLTEXT 索引
ft_min_word_len = 4

#設定MYSQL執行緒使用的堆大小,此容量的記憶體在每次連線時被預留.
#MySQL 本身常不會需要超過64K的記憶體
#如果你使用你自己的需要大量堆的UDF函式
#或者你的作業系統對於某些操作需要更多的堆,
#你也許需要將其設定的更高一點.
thread_stack = 192K

#設定預設的事務隔離級別.可用的級別如下:
#READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = READ-COMMITTED

#此值表示記憶體中臨時表的最大大小,超過限值後就往硬碟寫
#此限制是針對單個表的,而不是總和
#注意:
# 1. max_heap_table_size 比 tmp_table_size 小時,則系統會把 max_heap_table_size 的值作為最大的記憶體臨時表的上限。這樣可達到提高聯接查詢速度的效果,建議儘量優化查詢,要確保查詢過程中生成的臨時表在記憶體中,避免臨時表過大導致生成基於硬碟的MyISAM表。
# 2. 通過show global status like '%created_tmp%' 查詢:Created_tmp_disk_tables和Created_tmp_tables的值,Created_tmp_disk_tables / Created_tmp_tables 值越小越好
tmp_table_size = 256M

#binlog日誌型別
#mixed:混合型
binlog_format=mixed

#開啟慢查詢日誌
slow_query_log

#檔案格式
log_output = FILE

# 所有的使用了比這個時間(以秒為單位)更多的查詢會被認為是慢速查詢.
# 不要在這裡使用”0″, 否則會導致所有的查詢,甚至非常快的查詢頁被記錄下來(由於MySQL 目前時間的精確度只能達到秒的級別).
long_query_time = 0.5

#慢查詢日誌位置
slow_query_log_file=/usr/local/mysql/mysqld_slow.log

MyISAM 相關選項

#用於索引的緩衝區大小,增加它可以提高索引處理效能,
#對於記憶體在4GB左右的伺服器來說,該引數可設定為256MB或384MB。
#通過show variables like ‘%key_buffer_size%';
#通過 show global status like ‘%key_blocks_unused%' 檢視是否還有剩餘,如果剩餘很多,就不需要再加大key_buffer_size了
#注意:
#1. 只用用於MyISAM表
#2. 可以設定為記憶體的30%-40%左右
#3. 即使你並不使用MyISAM 表, 最好也設定8-64M記憶體,由於它同樣會被內部臨時表使用
key_buffer_size = 2048M

 

#MySql讀入緩衝區大小。當對錶進行全表掃描請求是,將MySql會為它分配一個讀入緩衝區
#如果對錶的順序掃描請求非常頻繁,並且你認為頻繁掃描進行得太慢,可以通過增加該變數值以及記憶體緩衝區大小提高其效能。
#該引數對應的分配記憶體也是每個連線獨享。
read_buffer_size = 2M

 

#MySql的隨機讀(查詢操作)緩衝區大小。可以提高很多ORDER BY的效能,當需要時由每個執行緒分配。
#當進行排序查詢時,MySql會分配一個隨機讀快取區。首先掃描一遍該緩衝,以避免磁碟搜尋,提高查詢速度,
#如果需要排序大量資料,可適當調高該值。
#需要注意的是:MySql會為每個客戶連線發放該緩衝空間,所以應儘量適當設定該值,以避免記憶體開銷過大。
read_rnd_buffer_size = 16M

 

#批量插入資料快取大小,可以有效提高批量插入效率,預設為8M
#注意:
# 1. 不要將此值設定大於 “key_buffer_size”.
# 2. 設定0會關閉此引數。
bulk_insert_buffer_size = 16M

 

#MyISAM表發生變化,重建索引時所需的緩衝
#注意:此引數每個執行緒中分配,不宜設定過大。
myisam_sort_buffer_size = 128M

 

#MySQL重建索引時所允許的臨時檔案的大小 (當 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
#如果臨時檔案大於此值,索引會通過鍵值緩衝建立(更慢)
myisam_max_sort_file_size = 1G

 

#如果一個表擁有多個索引, MyISAM 會通過並行排序使用多個執行緒去修復他們。
#一般用於擁有多個CPU以及大量記憶體情況。
myisam_repair_threads = 1

 

# 自動檢查和修復沒有適當關閉的 MyISAM 表.
myisam_recover

INNODB相關選項

#如果你的MySQL服務包含InnoDB支援但是並不打算使用的話,
#使用此選項會節省記憶體以及磁碟空間,並且加速某些部分
#skip-innodb

#這對Innodb表來說非常重要,Innodb把所有的資料和索引都快取起來,此引數設定越大,資料存取時所需要的磁碟I/O越少。
#Innodb比MyISAM表對緩衝更為敏感。MyISAM可以在預設的 key_buffer_size 設定下執行的可以,然而Innodb在預設的 innodb_buffer_pool_size 設定下卻跟蝸牛似的。
#注意:
#1. 當然如果你的資料量不大,並且不會暴增,也無需把 innodb_buffer_pool_size 設定的太大
#2. 如果在一個獨立使用的資料庫伺服器上,你可以設定這個變數到伺服器實體記憶體大小的80%
#3. 注意在32位系統上你每個程序可能被限制在 2-3.5G,
#屬重點優化引數
innodb_buffer_pool_size = 2048M

 

# InnoDB 將資料儲存在一個或者多個數據檔案中成為表空間
# 如果你只有單個邏輯驅動儲存你的資料,一個單個的自增檔案就足夠好了
# 其他情況下.每個裝置一個檔案一般都是個好的選擇
# 你也可以配置InnoDB來使用裸盤分割槽
innodb_data_file_path = ibdata1:1024M:autoextend

 

# 檔案IO的執行緒數,一般為 4
# 此值在Unix下被硬編碼為4,但是在Windows下可以設定得較大.
innodb_file_io_threads = 4

 

# 允許執行緒數量。
# 伺服器有幾個CPU就設定為幾,建議用預設設定。
# 過高的值可能導致執行緒的互斥。
innodb_thread_concurrency = 16

 

# 如果設定為1 ,InnoDB會在每次事務提交後將事務日誌寫到磁碟上,
# 基於效能考慮,可以設定為0或2,但要承擔在發生故障時丟失資料的風險。
# 0代表日誌只大約每秒寫入日誌檔案並且日誌檔案重新整理到磁碟.
# 2代表每次提交後日志寫入日誌檔案,但是日誌檔案每秒重新整理到磁碟上。
# 幾點說明:
# 1. 如果是遊戲伺服器,建議此值設定為2;如果是對資料安全要求極高的應用,建議設定為1;
# 2. 設定為0效能最高,但如果發生故障,資料可能會有丟失的危險!
# 3. 預設值1每一次事務提交都需要把日誌寫到硬碟,這是很費時的。
# 4. 特別是使用電池供電快取(Battery backed up cache)時。設成2對於很多運用,特別是從MyISAM錶轉過來的是可以的,
# 5. 它的意思是不寫入硬碟而是寫入系統快取。日誌仍然會每秒flush到硬碟,所以你一般不會丟失超過1-2秒的更新。
# 6. 設成0會更快一點,但安全方面比較差,即使MySQL掛了也可能會丟失事務的資料。而值2只會在整個作業系統掛了時才可能丟資料
#屬重點優化引數
innodb_flush_log_at_trx_commit = 2


#此引數用於寫日誌檔案所用的記憶體大小,以M為單位。緩衝區更大能提高效能,但意外的故障將會丟失資料。
#當快取大小達到設定值後, InnoDB會將這些資料寫到到磁碟上。
#由於基本上每秒都會重新整理一次,所以沒有必要將此值設定的太大,MySQL開發人員建議設定為1-8M之間
innodb_log_buffer_size = 16M

#此引數用於確定日誌檔案的大小
#為避免在日誌檔案覆寫上不必要的緩衝池重新整理
#一般設定為日誌檔案總合大小到你緩衝池大小的25%~100%
#但這同時也會增加恢復故障資料庫所需的時間
innodb_log_file_size = 1024M

 

#日誌組中的檔案總數. 為提高效能,MySQL會以迴圈方式將日誌寫到多個檔案中
#通常來說2~3是比較好的.
innodb_log_files_in_group = 3

# InnoDB的日誌檔案所在位置. 預設是MySQL的datadir.
# 你可以將其指定到一個獨立的硬碟上或者一個RAID1捲上來提高其效能
#innodb_log_group_home_dir

# 在InnoDB緩衝池中最大允許的髒頁面的比例.
# 如果達到限額, InnoDB會開始重新整理他們防止他們妨礙到乾淨資料頁面.
# 這是一個軟限制,不被保證絕對執行.
innodb_max_dirty_pages_pct = 90

# InnoDB用來重新整理日誌的方法.
# 表空間總是使用雙重寫入重新整理方法
# 預設值是 “fdatasync”, 另一個是 “O_DSYNC”.
innodb_flush_method=O_DSYNC

# 在被回滾前,一個InnoDB的事務應該等待一個鎖被批准多久.
# InnoDB在其擁有的鎖表中自動檢測事務死鎖並且回滾事務.
# 如果你使用 LOCK TABLES 指令, 或者在同樣事務中使用除了InnoDB以外的其他事務安全的儲存引擎
# 那麼一個死鎖可能發生而InnoDB無法注意到.
# 這種情況下這個timeout值對於解決這種問題就非常有幫助.
innodb_lock_wait_timeout = 30

mysqldump

[mysqldump]
# 不要在將記憶體中的整個結果寫入磁碟之前快取. 在匯出非常巨大的表時需要此項
quick
max_allowed_packet = 64M

mysql

[mysql]
no-auto-rehash

#指定一個請求的最大連線時間,對於4GB左右的記憶體伺服器來說,可以將其設定為5-10。
wait_timeout = 10

#開啟該選可以徹底關閉MySQL的TCP/IP連線方式,如果WEB伺服器是以遠端連線的方式訪問MYSQL資料庫伺服器的,則不要開啟該選項,否則將無法正常連線。
skip_networking

#將沒有使用索引的查詢也記錄下來
log-queries-not-using-indexes

3.mysql邏輯架構介紹


4.mysql儲存引擎


參考:https://www.cnblogs.com/zhangweizhong/p/12179438.html