日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql2008r1_mysql8 参考手册-分区修剪

發(fā)布時(shí)間:2024/10/8 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql2008r1_mysql8 参考手册-分区修剪 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

稱為分區(qū)修剪的優(yōu)化基于一個(gè)相對(duì)簡(jiǎn)單的概念,該概念可以描述為“ 不掃描沒(méi)有匹配值的分區(qū) ”。假設(shè)t1通過(guò)以下語(yǔ)句創(chuàng)建分區(qū)表 :

CREATE TABLE t1 (

fname VARCHAR(50) NOT NULL,

lname VARCHAR(50) NOT NULL,

region_code TINYINT UNSIGNED NOT NULL,

dob DATE NOT NULL

)

PARTITION BY RANGE( region_code ) (

PARTITION p0 VALUES LESS THAN (64),

PARTITION p1 VALUES LESS THAN (128),

PARTITION p2 VALUES LESS THAN (192),

PARTITION p3 VALUES LESS THAN MAXVALUE

);

假設(shè)您希望從這樣的SELECT語(yǔ)句中獲得結(jié)果 :

SELECT fname, lname, region_code, dob

FROM t1

WHERE region_code > 125 AND region_code < 130;

很容易看出,應(yīng)該返回的行都不在分區(qū)p0或 p3;中。也就是說(shuō),我們只需要在分區(qū)中搜索 p1并p2找到匹配的行。通過(guò)限制搜索,與掃描表中的所有分區(qū)相比,查找匹配的行可以花費(fèi)更少的時(shí)間和精力。這種“ 切掉 ”不需要的分區(qū)被稱為 修剪。當(dāng)優(yōu)化程序可以在執(zhí)行此查詢時(shí)使用分區(qū)修剪時(shí),對(duì)于包含相同列定義和數(shù)據(jù)的未分區(qū)表,查詢的執(zhí)行速度可以比同一查詢快一個(gè)數(shù)量級(jí)。

只要WHERE條件可以減少到以下兩種情況之一,優(yōu)化器就可以執(zhí)行修剪 :

partition_column = constant

partition_column IN (constant1, constant2, ..., constantN)

在第一種情況下,優(yōu)化器僅對(duì)給定值的分區(qū)表達(dá)式求值,確定哪個(gè)分區(qū)包含該值,然后僅掃描該分區(qū)。在許多情況下,等號(hào)可以與另一個(gè)算術(shù)比較來(lái)代替,包括, <=,>=,和 <>。使用某些查詢 BETWEEN中WHERE子句也可以利用分區(qū)修剪。請(qǐng)參閱本節(jié)后面的示例。

在第二種情況下,優(yōu)化器為列表中的每個(gè)值評(píng)估分區(qū)表達(dá)式,創(chuàng)建匹配分區(qū)的列表,然后僅掃描此分區(qū)列表中的分區(qū)。

SELECT, DELETE和 UPDATE語(yǔ)句支持分區(qū)修剪。一條INSERT語(yǔ)句對(duì)插入的每一行也只能訪問(wèn)一個(gè)分區(qū)。即使對(duì)于由HASH或進(jìn)行 分區(qū)的表也是如此,KEY盡管當(dāng)前未在中顯示EXPLAIN。

修剪還可以應(yīng)用于短范圍,優(yōu)化程序可以將其轉(zhuǎn)換為等效的值列表。例如,在前面的示例中,WHERE子句可以轉(zhuǎn)換為WHERE region_code IN (126, 127, 128, 129)。然后,優(yōu)化器可以確定列表中的前兩個(gè)值在partition中找到 p1,其余兩個(gè)值在partition中 p2,并且其他分區(qū)不包含任何相關(guān)值,因此無(wú)需在匹配的行中進(jìn)行搜索。

優(yōu)化程序還可以對(duì)WHERE涉及使用RANGE COLUMNS或LIST COLUMNS分區(qū)的表的多個(gè)列上的前述類型進(jìn)行比較的條件 進(jìn)行修剪 。

只要分區(qū)表達(dá)式包含一個(gè)等于或可以減少為一組相等項(xiàng)的范圍,或者當(dāng)分區(qū)表達(dá)式表示增加或減少的關(guān)系時(shí),都可以應(yīng)用這種類型的優(yōu)化。當(dāng)分區(qū)表達(dá)式使用or 函數(shù)時(shí),修剪還可以應(yīng)用于在 DATE或 DATETIME列上分區(qū)的表 。當(dāng)分區(qū)表達(dá)式使用該函數(shù)時(shí),修剪也可以應(yīng)用于此類表。 YEAR()TO_DAYS()TO_SECONDS()

假設(shè)使用以下所示的語(yǔ)句創(chuàng)建t2分區(qū)在表上的 表DATE:

CREATE TABLE t2 (

fname VARCHAR(50) NOT NULL,

lname VARCHAR(50) NOT NULL,

region_code TINYINT UNSIGNED NOT NULL,

dob DATE NOT NULL

)

PARTITION BY RANGE( YEAR(dob) ) (

PARTITION d0 VALUES LESS THAN (1970),

PARTITION d1 VALUES LESS THAN (1975),

PARTITION d2 VALUES LESS THAN (1980),

PARTITION d3 VALUES LESS THAN (1985),

PARTITION d4 VALUES LESS THAN (1990),

PARTITION d5 VALUES LESS THAN (2000),

PARTITION d6 VALUES LESS THAN (2005),

PARTITION d7 VALUES LESS THAN MAXVALUE

);

