首頁 >資料庫 >mysql教程 >mysql怎麼分錶

mysql怎麼分錶

(*-*)浩
(*-*)浩原創
2019-05-31 16:11:302741瀏覽

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

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)

優點:擴充性好,且程式碼改動的不是很大

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

以上是mysql怎麼分錶的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn