MySQL 优化 —— SQL优化概述(优化专题开篇词)
引言
最近為了研究索引的知識(shí),特地去MySQL 官網(wǎng)研讀了一番,發(fā)現(xiàn)MySQL官網(wǎng)有比較全面的MySQL優(yōu)化方案和知識(shí)背景,所以希望通過(guò)一系列文章,將官網(wǎng)的知識(shí)翻譯總結(jié)一下,避免日后去網(wǎng)上胡亂搜索產(chǎn)生不必要的知識(shí)勘誤風(fēng)險(xiǎn)。
本系列文章標(biāo)題都會(huì)以 “MySQL 優(yōu)化” 前綴開(kāi)頭,有些可能是翻譯,也會(huì)有少量自己的總結(jié)和試驗(yàn),針對(duì) MySQL 5.7 版本進(jìn)行。當(dāng)然也并不會(huì)全部將官網(wǎng)的優(yōu)化專(zhuān)題翻譯完,可能會(huì)挑選我自己認(rèn)為比較重點(diǎn)的部分進(jìn)行翻譯和總結(jié)。
我的翻譯文章大多數(shù)都沒(méi)有精推細(xì)敲的進(jìn)行翻譯,可能有人會(huì)比較失望,但考慮到我的工作狀態(tài)和時(shí)間不允許我過(guò)度的專(zhuān)注于翻譯工作,不過(guò)我依然會(huì)秉承最質(zhì)樸的求真精神,把翻譯工作做好。同時(shí),為了避免個(gè)人英語(yǔ)水平對(duì)原文知識(shí)的誤讀,我會(huì)在每篇翻譯文章的引言部分貼出原文的 URL 方便他人去查閱和對(duì)比閱讀增加知識(shí)的準(zhǔn)確性,同時(shí)我更希望能有人站出來(lái)指正我的錯(cuò)別字和翻譯問(wèn)題。
再次強(qiáng)調(diào)一下我的翻譯風(fēng)格,并不是精推細(xì)敲型,會(huì)以一種比較松散但并不丟失原意的方式來(lái)翻譯MySQL官方文檔。如下是我的翻譯示例:
原文:To make a slow?SELECT ... WHERE?query faster, the first thing to check is whether you can add an index.
我的翻譯:為了讓一個(gè) SELECT ... WHERE 執(zhí)行的更快,第一件需要考慮的事情就是——我們是否可以為其建立索引。
這就是——“比較松散,但無(wú)傷原意”,希望大家多多指正。
以下部分翻譯自MySQL官網(wǎng):https://dev.mysql.com/doc/refman/5.7/en/select-optimization.html
SQL優(yōu)化需要考慮的方面
查詢(xún),以 SELECT 子句的形式,執(zhí)行著對(duì)數(shù)據(jù)庫(kù)的全部查找操作。調(diào)試這些語(yǔ)句是優(yōu)先級(jí)最高的,不論是在動(dòng)態(tài)web頁(yè)面實(shí)現(xiàn)次秒級(jí)別的響應(yīng),還是縮短生成大量夜間報(bào)告的時(shí)間,都是如此。
除了 SELECT 語(yǔ)句,這些用于查詢(xún)性能優(yōu)化的調(diào)試技術(shù)同樣會(huì)應(yīng)用于構(gòu)建諸如 CREATE TABLE... AS SELECT, INSERT INTO ...SELECT, 和 DELETE 語(yǔ)句中的 WHERE 子句等。這些語(yǔ)句需要額外的性能考慮,這是因?yàn)樗麄兘Y(jié)合了寫(xiě)和讀的操作。
最主要的性能優(yōu)化考慮有如下這些:
1、為了讓一個(gè) SELECT ... WHERE 執(zhí)行的更快,第一件需要考慮的事情就是——我們是否可以為其建立索引。給?WHERE 子句中的字段建立索引,以此來(lái)加速求值、過(guò)濾以及對(duì)結(jié)果集進(jìn)行的最終檢索。為了避免浪費(fèi)磁盤(pán)空間,構(gòu)建一個(gè)“小集合”式的復(fù)合索引來(lái)加速許多相關(guān)的查詢(xún)。(博主:意思是復(fù)合索引不僅可以減少對(duì)磁盤(pán)空間的過(guò)度占用,同時(shí)也可以支持許多相關(guān)的查詢(xún),因此,不要?jiǎng)?chuàng)建太多的單一索引,可以用復(fù)合索引的地方,要優(yōu)先考慮復(fù)合索引)
索引在涉及使用諸如 join 和 外鍵等的多表查詢(xún)時(shí)尤其重要。你可以使用 EXPLAIN 語(yǔ)句來(lái)判斷在 SELECT 中究竟用到了哪種索引。
2、單獨(dú)調(diào)試非常耗時(shí)的查詢(xún)的每一個(gè)部分,如MySQL函數(shù)調(diào)用等。一個(gè)函數(shù)可以被結(jié)果集中的每條記錄執(zhí)行一遍,也可以被表表中的每條記錄執(zhí)行一遍,這取決于查詢(xún)的結(jié)構(gòu),即我們?nèi)绾螛?gòu)建我們的查詢(xún)語(yǔ)句。
3、盡量減少查詢(xún)中全表掃描的次數(shù),特別是大表。
4、定期使用 ANALYZE TABLE 語(yǔ)句來(lái)進(jìn)行表統(tǒng)計(jì),這樣SQL優(yōu)化器才可以有更多的信息來(lái)構(gòu)建有效的執(zhí)行計(jì)劃。
5、學(xué)習(xí)調(diào)試技術(shù),索引技術(shù),和配置參數(shù),它們都是特定于每張表的存儲(chǔ)引擎的。InnoDB和MyISAM 都有一系列的教程來(lái)使我們的查詢(xún)保持更高的性能。
6、調(diào)整MySQL用于緩存的內(nèi)存區(qū)域大小和配置。以有效的方式使用 InnoDB buffer pool,MyISAM key cache,和 MySQL 查詢(xún)緩存,重復(fù)的查詢(xún)之所以會(huì)運(yùn)行的更快,是因?yàn)榈诙沃蠖际菑膬?nèi)存中獲取數(shù)據(jù)的。
7、即便是使用內(nèi)存作為緩存的查詢(xún),你可能依然需要更深入的優(yōu)化以便使它們需要更少的緩存內(nèi)存,讓你的應(yīng)用程序具備更好的可擴(kuò)展性。可擴(kuò)展性意味著你的應(yīng)用程序可以處理更多同時(shí)訪問(wèn)的用戶(hù),更大的請(qǐng)求量,而不會(huì)產(chǎn)生比較大的性能落差。
8、處理鎖的相關(guān)問(wèn)題。在你的查詢(xún)速度可能會(huì)被其他同時(shí)訪問(wèn)表的?session 影響到的地方處理鎖的問(wèn)題。
我的總結(jié)
總的來(lái)說(shuō),本篇概述的翻譯工作還算順利,當(dāng)然非常感謝有道詞典對(duì)我的幫助,越到后面的部分,翻譯工作越順利,查詞典的次數(shù)也越來(lái)越少。不得不說(shuō)多看英文文檔對(duì)自己的提升也是很大的,不僅可以獲得最權(quán)威的技術(shù)解讀,同時(shí)對(duì)英語(yǔ)閱讀也有很大幫助。
針對(duì)上面的 8 個(gè)方面,我個(gè)人認(rèn)為比較重要的是其中的第 1、5,其中第一條應(yīng)該是占據(jù)程序員優(yōu)化的大部分工作,因此我會(huì)對(duì)這一專(zhuān)題進(jìn)行著重翻譯和總結(jié),其他的部分我也會(huì)根據(jù)情況和實(shí)際工作中的需要(開(kāi)發(fā)方面,非專(zhuān)業(yè)DBA)酌情處理,希望大家可以給予更多的意見(jiàn)和建議。
總結(jié)
以上是生活随笔為你收集整理的MySQL 优化 —— SQL优化概述(优化专题开篇词)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 透彻理解回文~单链表的逆序~
- 下一篇: linux cmake编译源码,linu