2012-04-05 115 views
2

當在mysql中對數據庫表進行分區時,如何訪問/查詢單個分區?如何在mysql中訪問/查詢數據庫分區?

編輯

在迴應@裂縫的評論。

因此,當一個分區是發生在一個表,然後我仍然會用一個正常的查詢。 「修剪」在查詢的數據庫端到達哪裏?這幾乎是一個複雜的存儲Where子句,然後應用於每個查詢?爲什麼命名的分區如果不能單獨訪問?

+0

我不明白你的問題 - 分區是一個存儲細節,對用戶透明地完成。像往常一樣查詢分區表。 – Crack 2012-04-05 21:03:23

+0

@Crack - 也許你不明白我的問題,因爲我對這個話題相當陌生,所以我很抱歉,我的溝通不夠好。請參閱我的編輯。 – 2012-04-05 21:08:48

回答

3

好吧,讓我們一次一個這個部分。

所以,當一個分區在表中的地方,我仍然會使用正常的查詢。

是的。分區對您來說是透明的,它意味着通過劃分物理來優化(當使用得很好的時候)查詢性能。將數據和索引存儲到單獨的「容器」中。

「修剪」在查詢的數據庫端來到哪裏?這幾乎是一個複雜的存儲Where子句,然後應用於每個查詢?

是,也不是。根據分區模式,MySQL會將您的數據放入不相關的「容器」中。稍後,它會讀取查詢的WHERE子句,並知道必須檢查哪些分區來回答它。 MySQL文檔在文檔中有幾個很好的例子:Partition Pruning

它允許每個分區存儲不同的物理存儲設備上,並且MySQL能並行運行的一些操作或根本不掃描一些分區(見上面從鏈路的例子)。

爲什麼分區命名的,如果他們不單獨訪問?

他們是單獨訪問的,但是你不做這個決定 - 優化器是這樣做的。分區名稱使您更容易管理它們。您可以在文檔中找到可能的操作(Partition Management)。

從MySQL 5.6.2,您可以選擇從單個分區數據,請參見Partition Selection。只是一個建議 - 如果你不需要,不要使用這種語法,因爲使用它會使你的查詢綁定到數據的存儲結構(並且不要在生產中使用不穩定版本的MySQL)。

+0

如果它是存儲的where子句,那麼在使用數據庫中的存儲子句時與使用查詢中的where子句時性能有差異嗎? – 2012-04-05 21:26:05

+0

我更新了我的答案。這是一種WHERE子句,它將數據(存儲時)分爲不同的數據塊。它們可以位於單獨的驅動器上,可以同時掃描,也可以在全表掃描等中省略。這是通過操縱數據存儲方式來提高性能的一種方式。 – Crack 2012-04-05 21:32:04

3

修剪數據確實會在您插入數據時發揮作用。

例如,假設我已經通過散列對id(整數列)進行了分區,我的散列函數只是檢查整數是奇數還是偶數。因此,MySQL將會有效地創建兩個bin - odd bineven bin

當我插入id = 1,MySQL的應用散列函數。由於結果爲odd,因此數據將存儲在odd bin中。當我插入id = 2時,數據將轉到even bin

查詢不涉及任何修剪,只是一些智能邏輯。 MySQL知道從這個表上引發的查詢,如果它只能查看一個分區(在我們的例子中是數據的一半),它可能會提高性能。所以,它試圖識別分區。

當一個查詢被觸發涉及到where中的id列時,MySQL會再次將散列函數應用於傳遞的值。假設我說WHERE id = 2 AND <some other condition>,散列返回even。所以,現在MySQL只查看even bin

在這個簡單的例子中,您可以看到查詢/插入數據時,只需要掃描/更新完整數據集的一半,從而將性能有效地提高了約10倍。 2次(讓我們現在打折哈希開銷)。