天天看點

MySQL Merge引擎實作分表

Merge引擎是一組MyISAM表的組合,組合的分表結構必須完全相同,Merge表本身沒有資料,對Merge表的操作實際上都是對子表的操作,隻是對APP來說是透明的,在插入的時候預設是插入到最後一張表上,也可以指定插入到第一張表上,Merger表實際上隻是多個子表的一個外殼,對它進行删除,不影響實際存儲的資料。

建立子表user1

<code>CREATE</code> <code>TABLE</code> <code>`user1` (</code>

<code>  </code><code>`id` </code><code>int</code><code>(11) </code><code>NOT</code> <code>NULL</code> <code>AUTO_INCREMENT,</code>

<code>  </code><code>`</code><code>name</code><code>` </code><code>varchar</code><code>(100) </code><code>CHARACTER</code> <code>SET</code> <code>latin1 </code><code>DEFAULT</code> <code>NULL</code><code>,</code>

<code>  </code><code>PRIMARY</code> <code>KEY</code> <code>(`id`)</code>

<code>) ENGINE=MyISAM AUTO_INCREMENT=2 </code><code>DEFAULT</code> <code>CHARSET=utf8;</code>

建立子表user2

<code>CREATE</code> <code>TABLE</code> <code>`user2` (</code>

建立Merge表alluser

<code>CREATE</code> <code>TABLE</code> <code>`alluser` (</code>

<code>  </code><code>`id` </code><code>int</code><code>(11) </code><code>NOT</code> <code>NULL</code><code>,</code>

<code>  </code><code>`</code><code>name</code><code>` </code><code>varchar</code><code>(100) </code><code>DEFAULT</code> <code>NULL</code><code>,</code>

<code>) ENGINE=MRG_MyISAM </code><code>DEFAULT</code> <code>CHARSET=latin1 INSERT_METHOD=</code><code>LAST</code> <code>UNION</code><code>=(`user1`,`user2`);</code>

現在對alluser進行插入資料

然後檢視user2表的資料發現已經插入進去

<a href="https://s5.51cto.com/wyfs02/M00/9C/3C/wKiom1ltxL3wjeqCAAAnas7bGzk683.jpg-wh_500x0-wm_3-wmp_4-s_3995468817.jpg" target="_blank"></a>

下一步對子表分表進行插入操作,然後檢視alluser表

<a href="https://s3.51cto.com/wyfs02/M01/9C/3C/wKiom1ltxOvw6cVNAAAm-8NsFSk725.jpg-wh_500x0-wm_3-wmp_4-s_3950426516.jpg" target="_blank"></a>

<a href="https://s3.51cto.com/wyfs02/M00/9C/3C/wKioL1ltxOyDVwqAAAApa1C6Bqc649.jpg-wh_500x0-wm_3-wmp_4-s_1620798429.jpg" target="_blank"></a>

<a href="https://s3.51cto.com/wyfs02/M02/9C/3C/wKioL1ltxP6ifVGIAAAyKb1XDmg147.jpg-wh_500x0-wm_3-wmp_4-s_3629557246.jpg" target="_blank"></a>

發現對子表的插入操作最後都會映射到alluser表中,從一定意義上實作了分表,但是也有局限性,就是資料分布不均勻,因為插入的時候不能自定義規則,隻能插入建立時指定的子表,還有就沒有限制條件的檢查,例如在三張表中都設定id為主鍵,我們在user2中插入一條user1中已經存在的資料,但是alluser表并不報錯且成功插入

<a href="https://s1.51cto.com/wyfs02/M01/9C/3C/wKioL1ltxmjRkKTdAAA1PM6kZDc831.jpg-wh_500x0-wm_3-wmp_4-s_1360109523.jpg" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M02/9C/3C/wKiom1ltxmihAGnYAAA0QRULkuU941.jpg-wh_500x0-wm_3-wmp_4-s_3499055595.jpg" target="_blank"></a>

由于這些原因,Merge引擎實作的分表在實際應用中并不多

本文轉自 無心低語 51CTO部落格,原文連結:http://blog.51cto.com/fengzhankui/1948637,如需轉載請自行聯系原作者