>데이터 베이스 >MySQL 튜토리얼 >MySQL을 데이터베이스로 분할한 후 쿼리하는 방법

MySQL을 데이터베이스로 분할한 후 쿼리하는 방법

(*-*)浩
(*-*)浩원래의
2019-05-28 17:38:077341검색

데이터베이스 및 테이블 분할 전략은 프로젝트 요구 사항에 따라 다릅니다. 여기서는 기존 접근 방식이 채택됩니다. 모듈로 방법에 따라 2개의 수평 분할 데이터베이스가 있고 각 데이터베이스에 총 2개의 수평 분할 테이블이 있다고 가정합니다. 41페이지의 데이터를 쿼리할 때 기본적으로 다른 조건에 따라 정렬되지 않는 테이블이 4개 있고 각 페이지에는 10개의 데이터가 표시됩니다

MySQL을 데이터베이스로 분할한 후 쿼리하는 방법

# 🎜🎜#

첫 번째 것:

도 가장 간단한 것입니다. 추가 연관 테이블을 추가하면 속성에 id 속성이 있어야 합니다. 라이브러리가 있는지 여부에 대해서는 id 속성과 테이블 id 속성(즉, 데이터베이스 수와 테이블 수)은 id를 기준으로 모듈로를 취하여 얻을 수 있으므로 선택 사항입니다. 이 테이블에는 모든 데이터가 저장되어 있지만 속성 열이 더 적습니다. 이 경우에는 Brand_temp에서 *를 선택하면 됩니다. 41페이지의 데이터, 각 페이지에는 5개의 데이터가 표시됨)으로 이동한 다음 해당 테이블을 쿼리합니다.

두 번째 유형: # 🎜🎜#은 성능을 가장 많이 소모하는 것입니다. 첫 번째 페이지의 레코드를 쿼리하려는 경우 단일 데이터베이스와 단일 테이블의 SQL은 다음과 같습니다. select * from dblimit 0,10; shards, 명령문은 여전히 ​​동일하지만 이때 메모리의 4개 테이블에서 반환된 레코드를 구문 분석한 다음 ID를 기준으로 오름차순으로 정렬하고 처음 10개 데이터를 가져와 반환해야 합니다. 데이터 양이 적고 페이지 번호도 괜찮지만, SQL 모놀리식 아키텍처의 경우 2페이지의 데이터를 쿼리하려면 다음과 같습니다. select * from dblimit 10,10; 이를 보완하는 방법은 모두 쿼리하는 것입니다. sql 문은 select * from db_xlimit 0,10+10 //쿼리해야 할 항목이 현재임을 의미합니다. 하나. 단일 아키텍처에서 쿼리할 레코드 수를 이전 레코드에 더한 다음, 모든 테이블에서 반환된 레코드를 메모리에 병합하고 파싱하여 최종적으로 10번째부터 시작하는 레코드를 가져옵니다... 페이지 수가 n 페이지에 도달하면 이 솔루션은 각 페이지에 표시되는 레코드 수가 m일 때 각 테이블에서 쿼리해야 하는 레코드 수는 다음과 같습니다. (n-1)*m+ m=nm 레코드이고 메모리에서 구문 분석해야 하는 레코드 수는 t * n * m 레코드입니다. CPU가 폭발하지 않으면 손실됩니다. 페이지 점프 쿼리는 무엇을 의미합니까? 구체적인 방법은 레코드 수를 쿼리하여 현재 고유 ID 값의 최대값을 기록한 다음 다시 쿼리할 때 추가하는 것입니다. 여기서 조건은... 처음부터 시작하겠습니다. query pageNum=1, pageSize=10, maxId=0->sql:select * from db_x where id>0 제한 10; 그런 다음 해당 라이브러리의 테이블에 배포하고, 얻은 4*10개의 데이터를 병합하고, 그런 다음 메모리에서 구문 분석 및 정렬을 수행하고 처음 10개의 데이터를 가져오는 동시에 10번째 데이터의 id=maxId를 별도로 가져와 프런트엔드 페이지에 렌더링하고 저장합니다. 다음 페이지를 클릭하면 그 때 이 maxId=10도 제출되었고 SQL은 select * from db_x where id>10 제한 10이 된 후 계속해서 구문 분석하고 저장했습니다... 이렇게 반환된 데이터는 다음과 같습니다. 안정적이고 일관성 있는(정렬)

네 번째 방법:

전설적인 최선의 방법은 페이지 점프 쿼리를 지원하며 이 방법의 핵심은 다음과 같습니다. 2개의 SQL 쿼리에서 구체적으로 수행하는 방법:

전제 조건: 1001페이지의 데이터를 쿼리하고 페이지당 10개의 레코드를 표시합니다.

1):我们先记录下要查询的记录数的范围:(1001-1)*10=10000 开始,10010结束->10000-10010
单体的sql为:select * from db limit 10000,10;
我们总共有4个表,意味着:每个表的start应该为10000/4=2500,从而sql变成了:
select * from db_x limit 2500,10;	//假设是平均分配的,因而我们可以均分,不均分也没关系,后续操作会补齐
我们会得到4个表中的记录:(因为我demo还没写,所以先手写了)
T1:(1,"a"),.......
T2:(2,"b"),.......
T3:(3,"c"),.......
T4:(4,"d"),.......
真实数据第1001页不可能是1开头的,将就着看吧,过几天会一起讲rabbitMQ分布式一致性和这个demo一起发布的
ok,第一阶段的sql查询结束

2):对4个表中返回的记录进行id匹配(id如果非整型,自行用hashCode匹配),因为是升序查询,所以我们只需要比较下每个表的首条记录
的id值即可,获得了最小的minId=1,和各个表最大的那个值maxId;ok,转换sql思路,这里我们采用条件查询了(弥补操作第一步):
select * from db_x where id between minId and maxId 这样我们就获取到了遗漏的数据(当然有多余的数据)
这样我们4个表中就返回了可能记录数各不相同的记录,第二步结束

3):
之后记录minId出现的位置,如T1出现的位置为2500,T2出现的位置为2500-2=2048 ,T3出现的位置为2500-3=2047 ,T4出现的位置
为2500-3=2047 则最终出现的记录数为:2500+2048+2047+2047=10000-2-3-3=9992,因此我们需要的查询的记录数需要从9992 依次往后取
8个开始,然后再取10个就是所求的数据,这种方式能做到数据精确查询,但是唯一的缺点就是每次查询都需要进行二次sql查询

위 내용은 MySQL을 데이터베이스로 분할한 후 쿼리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.