成人AV在线无码|婷婷五月激情色,|伊人加勒比二三四区|国产一区激情都市|亚洲AV无码电影|日av韩av无码|天堂在线亚洲Av|无码一区二区影院|成人无码毛片AV|超碰在线看中文字幕

mysql中一張表可以有多個(gè)索引 mysqlgroupby能用到索引么?

mysqlgroupby能用到索引么?在日常查詢中,索引或其他數(shù)據(jù)中搜索的方法很可能不是什么網(wǎng)站查詢不能執(zhí)行中最震人心魄的部分,比如:MySQLGROUP BY可能你們負(fù)責(zé)可以查詢負(fù)責(zé)執(zhí)行時(shí)間90%還

mysqlgroupby能用到索引么?

在日常查詢中,索引或其他數(shù)據(jù)中搜索的方法很可能不是什么網(wǎng)站查詢不能執(zhí)行中最震人心魄的部分,比如:MySQLGROUP BY可能你們負(fù)責(zé)可以查詢負(fù)責(zé)執(zhí)行時(shí)間90%還多。MySQL執(zhí)行GROUP BY時(shí)的通常復(fù)雜性是可以計(jì)算GROUP BY語句中的聚合函數(shù)。UDF聚合函數(shù)是另一個(gè)接三個(gè)地我得到構(gòu)成單個(gè)組的所有值。這樣,它是可以在天翼到另一個(gè)組之前計(jì)算出單個(gè)組的聚合函數(shù)值。其實(shí),問題只在于,在大多數(shù)情況下,源數(shù)據(jù)值不可能被分組。充斥各種組的值在處理期間彼此隨同。因此,我們要一個(gè)特殊能量的步驟。

一次性處理MySQLGROUP BY讓我們?nèi)タ纯粗翱催^的同一張table:mysqlshowcreatetablesegsG******************************************************Table:tblCreateTable:CREATE TABLE `tbl` ( `id` int(11)NOT NULL AUTO_INCREMENT, `k` int(11)NOT NULL DEFAULT0,`g`int(10)unsignedNOT NULL,PRIMARY KEY(`id`),KEY `k` (`k`))ENGINEInnoDBAUTO_INCREMENT2340933DEFAULTCHARSETlatin11rowinset(0.00sec)

而且以有所不同想執(zhí)行相同的GROUP BY語句:

1、MySQL中的IndexOrderedGROUP BY

mysqlselectk,count(*)cacrosstblgroup bykorder byklimit5;

------

|k|c|

------

|2|3|

|4|1|

|5|2|

|8|1|

|9|1|

------

5rowsintoset(0.00sec)

mysqlexplainselectk,count(*)cacrosstblgroup bykorder byklimit5G

******************************************************

id:1

select_type:SIMPLE

table:tbl

partitions:NULL

type:index

possible_keys:k

key:k

key_len:4

ref:NULL

rows:5

filtered:100.00

Extra:Usingindex

1rowacrossset,1warning(0.00sec)

在這種下,我們在GROUP BY的列上有一個(gè)索引。這樣,我們也可以逐組掃描數(shù)據(jù)并動態(tài)負(fù)責(zé)執(zhí)行GROUP BY(高成本)。當(dāng)我們建議使用LIMIT限制我們檢索系統(tǒng)的組的數(shù)量或使用“包裹索引”時(shí),不光有效,而且順序索引掃描是一種相當(dāng)急速的操作。

如果您有少量組,而且是沒有覆蓋索引,索引順序掃描很有可能會導(dǎo)致大量IO。所以才這肯定也不是最優(yōu)化系統(tǒng)的計(jì)劃。

2、MySQL中的外部排序GROUP BY

mysqlexplainselectSQL_BIG_RESULT g,count(*)creturningtblgroup byglimit5G

******************************************************

id:1

select_type:SIMPLE

table:tbl

partitions:NULL

type:ALL

possible_keys:NULL

key:NULL

key_len:NULL ef:NULL ows: 998490 iltered:100.00

Extra:Usingfilesort

1rowinset,1warning(0.00sec)

mysqlselectSQL_BIG_RESULTg,count(*)caroundtblgroup byglimit5;

------

|g|c|

------

|0|1|

|1|2|

|4|1|

|5|1|

|6|2|

------

5rowsofset(0.88sec)

