新聞中心
在基于規(guī)則的路徑選擇之后,如果存在多個(gè)可以選擇的路徑,那么 OceanBase 數(shù)據(jù)庫(kù)會(huì)計(jì)算每個(gè)路徑的代價(jià),并從中選擇代價(jià)最小的路徑作為最終選擇的路徑。

10年的惠陽(yáng)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整惠陽(yáng)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“惠陽(yáng)網(wǎng)站設(shè)計(jì)”,“惠陽(yáng)網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
OceanBase 數(shù)據(jù)庫(kù)的代價(jià)模型考慮了 CPU 代價(jià)(比如處理一個(gè)謂詞的 CPU 開銷)和 IO 代價(jià)(比如順序、隨機(jī)讀取宏塊和微塊的代價(jià)),CPU 代價(jià)和 IO 代價(jià)最終相加得到一個(gè)總的代價(jià)。
在 OceanBase 數(shù)據(jù)庫(kù)中,每個(gè)訪問(wèn)路徑的代價(jià)會(huì)在執(zhí)行計(jì)劃中都會(huì)展示出來(lái)。如下例所示:
obclient>CREATE TABLE t1(a INT PRIMARY KEY, b INT, c INT, INDEX k1(b));
Query OK, 0 rows affected (0.35 sec)
/*主表路徑的代價(jià)*/
obclient>EXPLAIN SELECT/*+INDEX(t1 PRIMARY)*/ * FROM t1 WHERE b < 10;
+-----------------------------------------------------------------+
| Query Plan |
+-----------------------------------------------------------------+
| ===================================
|ID|OPERATOR |NAME|EST. ROWS|COST|
-----------------------------------
|0 |TABLE SCAN|t1 |200 |622 |
===================================
Outputs & filters:
-------------------------------------
0 - output([t1.a], [t1.b], [t1.c]), filter([t1.b < 10]),
access([t1.b], [t1.a], [t1.c]), partitions(p0)
/* k1 路徑的代價(jià)*/
obclient> EXPLAIN SELECT/*+INDEX(t1 k1)*/ * FROM t1 WHERE b < 10;
+--------------------------------------------------------------------+
| Query Plan |
+--------------------------------------------------------------------+
| =====================================
|ID|OPERATOR |NAME |EST. ROWS|COST|
-------------------------------------
|0 |TABLE SCAN|t1(k1)|200 |1114|
=====================================
Outputs & filters:
-------------------------------------
0 - output([t1.a], [t1.b], [t1.c]), filter(nil),
access([t1.b], [t1.a], [t1.c]), partitions(p0)對(duì)于一個(gè)訪問(wèn)路徑,它的代價(jià)主要由掃描訪問(wèn)路徑的代價(jià)和回表的代價(jià)兩部分組成。如果一個(gè)訪問(wèn)路徑不需要回表,那么就沒(méi)有回表的代價(jià)。
在 OceanBase 數(shù)據(jù)庫(kù)中,訪問(wèn)路徑的代價(jià)取決于很多因素,比如掃描的行數(shù)、回表的行數(shù)、投影的列數(shù)和謂詞的個(gè)數(shù)等。但是對(duì)于訪問(wèn)路徑來(lái)說(shuō),代價(jià)在很大程度上取決于行數(shù),所以在下面的示例分析中,從行數(shù)這個(gè)維度來(lái)介紹這兩部分的代價(jià)。
-
掃描訪問(wèn)路徑的代價(jià)
掃描訪問(wèn)路徑的代價(jià)跟掃描的行數(shù)成正比,理論上來(lái)說(shuō)掃描的行數(shù)越多,執(zhí)行時(shí)間就會(huì)越久。對(duì)于一個(gè)訪問(wèn)路徑,query range 決定了需要掃描的范圍,從而決定了需要掃描的行數(shù)。Query range 的掃描是順序 IO。
-
回表的代價(jià)
回表的代價(jià)跟回表的行數(shù)也也是正相關(guān)的,回表的行數(shù)越多(回表的行數(shù)是指滿足所有能在索引上執(zhí)行的謂詞的行數(shù)),執(zhí)行時(shí)間就會(huì)越長(zhǎng)。回表的掃描是隨機(jī) IO,所以回表一行的代價(jià)會(huì)比 query range 掃描一行的代價(jià)高很多。
當(dāng)分析一個(gè)訪問(wèn)路徑的性能的時(shí)候,可以從上面兩個(gè)因素入手,獲取通過(guò) query range 掃描的行數(shù)以及回表的行數(shù)。這兩個(gè)行數(shù)通??梢酝ㄟ^(guò)執(zhí)行 SQL 語(yǔ)句來(lái)獲取。
如下例所示,對(duì)于查詢 SELECT * FROM t1 WHERE c2 > 20 AND c2 < 800 AND c3 < 200,索引 k1 的訪問(wèn)路徑是,首先通常計(jì)劃展示來(lái)獲取用來(lái)抽取 query range 的謂詞,謂詞 c2 > 20 AND c2 < 800 用來(lái)抽取 query range,謂詞 c3 < 200 被當(dāng)成回表前的謂詞。那么可以使用如下兩個(gè)查詢來(lái)檢查 query range 抽取的行數(shù)以及回表之后的行數(shù)。
obclient>CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT, c4 INT, c5 INT, INDEX k1(c2,c3));
Query OK, 0 rows affected (0.26 sec)
obclient>EXPLAIN EXTENDED_NOADDR SELECT/*+INDEX(t1 k1)*/ * FROM t1 WHERE
c2 > 20 AND c2 < 800 AND c3 < 200;
+--------------------------------------------------------------+
| Query Plan |
+--------------------------------------------------------------+
| =====================================
|ID|OPERATOR |NAME |EST. ROWS|COST|
-------------------------------------
|0 |TABLE SCAN|t1(k1)|156 |1216|
=====================================
Outputs & filters:
-------------------------------------
0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), filter([t1.c3 < 200]),
access([t1.c2], [t1.c3], [t1.c1], [t1.c4], [t1.c5]), partitions(p0),
is_index_back=true, filter_before_indexback[true],
range_key([t1.c2], [t1.c3], [t1.c1]), range(20,MAX,MAX ; 800,MIN,MIN),
range_cond([t1.c2 > 20], [t1.c2 < 800])
/*query range 掃描的行數(shù)*/
obclient>SELECT/*+INDEX(t1 k1)*/ COUNT(*) FROM t1 WHERE c2 > 20 AND c2 < 800;
+----------+
| count(*) |
+----------+
| 779 |
+----------+
1 row in set (0.02 sec)
/* 回表的行數(shù)*/
obclient> SELECT/*+INDEX(t1 k1)*/ COUNT(*) FROM t1 WHERE c2 > 20 AND c2 < 800
AND c3 < 200;
+----------+
| count(*) |
+----------+
| 179 |
+----------+
1 row in set (0.01 sec) 本文題目:創(chuàng)新互聯(lián)OceanBase教程:OceanBase基于代價(jià)的路徑選擇
標(biāo)題路徑:http://www.5511xx.com/article/djdoios.html


咨詢
建站咨詢
