您好,登錄后才能下訂單哦!
這篇文章主要介紹mysql實現分表的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
mysql分表的方法:
1、做mysql集群,例如:利用mysql cluster ,mysql proxy,mysql replication,drdb等等
有人會問mysql集群,根分表有什么關系嗎?雖然它不是實際意義上的分表,但是它啟到了分表的作用,做集群的意義是什么呢?為一個數據庫減輕負擔,說白了就是減少sql排隊隊列中的sql的數量。
2、預先估計會出現大數據量并且訪問頻繁的表,將其分為若干個表
這種預估大差不差的,論壇里面發表帖子的表,時間長了這張表肯定很大,幾十萬,幾百萬都有可能。 聊天室里面信息表,幾十個人在一起一聊一個晚上,時間長了,這張表的數據肯定很大。像這樣的情況很多。所以這種能預估出來的大數據量表,我們就事先分出個N個表,這個N是多少,根據實際情況而定。
優點:避免一張表出現幾百萬條數據,縮短了一條sql的執行時間
缺點:當一種規則確定時,打破這條規則會很麻煩,上面的例子中我用的hash算法是crc32,如果我現在不想用這個算法了,改用md5后,會使同一個用戶的消息被存儲到不同的表中,這樣數據亂套了。擴展性很差。
3、利用merge存儲引擎來實現分表
我覺得這種方法比較適合,那些沒有事先考慮,而已經出現了得,數據查詢慢的情況。這個時候如果要把已有的大數據量表分開比較痛苦,最痛苦的事就是改代碼,因為程序里面的sql語句已經寫好了,現在一張表要分成幾十張表,甚至上百張表。
示例:
mysql>show engines;的時候你會發現mrg_myisam其實就是merge。
mysql> CREATE TABLE IF NOT EXISTS `user1` ( -> `id` int(11) NOT NULL AUTO_INCREMENT, -> `name` varchar(50) DEFAULT NULL, -> `sex` int(1) NOT NULL DEFAULT '0', -> PRIMARY KEY (`id`) -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; Query OK, 0 rows affected (0.05 sec) mysql> CREATE TABLE IF NOT EXISTS `user2` ( -> `id` int(11) NOT NULL AUTO_INCREMENT, -> `name` varchar(50) DEFAULT NULL, -> `sex` int(1) NOT NULL DEFAULT '0', -> PRIMARY KEY (`id`) -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO `user1` (`name`, `sex`) VALUES('張映', 0); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `user2` (`name`, `sex`) VALUES('tank', 1); Query OK, 1 row affected (0.00 sec) mysql> CREATE TABLE IF NOT EXISTS `alluser` ( -> `id` int(11) NOT NULL AUTO_INCREMENT, -> `name` varchar(50) DEFAULT NULL, -> `sex` int(1) NOT NULL DEFAULT '0', -> INDEX(id) -> ) TYPE=MERGE UNION=(user1,user2) INSERT_METHOD=LAST AUTO_INCREMENT=1 ; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> select id,name,sex from alluser; +----+--------+-----+ | id | name | sex | +----+--------+-----+ | 1 | 張映 | 0 | | 1 | tank | 1 | +----+--------+-----+ 2 rows in set (0.00 sec) mysql> INSERT INTO `alluser` (`name`, `sex`) VALUES('tank2', 0); Query OK, 1 row affected (0.00 sec) mysql> select id,name,sex from user2 -> ; +----+-------+-----+ | id | name | sex | +----+-------+-----+ | 1 | tank | 1 | | 2 | tank2 | 0 | +----+-------+-----+ 2 rows in set (0.00 sec)
從上面的操作中,我不知道你有沒有發現點什么?假如我有一張用戶表user,有50W條數據,現在要拆成二張表user1和user2,每張表25W條數據,
INSERT INTO user1(user1.id,user1.name,user1.sex)SELECT (user.id,user.name,user.sex)FROM user where user.id <= 250000
INSERT INTO user2(user2.id,user2.name,user2.sex)SELECT (user.id,user.name,user.sex)FROM user where user.id > 250000
這樣我就成功的將一張user表,分成了二個表,這個時候有一個問題,代碼中的sql語句怎么辦,以前是一張表,現在變成二張表了,代碼改動很大,這樣給程序員帶來了很大的工作量,有沒有好的辦法解決這一點呢?辦法是把以前的user表備份一下,然后刪除掉,上面的操作中我建立了一個alluser表,只把這個alluser表的表名改成user就行了。
以上是mysql實現分表的方法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。