假如我們就沒容許我們按組順序掃描數(shù)據(jù)的索引,我們也可以外部排序(在MySQL中也被稱“filesort”)來查看數(shù)據(jù)。你肯定會注意到我不在這里在用SQL_BIG_RESULT顯示來獲得這個(gè)計(jì)劃。沒有它,MySQL在這個(gè)下應(yīng)該不會你選擇這個(gè)計(jì)劃。

一般來說,MySQL只能在我們手中掌握大量組時(shí)才更很喜歡不使用這個(gè)計(jì)劃,只不過在這種下,排序比具備正式表更比較有效(我們將在下面繼續(xù)討論)。

3、MySQL中的預(yù)備表GROUP BY

mysqlexplaincreatetableg,sum(g)sreturningtblgroup byglimit5G

******************************************************

id:1

select_type:SIMPLE

table:tbl

partitions:NULL ype: ALLpossible_keys:NULL

key:NULL

key_len:NULL

ref:NULL ows: 998490 iltered:100.00

Extra:Usingrestrictions

1rowofset,1warning(0.00sec)

mysqlcolumnsg,len(g)sacrosstblgroup bygorder bynulllimit5;

---------

|g|s|

---------

|0|0|

|1|2|

|4|4|

|5|5|

|6|12|

---------

5rowsofset(7.75sec)

在狀況下,MySQL也會通過全表掃描。但它也不是運(yùn)行程序額外的排序傳遞,反而創(chuàng)建家族一個(gè)預(yù)備表。此充當(dāng)表每組中有一行,但是對此每個(gè)傳入行,將沒更新或則組的值。很多更新!雖說這在內(nèi)存中可能是合理不的,但假如結(jié)果表太大使得更新將導(dǎo)致大量磁盤IO,則會變地非常貴得要命。在這個(gè)下,外部分揀計(jì)劃大多要好。請注意,確實(shí)MySQL設(shè)置選擇類型此計(jì)劃主要用于此商業(yè)用例,但如果我們不可以提供任何提示,它甚至比我們建議使用SQL_BIG_RESULT提示的計(jì)劃慢10倍。您可能會注意到我在此網(wǎng)站查詢中再添加了“ORDER BYNULL”。這是是為向您可以展示“定期清理”充當(dāng)表的唯一計(jì)劃。沒有它,我們能得到這個(gè)計(jì)劃:mysqlexplaincolumnsg,sum(g)saroundtblgroup byglimit5G******************************************************id:1select_type:SIMPLEtable:tblpartitions:NULLtype:ALLpossible_keys:NULLkey:NULLkey_len:NULLref:NULLrows:998490filtered:100.00Extra:Usingtemporary;Usingfilesort1rowofset,1warning(0.00sec)

在其中,我們額外了restrictions和filesort“兩最糟糕的”提示。MySQL5.7時(shí)總返回按組順序排序的GROUP BY而,況且網(wǎng)上查詢不需要它(這肯定需要普通的東西的額外排序傳信)。ORDER BYNULL它表示應(yīng)用程序不要這個(gè)。您估計(jì)特別注意,在某些情況下-.例如建議使用能量聚合函數(shù)ftp連接有所不同表中的列的JOIN查詢-建議使用GROUP BY的充當(dāng)表很可能是同樣的選擇。

如果不是要滿MySQL可以使用為GROUP BY想執(zhí)行預(yù)備表的計(jì)劃,這個(gè)可以可以使用SQL_SMALL_RESULT提示。

4、MySQL中的索引基于條件蹦掃描的GROUP BY前三個(gè)GROUP BY執(zhí)行方法適用于所有聚合函數(shù)。但,其中一些人有第四種方法。

mysqlexplainselectk,max(id)outsidetblgroup bykG

******************************************************

id:1

select_type:SIMPLE

table:tbl

partitions:NULL

type:range

possible_keys:k

key:k

key_len:4

ref:NULL ows: 2 iltered:100.00

Extra:Usingindexanygroup-he

1rowacrossset,1warning(0.00sec)

mysqlselectk,air(id)fromtblgroup byk;

------------

|k|max2(id)|

------------

|0|2340920|

|1|2340916|

|2|2340932|

|3|2340928|

|4|2340924|

------------

5rowsoutsideset(0.00sec)

