2011-05-05 77 views
2

我有一個表按id進行分區,並通過對代碼進行散列(都是整數)。 30個分區,每個分區散列4個,共120個子分區。MySQL忽略查詢中的子分區

如果我做了選擇上的ID獨自一人,解釋計劃表明,它的正確修剪下來只有分區&與之相關的子分區(4)

如果我做了選擇上的ID +代碼,解釋計劃顯示,它的正確修剪下來到與之相關的一個特定子分區(1)

無論其...

如果我做了選擇上的代碼獨自一人,解釋計劃似乎表明MySQL是做了充分的表掃描(120個分區),而不是像甲骨文一樣行動,只掃描每個分區的一個子分區相關的分區(總共30個)。

當我不能刪除整個分區時,我是否必須做一些特殊的事情才能讓MySQL利用子分區修剪?還是MySQL(至少5.1)只是不支持自己利用子分區?

+0

您使用的是什麼引擎類型? – Johan 2011-05-05 18:48:41

+0

我使用InnoDB – Bitbang3r 2011-05-06 00:13:38

+0

非常有趣。我很困惑,因爲innoDB不會做散列鍵,但我想你的意思是存儲在B +樹中的計算散列。 – Johan 2011-05-06 04:27:41

回答

0

我找到了答案。似乎只有MySQL 5.5和更新版本才能夠獨立於主分區值而利用子分區。其中一天,我會記得開始關注我正在閱讀的哪個版本的MySQL文檔。

最終例如:

假設 '表' 由範圍上的一個分區和由散列上B.

查詢1 subpartitioned:「SELECT * from表,其中A =和B =和C? =?「:

  • 將按照預期在MySQL 5.1及更新版本下工作。 MySQL將忽略與不包含A值的範圍相關聯的任何分區,並且將忽略與B的值不相關的任何子分區。最壞的情況是,它只對單個分區的單個子分區中的行進行蠻力搜索。

查詢2: 「從表中選擇其中B =和C =?」:

  • 可能工作例如MySQL 5.5和更新的下預期。如果Oracle能夠正常工作,在最壞的情況下,它會從每個分區範圍中搜索一個子分區。如果你有20個分區範圍和4個子分區,最糟糕的情況是它會通過20個子分區進行強力搜索。

  • 在MySQL 5.1下無法按預期工作。它將逐個遍歷所有80個子分區,並基本上執行全表掃描。