以下語(yǔ)句using t2可以利用分區(qū)修剪:

SELECT * FROM t2 WHERE dob = '1982-06-23';

UPDATE t2 SET region_code = 8 WHERE dob BETWEEN '1991-02-15' AND '1997-04-25';

DELETE FROM t2 WHERE dob >= '1984-06-21' AND dob <= '1999-06-21'

對(duì)于最后一條語(yǔ)句,優(yōu)化器還可以執(zhí)行以下操作:

查找包含范圍下限的分區(qū)。

YEAR('1984-06-21')產(chǎn)生1984在分區(qū)中找到 的值d3。

查找包含范圍高端的分區(qū)。

YEAR('1999-06-21')計(jì)算結(jié)果為 1999,可在partition中找到 d5。

僅掃描這兩個(gè)分區(qū)以及它們之間可能存在的任何分區(qū)。

在這種情況下,這意味著,只有分區(qū) d3,d4以及 d5被掃描。其余分區(qū)可以安全地忽略(也可以忽略)。

重要

在針對(duì)分區(qū)表的語(yǔ)句條件中引用的 無(wú)效值DATE和DATETIME值WHERE均視為 NULL。這意味著諸如之類的查詢 不會(huì)返回任何值(請(qǐng)參見Bug#40972)。 SELECT * FROM partitioned_table WHERE date_column < '2008-12-00'

到目前為止,我們僅查看了使用RANGE分區(qū)的示例 ,但是修剪也可以應(yīng)用于其他分區(qū)類型。

考慮一個(gè)由分區(qū)的表LIST,其中分區(qū)表達(dá)式在增加或減少,例如t3此處所示的表。(在本示例中,為簡(jiǎn)潔起見,我們假設(shè)該 region_code列的值限制為1到10之間(包括1和10)。

CREATE TABLE t3 (

fname VARCHAR(50) NOT NULL,

lname VARCHAR(50) NOT NULL,

region_code TINYINT UNSIGNED NOT NULL,

dob DATE NOT NULL

)

PARTITION BY LIST(region_code) (

PARTITION r0 VALUES IN (1, 3),

PARTITION r1 VALUES IN (2, 5, 8),

PARTITION r2 VALUES IN (4, 9),

PARTITION r3 VALUES IN (6, 7, 10)

);

對(duì)于諸如之類的語(yǔ)句SELECT * FROM t3 WHERE region_code BETWEEN 1 AND 3,優(yōu)化器確定在值1、2和3中找到的分區(qū)(r0和r1),并跳過(guò)其余的分區(qū)(r2和r3)。

對(duì)于用HASH或 進(jìn)行分區(qū)的表,[LINEAR] KEY如果WHERE子句=針對(duì)分區(qū)表達(dá)式中使用的列使用簡(jiǎn)單關(guān)系,則也可以進(jìn)行分區(qū)修剪。考慮這樣創(chuàng)建的表:

CREATE TABLE t4 (

fname VARCHAR(50) NOT NULL,

lname VARCHAR(50) NOT NULL,

region_code TINYINT UNSIGNED NOT NULL,

dob DATE NOT NULL

)

PARTITION BY KEY(region_code)

PARTITIONS 8;

可以刪除將列值與常量進(jìn)行比較的語(yǔ)句:

UPDATE t4 WHERE region_code = 7;

修剪還可以用于短距離,因?yàn)閮?yōu)化程序可以將這種條件轉(zhuǎn)化為IN 關(guān)系。例如,使用與t4 先前定義的相同的表,可以刪除諸如此類的查詢:

SELECT * FROM t4 WHERE region_code > 2 AND region_code < 6;

SELECT * FROM t4 WHERE region_code BETWEEN 3 AND 5;

在這兩種情況下,WHERE子句均由優(yōu)化器轉(zhuǎn)換為WHERE region_code IN (3, 4, 5)。

重要

僅當(dāng)范圍大小小于分區(qū)數(shù)時(shí)才使用此優(yōu)化。考慮以下語(yǔ)句:

DELETE FROM t4 WHERE region_code BETWEEN 4 AND 12;

中相應(yīng)的范圍WHERE子句涵蓋9個(gè)值(4,5,6,7,8,9,10,11,12),但t4僅具有8個(gè)分區(qū)。這意味著DELETE 不能修剪。

當(dāng)用HASH或 分區(qū)表時(shí)[LINEAR] KEY,修剪只能在整數(shù)列上使用。例如,此語(yǔ)句不能使用修剪,因?yàn)樗黡ob是一 DATE列:

SELECT * FROM t4 WHERE dob >= '2001-04-14' AND dob <= '2005-10-15';

但是,如果表將年份值存儲(chǔ)在 INT列中,則WHERE year_col >= 2001 AND year_col <= 2005可以刪除具有的查詢 。

如果表NDB被顯式分區(qū),則可以修剪使用提供自動(dòng)分區(qū)的存儲(chǔ)引擎的表,例如MySQL Cluster使用的存儲(chǔ)引擎。

總結(jié)

以上是生活随笔為你收集整理的mysql2008r1_mysql8 参考手册-分区修剪的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。