MySql5.6性能優(yōu)化_第1頁
MySql5.6性能優(yōu)化_第2頁
MySql5.6性能優(yōu)化_第3頁
MySql5.6性能優(yōu)化_第4頁
MySql5.6性能優(yōu)化_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1. 目標(biāo)l 了解什么是優(yōu)化l 掌握優(yōu)化查詢的方法l 掌握優(yōu)化數(shù)據(jù)庫結(jié)構(gòu)的方法l 掌握優(yōu)化MySQL服務(wù)器的方法2. 什么是優(yōu)化?l 合理安排資源、調(diào)整系統(tǒng)參數(shù)使MySQL運(yùn)行更快、更節(jié)省資源。l 優(yōu)化是多方面的,包括查詢、更新、服務(wù)器等。l 原則:減少系統(tǒng)瓶頸,減少資源占用,增加系統(tǒng)的反應(yīng)速度。3. 數(shù)據(jù)庫性能參數(shù)l 使用SHOW STATUS語句查看MySQL數(shù)據(jù)庫的性能參數(shù) SHOW STATUS LIKE 'valuel 常用的參數(shù): Slow_queries 慢查詢次數(shù) Com_(CRUD) 操作的次數(shù) Uptime 上線時(shí)間4. 查詢優(yōu)化4.1. EXPLAIN在MySQL

2、中可以使用EXPLAIN查看SQL執(zhí)行計(jì)劃,用法:EXPLAIN SELECT * FROM tb_item4.2. 結(jié)果說明4.2.1. idSELECT識(shí)別符。這是SELECT查詢序列號(hào)。這個(gè)不重要。4.2.2. select_type表示SELECT語句的類型。有以下幾種值:1、 SIMPLE表示簡(jiǎn)單查詢,其中不包含連接查詢和子查詢。2、 PRIMARY表示主查詢,或者是最外面的查詢語句。3、 UNION表示連接查詢的第2個(gè)或后面的查詢語句。4、 DEPENDENT UNIONUNION中的第二個(gè)或后面的SELECT語句,取決于外面的查詢。5、 UNION RESULT連接查詢的結(jié)果。6

3、、 SUBQUERY子查詢中的第1個(gè)SELECT語句。7、 DEPENDENT SUBQUERY子查詢中的第1個(gè)SELECT語句,取決于外面的查詢。8、 DERIVEDSELECT(FROM 子句的子查詢)。4.2.3. table表示查詢的表。4.2.4. type(重要)表示表的連接類型。以下的連接類型的順序是從最佳類型到最差類型:1、 system表僅有一行,這是const類型的特列,平時(shí)不會(huì)出現(xiàn),這個(gè)也可以忽略不計(jì)。2、 const數(shù)據(jù)表最多只有一個(gè)匹配行,因?yàn)橹黄ヅ湟恍袛?shù)據(jù),所以很快,常用于PRIMARY KEY或者UNIQUE索引的查詢,可理解為const是最優(yōu)化的。3、 eq_r

4、efmysql手冊(cè)是這樣說的:"對(duì)于每個(gè)來自于前面的表的行組合,從該表中讀取一行。這可能是最好的聯(lián)接類型,除了const類型。它用在一個(gè)索引的所有部分被聯(lián)接使用并且索引是UNIQUE或PRIMARY KEY"。eq_ref可以用于使用=比較帶索引的列。4、 ref查詢條件索引既不是UNIQUE也不是PRIMARY KEY的情況。ref可用于=或<或>操作符的帶索引的列。5、 ref_or_null該聯(lián)接類型如同ref,但是添加了MySQL可以專門搜索包含NULL值的行。在解決子查詢中經(jīng)常使用該聯(lián)接類型的優(yōu)化。上面這五種情況都是很理想的索引使用情況。6、 inde

5、x_merge該聯(lián)接類型表示使用了索引合并優(yōu)化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長(zhǎng)的關(guān)鍵元素。7、 unique_subquery該類型替換了下面形式的IN子查詢的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一個(gè)索引查找函數(shù),可以完全替換子查詢,效率更高。8、 index_subquery該聯(lián)接類型類似于unique_subquery??梢蕴鎿QIN子查詢,但只適合下列形式的子查詢中的非唯一索引: value IN (S

6、ELECT key_column FROM single_table WHERE some_expr)9、 range只檢索給定范圍的行,使用一個(gè)索引來選擇行。10、 index該聯(lián)接類型與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因?yàn)樗饕募ǔ1葦?shù)據(jù)文件小。11、 ALL對(duì)于每個(gè)來自于先前的表的行組合,進(jìn)行完整的表掃描。(性能最差)4.2.5. possible_keys指出MySQL能使用哪個(gè)索引在該表中找到行。如果該列為NULL,說明沒有使用索引,可以對(duì)該列創(chuàng)建索引來提供性能。4.2.6. key顯示MySQL實(shí)際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL??梢詮?qiáng)制

