新聞中心
此文章主要向大家描述的是MySQL查詢(xún)優(yōu)化系列之MySQL查詢(xún)優(yōu)化器,當(dāng)你在對(duì)一查詢(xún)進(jìn)行提交的時(shí)候,MySQL數(shù)據(jù)庫(kù)會(huì)對(duì)它進(jìn)行分析,主要是看其是否可以用來(lái)做一些優(yōu)化使處理該查詢(xún)的速度更快。

這一部分將介紹查詢(xún)優(yōu)化器是如何工作的。如果你想知道MySQL(和PHP搭配之***組合)采用的優(yōu)化手段,可以查看MySQL(和PHP搭配之***組合)參考手冊(cè)。
當(dāng)然,MySQL(和PHP搭配之***組合)查詢(xún)優(yōu)化器也利用了索引,但是它也使用了其它一些信息。例如,如果你提交如下所示的查詢(xún),那么無(wú)論數(shù)據(jù)表有多大,MySQL(和PHP搭配之***組合)執(zhí)行它的速度都會(huì)非常快:
- SELECT * FROM tbl_name WHERE 0;
在這個(gè)例子中,MySQL(和PHP搭配之***組合)查看WHERE子句,認(rèn)識(shí)到?jīng)]有符合查詢(xún)條件的數(shù)據(jù)行,因此根本就不考慮搜索數(shù)據(jù)表。你可以通過(guò)提供一個(gè)EXPLAIN語(yǔ)句看到這種情況,這個(gè)語(yǔ)句讓MySQL(和PHP搭配之***組合)顯示自己執(zhí)行的但實(shí)際上沒(méi)有真正地執(zhí)行的SELECT查詢(xún)的一些信息。如果要使用EXPLAIN,只需要在EXPLAIN單詞放在SELECT語(yǔ)句的前面:
- MySQL(和PHP搭配之***組合)> EXPLAIN SELECT * FROM tbl_name WHERE 0\G
- id: 1
- select_type: SIMPLE
- table: NULL
- type: NULL
- possible_keys: NULL
- key: NULL
- key_len: NULL
- ref: NULL
- rows: NULL
- Extra: Impossible WHERE
通常情況下,EXPLAIN返回的信息比上面的信息要多一些,還包括用于掃描數(shù)據(jù)表的索引、使用的聯(lián)結(jié)類(lèi)型、每張數(shù)據(jù)表中估計(jì)需要檢查的數(shù)據(jù)行數(shù)量等非空(NULL)信息。
優(yōu)化器是如何工作的
MySQL(和PHP搭配之***組合)查詢(xún)優(yōu)化器有幾個(gè)目標(biāo),但是其中最主要的目標(biāo)是盡可能地使用索引,并且使用最嚴(yán)格的索引來(lái)消除盡可能多的數(shù)據(jù)行。你的最終目標(biāo)是提交SELECT語(yǔ)句查找數(shù)據(jù)行,而不是排除數(shù)據(jù)行。
優(yōu)化器試圖排除數(shù)據(jù)行的原因在于它排除數(shù)據(jù)行的速度越快,那么找到與條件匹配的數(shù)據(jù)行也就越快。如果能夠首先進(jìn)行最嚴(yán)格的測(cè)試,查詢(xún)就可以執(zhí)行地更快。假設(shè)你的查詢(xún)檢驗(yàn)了兩個(gè)數(shù)據(jù)列,每個(gè)列上都有索引:
- SELECT col3 FROM mytable
- WHERE col1 = ’some value’ AND col2 = ’some other value’;
假設(shè)col1上的測(cè)試匹配了900個(gè)數(shù)據(jù)行,col2上的測(cè)試匹配了300個(gè)數(shù)據(jù)行,而同時(shí)進(jìn)行的測(cè)試只得到了30個(gè)數(shù)據(jù)行。先測(cè)試Col1會(huì)有900個(gè)數(shù)據(jù)行,需要檢查它們找到其中的30個(gè)與col2中的值匹配記錄,其中就有870次是失敗了。
先測(cè)試col2會(huì)有300個(gè)數(shù)據(jù)行,需要檢查它們找到其中的30個(gè)與col1中的值匹配的記錄,只有270次是失敗的,因此需要的計(jì)算和磁盤(pán)I/O更少。其結(jié)果是,優(yōu)化器會(huì)先測(cè)試col2,因?yàn)檫@樣做開(kāi)銷(xiāo)更小。
以上的相關(guān)內(nèi)容就是對(duì)MySQL查詢(xún)優(yōu)化系列講座之查詢(xún)優(yōu)化器的介紹,望你能有所收獲。
【編輯推薦】
- MySQL AUTO_INCREMENT的正確用法
- MySQL數(shù)據(jù)庫(kù)在linux下遠(yuǎn)程的連接錯(cuò)誤
- MySQL5中的字符集問(wèn)題與破解方案
- MySQL數(shù)據(jù)庫(kù)與表的最基本命令大盤(pán)點(diǎn)
- MySQL全文搜索索引的字段作用
當(dāng)前文章:MySQL查詢(xún)優(yōu)化系列之MySQL查詢(xún)優(yōu)化器
網(wǎng)站路徑:http://m.fisionsoft.com.cn/article/ccshgjp.html


咨詢(xún)
建站咨詢(xún)
