本篇文章給大家主要講的是關(guān)于MySQL數(shù)據(jù)庫的特性以及參數(shù)性能的內(nèi)容,感興趣的話就一起來看看這篇文章吧,相信看完mysql數(shù)據(jù)庫的特性以及參數(shù)性能對(duì)大家多少有點(diǎn)參考價(jià)值吧。
成都創(chuàng)新互聯(lián)公司主營土默特右旗網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶App定制開發(fā),土默特右旗h5微信小程序定制開發(fā)搭建,土默特右旗網(wǎng)站營銷推廣歡迎土默特右旗等地區(qū)企業(yè)咨詢
一:mysql與其他數(shù)據(jù)庫的比較
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),開發(fā)者為瑞典MySQL AB公司,現(xiàn)在已經(jīng)被Sun公司收購,支持FreeBSD、Linux、MAC、Windows等多種操作系統(tǒng)與其他的大型數(shù)據(jù)庫例如Oracle、DB2、SQL Server等相比功能稍弱一些
1、可以處理擁有上千萬條記錄的大型數(shù)據(jù)
2、支持常見的SQL語句規(guī)范
3、可移植行高,安裝簡單小巧
4、良好的運(yùn)行效率,有豐富信息的網(wǎng)絡(luò)支持
5、調(diào)試、管理,優(yōu)化簡單(相對(duì)其他大型數(shù)據(jù)庫)
易用性比較
從安裝方面來說,MySQL安裝包大小僅100MB左右,與那幾大商業(yè)數(shù)據(jù)庫相比完全不是一個(gè)數(shù)量級(jí)。它的安裝也比Oracle等商業(yè)數(shù)據(jù)庫容易很多,不論是通過已經(jīng)編譯好的二進(jìn)制分發(fā)包,還是通過源碼編譯安裝,都非常簡單。
性能比較
MySQL一直以來奉行一個(gè)原則,那就是在保證足夠穩(wěn)定性的前提下,盡可能地提高自身的處理能力。也就是說,在性能和功能方面,MySQL第一考慮的要素主要還是性能,MySQL希望能夠在滿足客戶99%的需求的前提下,將剩余的所有精力都用來努力提高系統(tǒng)性能,而不希望自己是一個(gè)比其他任何數(shù)據(jù)庫的功能都要強(qiáng)大的產(chǎn)品。
總體來說,MySQL數(shù)據(jù)庫在發(fā)展過程中一直追求三項(xiàng)原則:簡單、高效、可靠。
二:mysql架構(gòu)組成
mysql物理文件組成:
1)日志文件:主要包含{錯(cuò)誤日志、查詢?nèi)罩尽⒙樵內(nèi)罩?、事物日志、二進(jìn)制日志}
日志是mysql數(shù)據(jù)庫的重要組成部分。記錄mysql數(shù)據(jù)庫運(yùn)行期間發(fā)生的變化,如mysql數(shù)據(jù)庫的客戶端連接狀況、sql語句執(zhí)行情況和錯(cuò)誤信息。當(dāng)數(shù)據(jù)庫遭到損壞時(shí),可以通過日志查看文件記錄的出錯(cuò)的原因,并且可以通過日志文件進(jìn)行數(shù)據(jù)恢復(fù)。
首先挨個(gè)介紹日志的功能:
錯(cuò)誤日志:Error Log
在mysql數(shù)據(jù)庫中,錯(cuò)誤日志功能是默認(rèn)開啟的。默認(rèn)情況下,錯(cuò)誤日志存儲(chǔ)在mysql數(shù)據(jù)庫的數(shù)據(jù)目錄中。錯(cuò)誤日志文件通常的名稱為hostname.err。其中,hostname表示云服務(wù)器主機(jī)名。
錯(cuò)誤日志所記錄的信息是可以通過log-error和log-warnings來定義的,其中l(wèi)og-error是定義是否啟用錯(cuò)誤日志的功能和錯(cuò)誤日志的存儲(chǔ)位置,log-warnings是定義是否將警告信息也定義至錯(cuò)誤日志中。記錄的內(nèi)容信息包括:云服務(wù)器啟動(dòng)和關(guān)閉過程中的信息(未必是錯(cuò)誤信息,如mysql如何啟動(dòng)InnoDB的表空間文件的、如何初始化自己的存儲(chǔ)引擎的等等)、云服務(wù)器運(yùn)行過程中的錯(cuò)誤信息、事件調(diào)度器運(yùn)行一個(gè)事件時(shí)產(chǎn)生的信息、在從云服務(wù)器上啟動(dòng)云服務(wù)器進(jìn)程時(shí)產(chǎn)生的信息
mysql有很多的系統(tǒng)變量可以設(shè)置,系統(tǒng)的變量設(shè)置不同,會(huì)導(dǎo)致系統(tǒng)運(yùn)行狀態(tài)不同
mysql兩組命令:分別查看系統(tǒng)設(shè)置和運(yùn)行狀態(tài):
1、查看系統(tǒng)設(shè)置:
SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]
SHOW VARIABLES:shows the values of MySQL system variables.
2、運(yùn)行狀態(tài):
SHOW [GLOBAL | SESSION] STATUS [like_or_where]
SHOW STATUS:provides server status information.
那么接下來修改系統(tǒng)配置:在主配置文件中
vi /etc/my.cnf
例如:log_bin=/usr/local/mysql/data/
查看mysql的版本
或
一般而言,日志級(jí)別的定義沒有會(huì)話變量都只是在全局級(jí)別下進(jìn)行定義
錯(cuò)誤日志的狀態(tài):
log-error定義為錯(cuò)誤日志文件路徑
log-error-verbosity
The MySQL error log has received some attention in MySQL 5.7, with a new setting called log_error_verbosity.
更改錯(cuò)誤日志位置可以使用log-error來設(shè)置如下:
在主配置文件中: vi /etc/my.cnf
log-error = /usr/local/mysql/data/mysqld.err
查看mysql的錯(cuò)誤日志內(nèi)容:
在工作中有時(shí)候希望將錯(cuò)誤日志做備份,并且重新記錄,這時(shí)候可以使用mysql的flush logs刷新日志進(jìn)行生成新的日志文件。備份文件為.beifen結(jié)尾
刪除錯(cuò)誤日志:
在mysql5.5.7之前:數(shù)據(jù)庫管理員可以刪除很長時(shí)間之前的錯(cuò)誤日志,以保證mysql云服務(wù)器上的硬盤空間。mysql數(shù)據(jù)庫中,可以使用mysqladmin命令開啟新的錯(cuò)誤日志。mysqladmin命令的語法如下:mysqladmin –u root –pflush-logs也可以登錄mysql數(shù)據(jù)庫中使用FLUSHLOGS語句來開啟新的錯(cuò)誤日志。
在mysql5.5.7之后:云服務(wù)器將關(guān)閉此項(xiàng)功能。只能使用重命名原來的錯(cuò)誤日志文件,手動(dòng)沖洗日志創(chuàng)建一個(gè)新的:方式如下:
更多信息請查閱官方文檔:http://dev.mysql.com/doc/refman/5.5/en/error-log.html
http://dev.mysql.com/doc/refman/5.6/en/error-log.html
http://dev.mysql.com/doc/refman/5.7/en/error-log.html
二進(jìn)制日志:Binary Log & Binary Log Index
二進(jìn)制日志,俗稱Binary Log,主要用于記錄修改數(shù)據(jù)或有可能引起數(shù)據(jù)改變的mysql語句;并且記錄語句的發(fā)生時(shí)間、執(zhí)行時(shí)長、操作數(shù)據(jù)。。。。一般情況下大小體積上限為1G
當(dāng)我們通過“l(fā)og-bin=file_name”打開了記錄的功能之后,MySQL 會(huì)將所有修改數(shù)據(jù)庫數(shù)據(jù)的query 以二進(jìn)制形式記錄到日志文件中。當(dāng)然,日志中并不僅限于query 語句這么簡單,還包括每一條query 所執(zhí)行的時(shí)間,所消耗的資源,以及相關(guān)的事務(wù)信息,所以binlog是事務(wù)安全的。
主:如果log-bin日志不開啟的話那么將無法做mysql主從復(fù)制
和錯(cuò)誤日志一樣,binlog記錄功能同樣需要“l(fā)og-bin=file_name”參數(shù)的顯式指定才能開啟,如果未指定file_name,則會(huì)在數(shù)據(jù)目錄下記錄為mysql-bin.******(*代表0~9 之間的某一個(gè)數(shù)字,來表示該日志的序號(hào))。
二進(jìn)制的開啟:
當(dāng)前是關(guān)閉狀態(tài)
可以通過直配置文件開啟:
之后重啟mysql服務(wù)
再次查看mysql服務(wù)已經(jīng)啟動(dòng):
binlog還有其他一些附加選項(xiàng)參數(shù):
“max_binlog_size”設(shè)置binlog的最大存儲(chǔ)上限,一般設(shè)置為512M或1G,一般不能超過1G當(dāng)日志達(dá)到該上限時(shí),MySQL 會(huì)重新創(chuàng)建一個(gè)日志開始繼續(xù)記錄。不過偶爾也有超出該設(shè)置的binlog產(chǎn)生,一般都是因?yàn)樵诩磳⑦_(dá)到上限時(shí),產(chǎn)生了一個(gè)較大的事務(wù),為了保證事務(wù)安全,MySQL 不會(huì)將同一個(gè)事務(wù)分開記錄到兩個(gè)binlog中。
“binlog-do-db=db_name”參數(shù)明確告訴MySQL,需要對(duì)某個(gè)(db_name)數(shù)據(jù)庫記錄binlog,如果有了“binlog-do-db=db_name”參數(shù)的顯式指定,MySQL 會(huì)忽略針對(duì)其他數(shù)據(jù)庫執(zhí)行的query,而僅僅記錄針對(duì)指定數(shù)據(jù)庫執(zhí)行的query。
“binlog-ignore-db=db_name”與“binlog-do-db=db_name”完全相反,它顯式指定忽略某個(gè)(db_name)數(shù)據(jù)庫的binlog記錄,當(dāng)指定了這個(gè)參數(shù)之后,MySQL 會(huì)記錄指定數(shù)據(jù)庫以外所有的數(shù)據(jù)庫的binlog。
mysql-bin.index文件(binary log index)的功能是記錄所有Binary Log 的絕對(duì)路徑,保證MySQL 各種線程能夠順利的根據(jù)它找到所有需要的Binary Log 文件。
binlog_cache_size =32768 #默認(rèn)值32768 binlog_cache_size:一個(gè)事務(wù),在沒有提交(uncommitted)的時(shí)候,產(chǎn)生的日志,記錄到Cache中;等到事務(wù)提交(committed)需要提交的時(shí)候,則把日志持久化到磁盤。一般來說,如果我們的數(shù)據(jù)庫中沒有什么大事務(wù),寫入也不是特別頻繁,2MB~4MB是一個(gè)合適的選擇。但是如果我們的數(shù)據(jù)庫大事務(wù)較多,寫入量比較大,可與適當(dāng)調(diào)高binlog_cache_size。
binlog_cache_size :一個(gè)事務(wù),在沒有提交(uncommitted)的時(shí)候,產(chǎn)生的日志,記錄到Cache中;等到事務(wù)提交(committed)需要提交的時(shí)候,則把日志持久化到磁盤。
接著,binlog_cache_size設(shè)置多大呢?答案是:根據(jù)公司生產(chǎn)的實(shí)際情況而定
設(shè)置太大的話,會(huì)比較消耗內(nèi)存資源(Cache本質(zhì)就是內(nèi)存),更加需要注意的是:binlog_cache不是全局的,是按SESSION為單位獨(dú)享分配的,也就是說當(dāng)一個(gè)線程開始一個(gè)事務(wù)的時(shí)候,Mysql就會(huì)為這個(gè)SESSION分配一個(gè)binlog_cache (備注:我想之所以以SESSION為單位分配binlog_cache是有道理的,因?yàn)椴煌膍ysql請求,產(chǎn)生的binlog數(shù)量不一樣的,批量插入數(shù)據(jù)必然產(chǎn)生大量的binlog,而簡單注冊一個(gè)用戶,產(chǎn)生的binlog有限,那么JDBC連接上能否設(shè)置binlog_cache_size呢?)。
設(shè)置太小的話,如果用戶提交一個(gè)“長事務(wù)(long_transaction)”,比如:批量導(dǎo)入數(shù)據(jù)。那么該事務(wù)必然會(huì)產(chǎn)生很多binlog,這樣cache可能不夠用(默認(rèn)binlog_cache_size是32K),不夠用的時(shí)候mysql會(huì)把uncommitted的部分寫入臨時(shí)文件(臨時(shí)文件cache的效率必然沒有內(nèi)存cache高),等到committed的時(shí)候才會(huì)寫入正式的持久化日志文件。
概念解釋:
事務(wù)表支持將批處理當(dāng)做一個(gè)完整的任務(wù)統(tǒng)一提交或回滾,即對(duì)包含在事務(wù)中的多條語句要么全執(zhí)行,要么全部不執(zhí)行
非事務(wù)表則不支持此種操作,批處理中的語句如果遇到錯(cuò)誤,在錯(cuò)誤前的語句執(zhí)行成功,之后的則不執(zhí)行。
log-bin = mysql-bin#指定binlog的位置,默認(rèn)在數(shù)據(jù)目錄下。
binlog-format= {ROW|STATEMENT|MIXED}#指定二進(jìn)制日志的類型,默認(rèn)為MIXED。
概念解釋:mysql復(fù)制主要有三種方式:基于SQL語句的復(fù)制(statement-based replication, SBR),基于行的復(fù)制(row-based replication, RBR),混合模式復(fù)制(mixed-based replication, MBR)。對(duì)應(yīng)的,binlog的格式也有三種:STATEMENT,ROW,MIXED。
STATEMENT模式(SBR)
每一條會(huì)修改數(shù)據(jù)的sql語句會(huì)記錄到binlog中。優(yōu)點(diǎn)是并不需要記錄每一行的數(shù)據(jù)變化,減少了binlog日志量,節(jié)約IO,提高性能。
缺點(diǎn):
某些情況下會(huì)導(dǎo)致master-slave中的數(shù)據(jù)不一致(如sleep()函數(shù),last_insert_id(),以及user-defined functions(udf)等會(huì)出現(xiàn)問題)
ROW模式(RBR)
不記錄每條sql語句的信息,僅需記錄哪條數(shù)據(jù)被修改了,修改成什么樣了。
缺點(diǎn):
是會(huì)產(chǎn)生大量的日志,讓日志暴漲。
③ MIXED模式(MBR)
以上兩種模式的混合使用,一般的復(fù)制使用STATEMENT模式保存binlog,對(duì)于STATEMENT模式無法復(fù)制的操作使用ROW模式保存binlog,MySQL會(huì)根據(jù)執(zhí)行的SQL語句選擇日志保存方式。即交替使用行和語句、由mysql云服務(wù)器自行判斷。
其中基于行的定義格式數(shù)據(jù)量會(huì)大一些但是可以保證數(shù)據(jù)的精確性
注:在生產(chǎn)環(huán)境下多使用MBR模式,雖然I/O使用增大,但對(duì)數(shù)據(jù)安全性比較高
sync_binlog = 10#設(shè)定多久同步一次二進(jìn)制日志至磁盤文件中,0表示不同步,任何正數(shù)值都表示對(duì)二進(jìn)制每多少次寫操作之后同步一次。當(dāng)autocommit的值為1時(shí),每條語句的執(zhí)行都會(huì)引起二進(jìn)制日志同步,否則,每個(gè)事務(wù)的提交會(huì)引起二進(jìn)制日志同步
通過編輯my.cnf中的log-bin選項(xiàng)可以開啟二進(jìn)制日志;形式如下:
log-bin = /usr路徑
其中,DIR參數(shù)指定二進(jìn)制文件的存儲(chǔ)路徑;filename參數(shù)指定二級(jí)制文件的文件名,其形式為filename.number,number的形式為000001、000002等。每次重啟mysql服務(wù)或運(yùn)行mysql> flush logs;都會(huì)生成一個(gè)新的二進(jìn)制日志文件,這些日志文件的number會(huì)不斷地遞增。除了生成上述的文件外還會(huì)生成一個(gè)名為filename.index的文件。這個(gè)文件中存儲(chǔ)所有二進(jìn)制日志文件的清單又稱為二進(jìn)制文件的索引
查看二進(jìn)制日志:
二進(jìn)制日志的定義方式為二進(jìn)制格式;使用此格式可以存儲(chǔ)更多的信息,并且可以使寫入二進(jìn)制日志的效率更高。但是不能直接使用查看命令打開并查看二進(jìn)制日志。
當(dāng)前使用的二進(jìn)制文件及所處位置
查看當(dāng)前二進(jìn)制文件的信息:
查看二進(jìn)制日志信息的命令:
語法格式:SHOW BINLOG EVENTS[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
#查看所有的二進(jìn)制信息
mysql> show binlog events\G;
#查看指定日志的二進(jìn)制信息
#從指定的事件位置開始
mysql> show binlog events in 'log.000002' from 1215\G;
由于無法使用cat等方式直接打開并查看二進(jìn)制日志;所以必須使用mysqlbinlog命令。但是當(dāng)正在執(zhí)行mysql讀寫操作時(shí)建議不要使用此打開正在使用的二進(jìn)制日志文件;若非要打開可flush logs。mysqlbinlog命令的使用方式:
刪除二進(jìn)制日志信息:
二進(jìn)制日志會(huì)記錄大量的信息(其中包含一些無用的信息)。如果很長時(shí)間不清理二進(jìn)制日志,將會(huì)浪費(fèi)很多的磁盤空間。但是,刪除之后可能導(dǎo)致數(shù)據(jù)庫崩潰時(shí)無法進(jìn)行恢復(fù),所以若要?jiǎng)h除二進(jìn)制日志首先將其和數(shù)據(jù)庫備份一份,其中也只能刪除備份前的二進(jìn)制日志,新產(chǎn)生的日志信息不可刪。也不可在關(guān)閉mysql云服務(wù)器之后直接刪除因?yàn)檫@樣可能會(huì)給數(shù)據(jù)庫帶來錯(cuò)誤的。若非要?jiǎng)h除二進(jìn)制日志需要做如下操作:導(dǎo)出備份數(shù)據(jù)庫和二進(jìn)制日志文件進(jìn)行壓縮歸檔存儲(chǔ)。刪除二進(jìn)制文件的方法如下:
方法1:根據(jù)文件或時(shí)間點(diǎn)來刪除二進(jìn)制日志:
語法形式:
mysql> PURGE { BINARY | MASTER } LOGS {TO 'log_name' | BEFORE datetime_expr }
其中TO'log_name'表示把這個(gè)文件之前的其他文件都刪除掉,也可使用BEFORE datetime_expr指定把哪個(gè)時(shí)間之前的二進(jìn)制文件刪除了。
刪除所有的二進(jìn)制日志(慎用):
使用RESET MASTER語句可以刪除所有的二進(jìn)制日志。該語句的形式如下:
3、事務(wù)日志(或稱redo日志)
事務(wù)日志(InnoDB特有的日志)可以幫助提高事務(wù)的效率。使用事務(wù)日志,存儲(chǔ)引擎在修改表的數(shù)據(jù)時(shí)只需要修改其內(nèi)存拷貝,再把修改行為記錄到持久在硬盤上的事務(wù)日志中,而不用每次都將修改的數(shù)據(jù)本身持久到磁盤。事務(wù)日志采用追加的方式,因此寫日志的操作是磁盤上一小塊區(qū)域內(nèi)的順序I/O,而不像隨機(jī)I/O需要在磁盤的多個(gè)地方移動(dòng)磁頭,所以采用事務(wù)日志的方式相對(duì)來說要快得多。事務(wù)日志持久以后,內(nèi)存中被修改的數(shù)據(jù)在后臺(tái)可以慢慢的刷回到磁盤。目前大多數(shù)的存儲(chǔ)引擎都是這樣實(shí)現(xiàn)的。
如果數(shù)據(jù)的修改已經(jīng)記錄到事務(wù)日志并持久化,但數(shù)據(jù)本身還沒有寫回磁盤,此時(shí)系統(tǒng)崩潰,存儲(chǔ)引擎在重啟時(shí)能夠自動(dòng)恢復(fù)這部分修改的數(shù)據(jù)。具有的恢復(fù)方式則視存儲(chǔ)引擎而定。
一般情況下,mysql會(huì)默認(rèn)提供多種存儲(chǔ)引擎,你可以通過下面的查看:
查看你的mysql現(xiàn)在已提供什么存儲(chǔ)引擎:
mysql> show engines;
看你的mysql當(dāng)前默認(rèn)的存儲(chǔ)引擎:
mysql> show variables like '%storage_engine%';
你要看某個(gè)表用了什么引擎(在顯示結(jié)果里參數(shù)engine后面的就表示該表當(dāng)前用的存儲(chǔ)引擎):
mysql> show create table 表名;
注:
create table 庫名.表名 engine = innodb;
這樣就可以將表的引擎變更為innodb引擎了。
也可以在創(chuàng)建表之后通過下面語句來變更:
alter table庫名.表名engine =innodb;
查看事務(wù)日志的定義:
mysql> show global variables like '%log%';
顯示結(jié)果:
| innodb_flush_log_at_timeout| 1 |
| innodb_flush_log_at_trx_commit | 1 #在事務(wù)提交時(shí)innodb是否同步日志從緩沖區(qū)到文件中,當(dāng)這個(gè)值為1(默認(rèn)值)之時(shí),在每個(gè)事務(wù)提交時(shí),日志緩沖被寫到日志文件,對(duì)日志文件做到磁盤操作的刷新,性能會(huì)很差造成大量的磁盤I/O但這種方式最安全;如果設(shè)為2,每次提交事務(wù)都會(huì)寫日志,但并不會(huì)執(zhí)行刷的操作。每秒定時(shí)會(huì)刷到日志文件。要注意的是,并不能保證100%每秒一定都會(huì)刷到磁盤,這要取決于進(jìn)程的調(diào)度。每次事務(wù)提交的時(shí)候?qū)?shù)據(jù)寫入事務(wù)日志,而這里的寫入僅是調(diào)用了文件系統(tǒng)的寫入操作,而文件系統(tǒng)是有 緩存的,所以這個(gè)寫入并不能保證數(shù)據(jù)已經(jīng)寫入到物理磁盤。設(shè)置為0,日志緩沖每秒一次地被寫到日志文件,并且對(duì)日志文件做到磁盤操作的刷新,但是在一個(gè)事務(wù)提交不做任何操作。
注:刷寫的概念
刷寫其實(shí)是兩個(gè)操作,刷(flush)和寫(write),區(qū)分這兩個(gè)概念是很重要的。在大多數(shù)的操作系統(tǒng)中,把Innodb的log buffer(內(nèi)存)寫入日志(調(diào)用系統(tǒng)調(diào)用write),只是簡單的把數(shù)據(jù)移到操作系統(tǒng)緩存中,操作系統(tǒng)緩存同樣指的是內(nèi)存。并沒有實(shí)際的持久化數(shù)據(jù)。
所以,通常設(shè)為0和2的時(shí)候,在崩潰或斷電的時(shí)候會(huì)丟失最后一秒的數(shù)據(jù),因?yàn)檫@個(gè)時(shí)候數(shù)據(jù)只是存在于操作系統(tǒng)緩存。之所以說“通?!保赡軙?huì)有丟失不只1秒的數(shù)據(jù)的情況,比如說執(zhí)行flush操作的時(shí)候阻塞了。
總結(jié)
設(shè)為1當(dāng)然是最安全的,但性能頁是最差的(相對(duì)其他兩個(gè)參數(shù)而言,但不是不能接受)。如果對(duì)數(shù)據(jù)一致性和完整性要求不高,完全可以設(shè)為2,如果只最求性能,例如高并發(fā)寫的日志云服務(wù)器,設(shè)為0來獲得更高性能
|
| innodb_locks_unsafe_for_binlog| OFF |
| innodb_log_buffer_size| 16777216 |
| innodb_log_checksums | ON |
| innodb_log_compressed_pages| ON |
| innodb_log_file_size| 50331648 #日志文件大小 |
| innodb_log_files_in_group| 2 # DB中設(shè)置幾組事務(wù)日志,默認(rèn)是2 |
| innodb_log_group_home_dir| ./#定義innodb事務(wù)日志組的位置,此位置設(shè)置默認(rèn)為MySQL的datadir |
每個(gè)事務(wù)日志都是大小為50兆的文件(不同版本的mysql有差異):
在mysql中默認(rèn)以ib_logfile0,ib_logfile1名稱存在
4、慢查詢?nèi)罩荆簊low query log
顧名思義,慢查詢?nèi)罩局杏涗浀氖菆?zhí)行時(shí)間較長的query,也就是我們常說的slowquery。
慢查詢?nèi)罩静捎玫氖呛唵蔚奈谋靖袷?,可以通過各種文本編輯器查看其中的內(nèi)容。其中
記錄了語句執(zhí)行的時(shí)刻,執(zhí)行所消耗的時(shí)間,執(zhí)行用戶,連接主機(jī)等相關(guān)信息。
慢查詢?nèi)罩镜淖饔茫?/p>
慢查詢?nèi)罩臼怯脕碛涗泩?zhí)行時(shí)間超過指定時(shí)間的查詢語句。通過慢查詢?nèi)罩?,可以查找出哪些查詢語句的執(zhí)行效率很低,以便進(jìn)行優(yōu)化。一般建議開啟,它對(duì)云服務(wù)器性能的影響微乎其微,但是可以記錄mysql云服務(wù)器上執(zhí)行了很長時(shí)間的查詢語句??梢詭椭覀兌ㄎ恍阅軉栴}的。MySQL 還提供了專門用來分析滿查詢?nèi)罩镜墓ぞ叱绦騧ysqldumpslow,用來幫助數(shù)據(jù)庫管理人員解決可能存在的性能問題。
查看慢查詢?nèi)罩镜亩x:
\啟動(dòng)和設(shè)置慢查詢?nèi)罩荆?/p>
方法1:通過配置文件my.cnf開啟慢查詢?nèi)罩荆?/p>
注:在不同的mysql版本中,開啟慢查詢?nèi)罩緟?shù)不太一樣,不過都可以通過 show variables like "%slow%" 和show variables like "%long%"查看出來。
其中:
slow_query_log: off關(guān)閉狀態(tài) (0) on開啟狀態(tài)(1)
slow_query_log_file 慢查詢?nèi)罩敬娣诺攸c(diǎn)
long_query_time選項(xiàng)來設(shè)置一個(gè)時(shí)間值,時(shí)間以秒為單位,可以精確到微秒。如果查詢時(shí)間超過了這個(gè)時(shí)間值(默認(rèn)為10秒),這個(gè)查詢語句將被記錄到慢查詢?nèi)罩局?設(shè)置為0的話表示記錄所有的查詢。
注:如果不指定存儲(chǔ)路徑,慢查詢?nèi)罩灸J(rèn)存儲(chǔ)到mysql數(shù)據(jù)庫的數(shù)據(jù)文件下,如果不指定文件名,默認(rèn)文件名為hostname-slow.log
修改my.cnf文件:
另外也可以通過mysql直接定義(只不過屬于臨時(shí)生效)
mysql>set globalslow_query_log=1; #開啟慢查詢?nèi)罩?/p>
Query OK, 0 rowsaffected (0.35 sec)
mysql>setsession long_query_time=0.0001; #更改時(shí)間(當(dāng)前session中,退出則重置)
Query OK, 0 rowsaffected (0.00 sec)
mysql>set globallong_query_time=0.0001; #更改時(shí)間(全局中,重啟服務(wù)則重置)
mysql> SHOWVARIABLES LIKE 'long%'; #查詢定義時(shí)間
查看慢查詢?nèi)罩?/p>
查看文件內(nèi)容命令如cat直接查看慢日志文件
數(shù)據(jù)文據(jù) (在這里主要介紹myisam和innodb的區(qū)別以及功能)
在MySQL 中每一個(gè)數(shù)據(jù)庫都會(huì)在定義好(或者默認(rèn))的數(shù)據(jù)目錄下存在一個(gè)以數(shù)據(jù)庫名字命名的文件夾,用來存放該數(shù)據(jù)庫中各種表數(shù)據(jù)文件。不同的MySQL 存儲(chǔ)引擎有各自不同的數(shù)據(jù)文件。如MyISAM用“.MYD”作為擴(kuò)展名,Innodb用“.ibd”
如何查看你的mysql現(xiàn)在已提供什么存儲(chǔ)引擎:
mysql> show engines;
看你的mysql當(dāng)前默認(rèn)的存儲(chǔ)引擎:
mysql> show variables like '%storage_engine%';
你要看某個(gè)表用了什么引擎(在顯示結(jié)果里參數(shù)engine后面的就表示該表當(dāng)前用的存儲(chǔ)引擎):
mysql> show create table 表名;
另外換可以在創(chuàng)建表的時(shí)候在表名的后面跟engine=innodb 可以改變表的引擎
create table 庫名.表名 engine = innodb
可以在文件目錄當(dāng)中查看創(chuàng)建的文件格式
查看mysql存儲(chǔ)引擎命令,在mysql>提示符下搞入show engines;字段 Support為:Default表示默認(rèn)存儲(chǔ)引擎
2、設(shè)置InnoDB為默認(rèn)引擎:在配置文件my.cnf中的 [mysqld] 下面加入default-storage-engine=INNODB 一句
3、重啟mysql云服務(wù)器:service mysqld restart 登錄mysql數(shù)據(jù)庫,
1、“.frm”
主要存放表的數(shù)據(jù);包括定義表結(jié)構(gòu)信息,另外在每個(gè)表當(dāng)中都會(huì)有一個(gè)以表命名的.frm的文件,所有的文件存放在此文件夾下面
MyISAM數(shù)據(jù)庫表文件:.MYD文件:表數(shù)據(jù)文件;.MYI文件:索引文件
2、“.MYD”文件
myisam專門存放存儲(chǔ)引擎的專用文件
3、“.MYI”文件
“.MYI”文件也是專屬于MyISAM存儲(chǔ)引擎的,主要存放MyISAM表的索引相關(guān)信息。
InnoDB采用表空間(tablespace)來管理數(shù)據(jù),存儲(chǔ)表數(shù)據(jù)和索引。
.ibd文件:單表表空間文件,每個(gè)表使用一個(gè)表空間文件(file per table),存放用戶數(shù)據(jù)庫表數(shù)據(jù)和索引。
InnoDB共享表空間(即InnoDB文件集,ib-file set):ibdata1、ibdata2等,存儲(chǔ)InnoDB系統(tǒng)信息和用戶數(shù)據(jù)庫表數(shù)據(jù)和索引,所有表共用。
.idb和ibdata的區(qū)別:
.id兩者之間的優(yōu)缺點(diǎn)
共享表空間:
優(yōu)點(diǎn):
可以放表空間分成多個(gè)文件存放到各個(gè)磁盤上。數(shù)據(jù)和文件放在一起方便管理。
缺點(diǎn):
所有的數(shù)據(jù)和索引存放到一個(gè)文件中,多個(gè)表及索引在表空間中混合存儲(chǔ),這樣對(duì)于一個(gè)表做了大量刪除操作后表空間中將會(huì)有大量的空隙,特別是對(duì)于統(tǒng)計(jì)分析,日值系統(tǒng)這類應(yīng)用最不適合用共享表空間。
獨(dú)立表空間:
優(yōu)點(diǎn):
1.每個(gè)表都有自已獨(dú)立的表空間。
2.每個(gè)表的數(shù)據(jù)和索引都會(huì)存在自已的表空間中。
3.可以實(shí)現(xiàn)單表在不同的數(shù)據(jù)庫中移動(dòng)。
4.空間可以回收
b只能存放單獨(dú)的文件數(shù)據(jù),ibdata可以存放多的數(shù)據(jù)相當(dāng)一個(gè)共享文件夾
查看當(dāng)前的數(shù)據(jù)庫的表空間:
on代表獨(dú)立表空間;off代表共享表空間
那么修改下主配置文件來開啟共享表空間
可以先 du -h ibdata1 查看下
登錄mysql執(zhí)行mysql> show variables like '%innodb_file_per_table%';
這時(shí)新建的表就會(huì)使用共享表空間了。
創(chuàng)建一個(gè)數(shù)據(jù)庫testdb并新建一個(gè)表
drop procedure if exists test; =====> 刪除之前存在的文件
create procedure test() ========> 創(chuàng)建test文件
begin ================>開始
declare i int;=========> 通告i的類型
set i=1 ======> i的數(shù)值等于1
while i < 100000 do =====> i的值如果小于100000
insert into lxf.ttt(id) values (i); =======>插入數(shù)據(jù)變量為i
set i = i +1 ========> 每執(zhí)行一次之后i的值加1直到為99999
end while ======>循環(huán)結(jié)束
end &&結(jié)束
調(diào)用存儲(chǔ)過程:
查看標(biāo)的行數(shù)
查看表在表空間占用情況:
Replication相關(guān)文件:
1)master.info 文件:
master.info 文件存在于Slave 端的數(shù)據(jù)目錄下,里面存放了該Slave 的Master 端的相關(guān)信息,包括Master 的主機(jī)地址,連接用戶,連接密碼,連接端口,當(dāng)前日志位置,已經(jīng)讀取到的日志位置等信息。
2)relay log 和relay log index
mysql-relay-bin.xxxxxn文件用于存放Slave 端的I/O 線程從Master 端所讀取到的Binary Log 信息,然后由Slave 端的SQL 線程從該relay log 中讀取并解析相應(yīng)的日志信息,轉(zhuǎn)化成Master 所執(zhí)行的SQL 語句,然后在Slave 端應(yīng)用。
mysql-relay-bin.index文件的功能類似于mysql-bin.index,同樣是記錄日志的存放位置的絕對(duì)路徑,只不過他所記錄的不是Binary Log,而是Relay Log。
3)relay-log.info 文件:
類似于master.info,它存放通過Slave 的I/O 線程寫入到本地的relay log 的相關(guān)信
息。供Slave 端的SQL 線程以及某些管理操作隨時(shí)能夠獲取當(dāng)前復(fù)制的相關(guān)信息。
其他文件:
1)system config file
MySQL 的系統(tǒng)配置文件一般都是my.cnf,默認(rèn)存放在"/etc"目錄下,my.cnf文件中包含多種參數(shù)選項(xiàng)組(group),每一種參數(shù)組都通過中括號(hào)給定了固定的組名,如“[mysqld]”組中包括了mysqld服務(wù)啟動(dòng)時(shí)候的初始化參數(shù),“[client]”組中包含著客戶端工具程序可以讀取的參數(shù)。
2)pid file
pid file 是mysqld應(yīng)用程序環(huán)境下的一個(gè)進(jìn)程文件存放自己的pid號(hào)
3)socket file
socket 文件也是在Unix/Linux 環(huán)境下才有的,用戶在Unix/Linux 環(huán)境下客戶端連接可以不通過TCP/IP 網(wǎng)絡(luò)而直接使用Unix Socket 來連接MySQL。
mysql有兩種連接方式,常用的一般是tcp
mysql–hmysql主機(jī)ip -uroot -pxxx(可以遠(yuǎn)程連接,但是速度稍慢)
mysql-S /path/mysql.sock (只能試用與本地連接,但速度快)
以上關(guān)于mysql數(shù)據(jù)庫的特性以及參數(shù)性能詳細(xì)內(nèi)容,對(duì)大家有幫助嗎?如果想要了解更多相關(guān),可以繼續(xù)關(guān)注我們的行業(yè)資訊板塊。
分享標(biāo)題:mysql數(shù)據(jù)庫的特性以及參數(shù)性能
本文URL:http://aaarwkj.com/article34/igospe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、標(biāo)簽優(yōu)化、全網(wǎng)營銷推廣、關(guān)鍵詞優(yōu)化、動(dòng)態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)