7、使用索引或者忽略索引:4.2.7. key_len顯示MySQL決定使用的鍵長(zhǎng)度。如果鍵是NULL,則長(zhǎng)度為NULL。注意:key_len是確定了MySQL將實(shí)際使用的索引長(zhǎng)度。4.2.8. ref顯示使用哪個(gè)列或常數(shù)與key一起從表中選擇行。4.2.9. rows顯示MySQL認(rèn)為它執(zhí)行查詢時(shí)必須檢查的行數(shù)。4.2.10. Extra該列包含MySQL解決查詢的詳細(xì)信息· Distinct:MySQL發(fā)現(xiàn)第1個(gè)匹配行后,停止為當(dāng)前的行組合搜索更多的行。· Not exists:MySQL能夠?qū)Σ樵冞M(jìn)行LEFT JOIN優(yōu)化,發(fā)現(xiàn)1個(gè)匹配LEFT JOIN標(biāo)準(zhǔn)的行后,不再為

8、前面的的行組合在該表內(nèi)檢查更多的行。· range checked for each record (index map: #):MySQL沒有發(fā)現(xiàn)好的可以使用的索引,但發(fā)現(xiàn)如果來自前面的表的列值已知,可能部分索引可以使用。· Using filesort:MySQL需要額外的一次傳遞,以找出如何按排序順序檢索行。· Using index:從只使用索引樹中的信息而不需要進(jìn)一步搜索讀取實(shí)際的行來檢索表中的列信息。· Using temporary:為了解決查詢,MySQL需要?jiǎng)?chuàng)建一個(gè)臨時(shí)表來容納結(jié)果。· Using where:WHERE 子句

9、用于限制哪一個(gè)行匹配下一個(gè)表或發(fā)送到客戶。· Using sort_union(.), Using union(.), Using intersect(.):這些函數(shù)說明如何為index_merge聯(lián)接類型合并索引掃描。· Using index for group-by:類似于訪問表的Using index方式,Using index for group-by表示MySQL發(fā)現(xiàn)了一個(gè)索引,可以用來查 詢GROUP BY或DISTINCT查詢的所有列,而不要額外搜索硬盤訪問實(shí)際的表。4.3. 使用索引查詢需要注意索引可以提供查詢的速度,但并不是使用了帶有索引的字段查詢都會(huì)生

10、效,有些情況下是不生效的,需要注意!4.3.1. 使用LIKE關(guān)鍵字的查詢?cè)谑褂肔IKE關(guān)鍵字進(jìn)行查詢的查詢語句中,如果匹配字符串的第一個(gè)字符為“%”,索引不起作用。只有“%”不在第一個(gè)位置,索引才會(huì)生效。4.3.2. 使用聯(lián)合索引的查詢MySQL可以為多個(gè)字段創(chuàng)建索引,一個(gè)索引可以包括16個(gè)字段。對(duì)于聯(lián)合索引,只有查詢條件中使用了這些字段中第一個(gè)字段時(shí),索引才會(huì)生效。4.3.3. 使用OR關(guān)鍵字的查詢查詢語句的查詢條件中只有OR關(guān)鍵字,且OR前后的兩個(gè)條件中的列都是索引時(shí),索引才會(huì)生效,否則,索引不生效。4.4. 子查詢優(yōu)化MySQL從4.1版本開始支持子查詢,使用子查詢進(jìn)行SELECT語句

11、嵌套查詢,可以一次完成很多邏輯上需要多個(gè)步驟才能完成的SQL操作。子查詢雖然很靈活,但是執(zhí)行效率并不高。執(zhí)行子查詢時(shí),MYSQL需要?jiǎng)?chuàng)建臨時(shí)表,查詢完畢后再刪除這些臨時(shí)表,所以,子查詢的速度會(huì)受到一定的影響。優(yōu)化:可以使用連接查詢(JOIN)代替子查詢,連接查詢時(shí)不需要建立臨時(shí)表,其速度比子查詢快。5. 數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化一個(gè)好的數(shù)據(jù)庫設(shè)計(jì)方案對(duì)于數(shù)據(jù)庫的性能往往會(huì)起到事半功倍的效果。需要考慮數(shù)據(jù)冗余、查詢和更新的速度、字段的數(shù)據(jù)類型是否合理等多方面的內(nèi)容。5.1. 將字段很多的表分解成多個(gè)表對(duì)于字段較多的表,如果有些字段的使用頻率很低,可以將這些字段分離出來形成新表。因?yàn)楫?dāng)一個(gè)表的數(shù)據(jù)量很大時(shí),

