當在mysql中對數據庫表進行分區時,如何訪問/查詢單個分區?如何在mysql中訪問/查詢數據庫分區?
編輯
在迴應@裂縫的評論。
因此,當一個分區是發生在一個表,然後我仍然會用一個正常的查詢。 「修剪」在查詢的數據庫端到達哪裏?這幾乎是一個複雜的存儲Where
子句,然後應用於每個查詢?爲什麼命名的分區如果不能單獨訪問?
當在mysql中對數據庫表進行分區時,如何訪問/查詢單個分區?如何在mysql中訪問/查詢數據庫分區?
編輯
在迴應@裂縫的評論。
因此,當一個分區是發生在一個表,然後我仍然會用一個正常的查詢。 「修剪」在查詢的數據庫端到達哪裏?這幾乎是一個複雜的存儲Where
子句,然後應用於每個查詢?爲什麼命名的分區如果不能單獨訪問?
好吧,讓我們一次一個這個部分。
所以,當一個分區在表中的地方,我仍然會使用正常的查詢。
是的。分區對您來說是透明的,它意味着通過劃分物理來優化(當使用得很好的時候)查詢性能。將數據和索引存儲到單獨的「容器」中。
「修剪」在查詢的數據庫端來到哪裏?這幾乎是一個複雜的存儲Where子句,然後應用於每個查詢?
是,也不是。根據分區模式,MySQL會將您的數據放入不相關的「容器」中。稍後,它會讀取查詢的WHERE
子句,並知道必須檢查哪些分區來回答它。 MySQL文檔在文檔中有幾個很好的例子:Partition Pruning。
它允許每個分區存儲不同的物理存儲設備上,並且MySQL能並行運行的一些操作或根本不掃描一些分區(見上面從鏈路的例子)。
爲什麼分區命名的,如果他們不單獨訪問?
他們是單獨訪問的,但是你不做這個決定 - 優化器是這樣做的。分區名稱使您更容易管理它們。您可以在文檔中找到可能的操作(Partition Management)。
從MySQL 5.6.2,您可以選擇從單個分區數據,請參見Partition Selection。只是一個建議 - 如果你不需要,不要使用這種語法,因爲使用它會使你的查詢綁定到數據的存儲結構(並且不要在生產中使用不穩定版本的MySQL)。
如果它是存儲的where子句,那麼在使用數據庫中的存儲子句時與使用查詢中的where子句時性能有差異嗎? – 2012-04-05 21:26:05
我更新了我的答案。這是一種WHERE子句,它將數據(存儲時)分爲不同的數據塊。它們可以位於單獨的驅動器上,可以同時掃描,也可以在全表掃描等中省略。這是通過操縱數據存儲方式來提高性能的一種方式。 – Crack 2012-04-05 21:32:04
修剪數據確實會在您插入數據時發揮作用。
例如,假設我已經通過散列對id
(整數列)進行了分區,我的散列函數只是檢查整數是奇數還是偶數。因此,MySQL將會有效地創建兩個bin - odd bin
和even 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次(讓我們現在打折哈希開銷)。
我不明白你的問題 - 分區是一個存儲細節,對用戶透明地完成。像往常一樣查詢分區表。 – Crack 2012-04-05 21:03:23
@Crack - 也許你不明白我的問題,因爲我對這個話題相當陌生,所以我很抱歉,我的溝通不夠好。請參閱我的編輯。 – 2012-04-05 21:08:48