>  기사  >  데이터 베이스  >  MySQL에서 테이블을 나누는 방법

MySQL에서 테이블을 나누는 방법

(*-*)浩
(*-*)浩원래의
2019-05-31 16:11:302718검색

데이터가 수백만개에 도달하면 한 번 쿼리하는 데 걸리는 시간이 늘어나게 됩니다. 공동 쿼리가 있으면 거기에서 죽을 수도 있습니다. 테이블 파티셔닝의 목적은 데이터베이스의 부담을 줄이고 쿼리 시간을 단축하는 것입니다.

MySQL에서 테이블을 나누는 방법

subtable

1, mysql 클러스터를 수행하세요. 예: mysql 클러스터, mysql 프록시, mysql 복제, drdb 등 사용

어떤 사람들은 mysql 클러스터가 하위 테이블과 관련이 있는지 물을 수 있습니다. 실제 의미에서는 하위 테이블은 아니지만 하위 테이블 역할을 합니다. 클러스터가 된다는 것은 무엇을 의미합니까? 데이터베이스에 대한 부담을 줄인다는 것은 직설적으로 말하면 SQL 대기열의 SQL 수를 줄이는 것을 의미합니다.

예: 10개의 SQL 요청이 데이터베이스 서버의 대기열에 배치되면 이 10개의 SQL 요청이 5개의 데이터베이스 서버에 할당되면 오랜 시간을 기다려야 합니다. 대기열 대기열에는 데이터베이스 서버에 대기열이 2개만 있습니다. 대기 시간이 크게 단축됩니까? 이것은 이미 명백합니다.

장점: 확장성이 좋고 여러 하위 테이블(php 코드) 후에도 복잡한 작업이 없음

단점: 단일 테이블의 데이터 양이 변하지 않았으며 비용이 많이 듭니다. 한 작업의 경우 여전히 시간이 너무 많이 걸리고 하드웨어 오버헤드도 높습니다.

2 데이터 양이 많고 자주 접근하는 테이블은 여러 테이블로 나누어질 것으로 사전에 예측됩니다

이런 종류. 추정치는 포럼의 게시물 목록과 거의 동일합니다. 시간이 지나면 이 목록은 확실히 수십만 또는 수백만 개가 될 것입니다. 채팅방의 정보 테이블에는 수십 명이 밤새도록 채팅을 했습니다. 오랜 시간이 지나면 이 테이블의 데이터가 매우 커질 것입니다. 이런 상황이 많이 있습니다. 따라서 이런 종류의 빅데이터 규모를 추정할 수 있도록 사전에 N개의 테이블로 나누어 두는데, 그 개수는 실제 상황에 따라 달라진다.

장점: 수백만 개의 데이터를 하나의 테이블에 담지 않고, SQL 문의 실행 시간을 단축

단점: 규칙이 정해지면 깨지게 된다. 위의 예에서 내가 사용한 해시 알고리즘은 crc32입니다. 지금 이 알고리즘을 사용하지 않으려면 대신 md5를 사용하면 동일한 사용자의 메시지가 다른 테이블에 저장됩니다. 데이터 모든 지옥이 풀립니다. 확장성이 좋지 않습니다.

3, 병합 저장소 엔진을 사용하여 하위 테이블 구현

이미 등장하지 않은 분들에게는 이 방법이 더 적합한 것 같아요 사전 고려 사항 예, 데이터 쿼리가 느립니다. 이때 기존 빅데이터 규모를 분리하는 것이 더 괴로운데, 프로그램 내의 SQL 문이 이미 작성되어 있기 때문에 코드를 바꾸는 것이 가장 괴로운 일이다. 이제 테이블을 수십 개, 심지어 수백 개의 테이블로 나누어야 합니다. 이는 SQL 문을 다시 작성해야 한다는 의미입니까? 예를 들어,

mysql>show 엔진을 사용하면 mrg_myisam이 실제로 병합된다는 것을 알 수 있습니다.

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으로 문의하세요.