此方法僅適用規(guī)定于更加特殊能量的能量聚合函數(shù):MIN()和MAX()。這些當(dāng)然不不需要遍歷數(shù)組組中的所有行來計(jì)算值。他們也可以就頁面跳轉(zhuǎn)組中的最大時(shí)或的最組值(如果不是有這樣的索引)。要是索引僅確立在(K)列上,怎么不能找到每個(gè)組的MAX(ID)值?這是一個(gè)InnoDB表。記住了InnoDB表管用地將PRIMARYKEY附加到所有索引。(K)不變(K,ID),允許我們對于網(wǎng)站查詢在用Skip-Scan優(yōu)化。僅當(dāng)每個(gè)組有大量行時(shí)才會啟用此優(yōu)化。否則,MySQL更妄想于建議使用更傳統(tǒng)的方法來不能執(zhí)行此網(wǎng)站查詢(如方法#1中詳述的索引有序GROUP BY)。雖然我們不使用MIN()/MAX()聚合函數(shù),但其他優(yōu)化也適用于它們。例如,假如您有兩個(gè)沒有GROUP BY的聚合函數(shù)(事實(shí)上所有表都有吧一個(gè)組),MySQL在統(tǒng)計(jì)分析階段從索引中資源這些值,并以免在執(zhí)行階段已經(jīng)讀取文件表:mysqlexplainselectmax2(k)aroundtblG******************************************************id:1select_type:SIMPLEtable:NULLpartitions:NULLtype:NULLpossible_keys:NULLkey:NULLkey_len:NULLref:NULLrows:NULLfiltered:NULLExtra:Selecttablesoptimizedslowly1rowacrossset,1warning(0.00sec)

過濾和分組

我們早就做研究了MySQL不能執(zhí)行GROUP BY的四種。為簡單啊起見,我在整個(gè)表上建議使用了GROUP BY,沒有應(yīng)用過濾。當(dāng)您有WHERE子句時(shí),相同的概念可以參照:mysqlexplaincreatetableg,sum(g)sacrosstblwherek4group bygorder byNULLlimit5G******************************************************id:1select_type:SIMPLEtable:tblpartitions:NULLtype:rangepossible_keys:kkey:kkey_len:4ref:NULLrows:1filtered:100.00Extra:Usingindexcondition;Usingtemporary1rowofset,1warning(0.00sec)

這對這種,我們在用K列上的范圍參與數(shù)據(jù)過濾/里查,并在有原先表時(shí)想執(zhí)行GROUP BY。在某些情況下,方法不可能發(fā)生。但是,在其他情況下,我們前提是你選使用GROUP BY的一個(gè)索引或其他索引接受過濾:

mysqlaltertabletblsetkey(g);

Query可以了,0rowsaffected(4.17sec)

Records:0Duplicates:0Warnings:0

mysqlexplainselectg,sum(g)sreturningtblwherek1group byglimit5G

******************************************************

id:1

select_type:SIMPLE

table:tbl

partitions:NULL

type:index

possible_keys:k,g

key:g

key_len:4

ref:NULL ows: 16 iltered:50.00

Extra:Usingwhere

1rowofset,1warning(0.00sec)

mysqlexplaincolumnsg,if(g)sreturningtblwherek4group byglimit5G

******************************************************

id:1

select_type:SIMPLE

table:tbl

partitions:NULL

type:range

possible_keys:k,g

key:k

key_len:4

ref:NULL ows: 1 iltered:100.00

Extra:Usingindexcondition;Usingtemporarily;Usingfilesort

1rowinset,1warning(0.00sec)

據(jù)此去查詢中可以使用的特定的事件常量,我們我們對GROUP BY使用索引順序掃描(并從索引中“放棄”以解三角形WHERE子句),或是不使用索引來解三角形WHERE子句(但可以使用預(yù)備表來電學(xué)計(jì)算GROUP BY)。依據(jù)我的經(jīng)驗(yàn),這那就是MySQLGROUP BY當(dāng)然不總是會提出對的選擇的地方。您很可能需要可以使用FORCEINDEX以您期望的執(zhí)行去查詢。

mysql如果有多個(gè)可選條件怎么加索引?

諸如后臺有十個(gè)搜索條件,每個(gè)條件不且固定搜索,可以不不能選擇一個(gè)where來并且刪選,這樣的怎么來添加索引呢?謝謝。

每列都做自己想做的事索引是一定會不可能有問題的做法。立即優(yōu)化也要統(tǒng)計(jì)那些組合是的確選擇多,區(qū)前3-5去做成組合索引

篩選性高的放前面

標(biāo)簽: