mysql怎么分表

當一張的數據達到幾百萬時,你查詢一次所花的時間會變多,如果有聯合查詢的話,我想有可能會死在那兒了。分表的目的就在于此,減小數據庫的負擔,縮短查詢時間。

mysql怎么分表

分表

1,做mysql集群。例如:利用mysql cluster ,mysql proxy,mysql replication,drdb等等

有人會問mysql集群,和分表有什么關系嗎?雖然它不是實際意義上的分表,但是它起到了分表的作用。做集群的意義是什么呢?為一個數據庫減輕負擔,說白了就是減少sql排隊隊列中的sql的數量。

舉個例子:有10個sql請求,如果放在一個數據庫服務器的排隊隊列中,他要等很長時間,如果把這10個sql請求,分配到5個數據庫服務器的排隊隊列中,一個數據庫服務器的隊列中只有2個,這樣等待時間是不是大大的縮短了呢?這已經很明顯了。

優點:擴展性好,沒有多個分表后的復雜操作(php代碼)

缺點:單個表的數據量還是沒有變,一次操作所花的時間還是那么多,硬件開銷大。

2,預先估計會出現大數據量并且訪問頻繁的表,將其分為若干個表

這種預估大差不差的,論壇里面發表帖子的表,時間長了這張表肯定很大,幾十萬,幾百萬都有可能。 聊天室里面信息表,幾十個人在一起一聊一個晚上,時間長了,這張表的數據肯定很大。像這樣的情況很多。所以這種能預估出來的大數據量表,我們就事先分出個N個表,這個N是多少,根據實際情況而定。

優點:避免一張表出現幾百萬條數據,縮短了一條sql的執行時間

缺點:當一種規則確定時,打破這條規則會很麻煩,上面的例子中我用的hash算法是crc32,如果我現在不想用這個算法了,改用md5后,會使同一個用戶的消息被存儲到不同的表中,這樣數據亂套了。擴展性很差。

3,利用merge存儲引擎來實現分表

我覺得這種方法比較適合,那些沒有事先考慮,而已經出現了的,數據查詢慢的情況。這個時候如果要把已有的大數據量表分開比較痛苦,最痛苦的事就是改代碼,因為程序里面的sql語句已經寫好了。現在一張表要分成幾十張表,甚至上百張表,這樣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)

優點:擴展性好,并且程序代碼改動的不是很大

缺點:這種方法的效果比第二種要差一點

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享