12、會(huì)由于使用頻率低的字段的存在而變慢。5.2. 增加中間表對(duì)于需要經(jīng)常聯(lián)合查詢的表,可以建立中間表以提高查詢效率。通過建立中間表,將需要通過聯(lián)合查詢的數(shù)據(jù)插入到中間表中,然后將原來的聯(lián)合查詢改為對(duì)中間表的查詢。5.3. 增加冗余字段設(shè)計(jì)數(shù)據(jù)表時(shí)應(yīng)盡量遵循范式理論的規(guī)約,盡可能的減少冗余字段,讓數(shù)據(jù)庫設(shè)計(jì)看起來精致、優(yōu)雅。但是,合理的加入冗余字段可以提高查詢速度。表的規(guī)范化程度越高,表和表之間的關(guān)系越多,需要連接查詢的情況也就越多,性能也就越差。注意:冗余字段的值在一個(gè)表中修改了,就要想辦法在其他表中更新,否則就會(huì)導(dǎo)致數(shù)據(jù)不一致的問題。6. 插入數(shù)據(jù)的優(yōu)化插入數(shù)據(jù)時(shí),影響插入速度的主要是索引、唯一

13、性校驗(yàn)、一次插入的數(shù)據(jù)條數(shù)等。插入數(shù)據(jù)的優(yōu)化,不同的存儲(chǔ)引擎優(yōu)化手段不一樣,在MySQL中常用的存儲(chǔ)引擎有,MyISAM和InnoDB,兩者的區(qū)別:6.1. MyISAM6.1.1. 禁用索引對(duì)于非空表,插入記錄時(shí),MySQL會(huì)根據(jù)表的索引對(duì)插入的記錄建立索引。如果插入大量數(shù)據(jù),建立索引會(huì)降低插入數(shù)據(jù)速度。為了解決這個(gè)問題,可以在批量插入數(shù)據(jù)之前禁用索引,數(shù)據(jù)插入完成后再開啟索引。禁用索引的語句:ALTER TABLE table_name DISABLE KEYS開啟索引語句:ALTER TABLE table_name ENABLE KEYS對(duì)于空表批量插入數(shù)據(jù),則不需要進(jìn)行操作,因?yàn)镸y

14、ISAM引擎的表是在導(dǎo)入數(shù)據(jù)后才建立索引。6.1.2. 禁用唯一性檢查唯一性校驗(yàn)會(huì)降低插入記錄的速度,可以在插入記錄之前禁用唯一性檢查,插入數(shù)據(jù)完成后再開啟。禁用唯一性檢查的語句:SET UNIQUE_CHECKS = 0;開啟唯一性檢查的語句:SET UNIQUE_CHECKS = 1;6.1.3. 批量插入數(shù)據(jù)插入數(shù)據(jù)時(shí),可以使用一條INSERT語句插入一條數(shù)據(jù),也可以插入多條數(shù)據(jù)。第二種方式的插入速度比第一種方式快。6.1.4. 使用LOAD DATA INFILE當(dāng)需要批量導(dǎo)入數(shù)據(jù)時(shí),使用LOAD DATA INFILE語句比INSERT語句插入速度快很多。6.2. InnoDB6.2

15、.1. 禁用唯一性檢查用法和MyISAM一樣。6.2.2. 禁用外鍵檢查插入數(shù)據(jù)之前執(zhí)行禁止對(duì)外鍵的檢查,數(shù)據(jù)插入完成后再恢復(fù),可以提供插入速度。禁用:SET foreign_key_checks = 0;開啟:SET foreign_key_checks = 1;6.2.3. 禁止自動(dòng)提交插入數(shù)據(jù)之前執(zhí)行禁止事務(wù)的自動(dòng)提交,數(shù)據(jù)插入完成后再恢復(fù),可以提供插入速度。禁用:SET autocommit = 0;開啟:SET autocommit = 1;7. 服務(wù)器優(yōu)化7.1. 優(yōu)化服務(wù)器硬件服務(wù)器的硬件性能直接決定著MySQL數(shù)據(jù)庫的性能,硬件的性能瓶頸,直接決定MySQL數(shù)據(jù)庫的運(yùn)行速度和效率。需要從以下幾個(gè)方面考慮:1、 配置較大的內(nèi)存。足夠大的內(nèi)存,是提高M(jìn)ySQL數(shù)據(jù)庫性能的方法之一。內(nèi)存的IO比硬盤快的多,可以增加系統(tǒng)的緩沖區(qū)容量,使數(shù)據(jù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論