데이터의 양에 따라 단일 테이블의 MySQL] [일억 페이징 쿼리 테스트

디렉토리

1, 테스트 데이터 생성

표 1.1 빌드

테스트 데이터 삽입 1.2

2, 일반 페이징 쿼리 : 제한

2.1 제한에 대한

실시 예 2.2

2.3 테스트

1 개 기록 테스트 쿼리는 시간의 양에 영향을 미칠

이 테스트 쿼리는 시간의 영향을 상쇄

3, 서브 쿼리 최적화 제한의 사용

4, ID 정의 최적화

5, 임시 테이블의 사용을 최적화

데이터 테이블의 ID 정보


1, 테스트 데이터 생성

표 1.1 빌드

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c_user_id` varchar(36) NOT NULL DEFAULT '' COMMENT '用户Id',
  `c_name` varchar(22) NOT NULL DEFAULT '' COMMENT '用户名',
  `c_province_id` int(11) NOT NULL COMMENT '省份Id',
  `c_city_id` int(11) NOT NULL COMMENT '城市Id',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`c_user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=100000001 DEFAULT CHARSET=utf8mb4;

테스트 데이터 삽입 1.2

2, 일반 페이징 쿼리 : 제한

2.1 제한에 대한

간단한 한계 절을 사용하여 일반 페이징 쿼리는 달성 될 수있다. 문 다음과 같은 제한 조항 :

SELECT *
FROM table 
LIMIT [offset,] rows | rows OFFSET offset;

LIMIT 절은 SELECT 문에 의해 반환 된 레코드의 수를 지정하는 데 사용할 수 있습니다. 다음을 참고 :

  • 첫 번째 인수는 첫 번째 반환에서 관심의 오프셋 (offset) 행 지정  0시작을;
  • 두 번째 파라미터는 반환되는 행의 최대 수를 지정
  • 하나 개의 매개 변수를 감안할 때 : 그 반환을 최대 행의 수를 나타냅니다;
  • 두번째 인자 -1 모든 행 세트 레코드 일단 오프셋 검;
  • 옵셋 0은 (1 대신에) 초기 행이고;

실시 예 2.2

select * from t_user limit 1000, 10;

이 문서는 테이블 t_user에서 문 쿼리합니다 offset:1000제에있는 데이터, 제 1001의 시작 후 1010 개 데이터를 10 ( 1001<=id<=1010).

마스터 키 (보통 ID) 정렬 위의 기본에 해당하는 결과를 사용하여 데이터 테이블 레코드 :

select * from t_user order by limit 1000, 10;

2.3 테스트

1 개 기록 테스트 쿼리는 시간의 양에 영향을 미칠

어떤 샷, 그리고 직접적으로 그것의 결과를 쓸 :

测试语句                                        三次执行分别耗时(ms)
select * from t_user limit 1000, 1;             15 -- 15 -- 14
select * from t_user limit 1000, 10;            14 -- 15 -- 15
select * from t_user limit 1000, 100;           15 -- 15 -- 15
select * from t_user limit 1000, 1000;          17 -- 16 -- 16
select * from t_user limit 1000, 10000;         168 -- 158 -- 158
select * from t_user limit 1000, 100000;        1159 -- 1559 -- 1479

관점에서, 쿼리 시간을 후속 여러 시도, 조회 기록의 양이 증가함에 따라, 1000 녹음 볼륨, 쿼리 시간 간격보다 낮은되지 않고있는 쿼리의 시간에, 거의 확실하다, 걸리는 시간은 점점 될 것입니다 더.

이 테스트 쿼리는 시간의 영향을 상쇄

测试语句                                      三次分别耗时
select * from t_user limit 100, 100;          16 -- 16 -- 15
select * from t_user limit 1000, 100;         15 -- 17 -- 14
select * from t_user limit 10000, 100;        18 -- 17 -- 17
select * from t_user limit 100000, 100;       42 -- 42 -- 42
select * from t_user limit 1000000, 100;      761 -- 727 -- 762

특히 오프셋 쿼리하여 쿼리의 증가, 오프셋 후 100,000 개 이상의 쿼리 시간의 급격한 증가이다.

이 페이징 쿼리는 데이터베이스에서 첫 번째 레코드를 스캔 시작합니다 더 뒤로, 그래서 느린 쿼리 속도,하지만 더 많은 데이터 쿼리, 쿼리는 전체 속도가 느려집니다.

3, 서브 쿼리 최적화 제한의 사용

(1)select * from t_user limit 100000, 1;

(2)select id from t_user limit 100000, 1;

(3)select * from t_user where id >= (select id from t_user limit 100000, 1) limit 100;

(4)select * from t_user limit 100000, 100;

세 가지 테스트 쿼리 시간 이상 네 개의 문이 있었다 :

(1) 43 -- 43 -- 41
(2) 27 -- 26 -- 25
(3) 27 -- 27 -- 26
(4) 44 -- 41 -- 43

참고 위의 쿼리 :

  • 첫 번째 문 두 번째 문장의 비교 : 선택 ID 대신 선택 *를 사용하여 쿼리 시간

  • 쿼리 속도 이하 : 2 문 및 문 제 3 조 비교

  • 제 3의 비교 및 ​​제 4 문장 문 : 증가 속도에서 ID를 선택 혜택, 성명도 증가 쿼리 속도의 제 3 조

쿼리 방법의 일반적인 제한에 비해이 방식으로, 데이터 쿼리의 속도를 가속화 할 것이다.

4, ID 정의 최적화

이되는 데이터 테이블의 ID 있다고 가정 지속적으로 증가하고는 , 그리고 우리는 페이지와 쿼리 쿼리 수, 당신은 사이 쿼리에 ID를 사용할 수있는 레코드의 수를 기반으로 쿼리 범위의 ID를 계산할 수 있습니다 :

测试语句                                                                        耗时(ms)
(优化)select * from t_user where id between 100000 and 1000100 limit 100;     14 -- 14 -- 14

(原始)select * from t_user limit 100000, 100;                                 42 -- 41 -- 41

为了对比,将修改数据:
(优化)select * from t_user where id between 10000000 and 100000100 limit 100; 16 -- 13 -- 14

(原始)select * from t_user limit 10000000, 100;                            4605 --4632--4622

크게 검색 속도를 최적화 할 수 있습니다이 쿼리는 실질적으로 밀리 초 수십 내에 완료 할 수 있습니다. 만 사용 제한은 ID의 상황을 명확하게 인식하지만, 시간 테이블 작성의 대부분은, 쿼리를 페이징 편의를 많이 가져 기본적인 id 필드를 추가합니다.

쓰기 또 다른 방법이있다 :

select * from t_user where id >= 10000001 limit 100;

물론, 관련 멀티 테이블 쿼리, 쿼리에 ID 테이블 쿼리의 다른 세트를 사용하는 경우이 방법이 주로 사용되며, 쿼리에 대한 방법으로 사용할 수 있습니다 :

eg:select * from t_user where id in (select id from t_user2 where city='Beijing') limit 100;

이 방법으로 노트에 쿼리에서 : 일부 MySQL의 버전은 IN 절에서 제한의 사용을 지원하지 않습니다.

5, 임시 테이블의 사용을 최적화

이 쿼리 최적화에 속하지 않는 이러한 방법으로, 여기에 방법을 제공됩니다.

질문 ID가 최적화 정의를 들어, 같은 때 사용 이력 테이블로, ID가 지속적으로 증가하고 있지만, 일부 시나리오에 필요하거나 기록 ID 페이징에 임시 저장 테이블을 사용하여 고려, 데이터에 문제가없는 경우 등장 ID는 쿼리에서 페이징을 사용합니다. 이것은 크게 데이터 수천만 특히 양, 기존의 페이징 쿼리 속도를 향상시킬 수 있습니다. (이것은 검증이 필요)

(6) 데이터 테이블 ID에 소개

정상적인 상황에서는 데이터베이스에서 테이블의 설립은 id 필드가 그래서 질문을 용이하게하기 위해, 각 테이블을 증가 추가하도록 강요하는 경우.

같은 주문과 다른 매우 큰 데이터베이스와 같은 데이터의 양이 일반적으로 하위 라이브러리 하위 테이블이됩니다. 이번에는 고유 식별자 ID를 데이터베이스로 사용하지 않는 것이 좋습니다,하지만 고유 ID를 생성하는 마이크로 그리드의 높은 동시성을 사용해야하고, 데이터 테이블에서 추가 필드의 사용은 고유 식별자를 저장합니다.

ID (또는 인덱스)의 위치를 ​​처음 사용 범위 쿼리를 사용하고 쿼리 속도를 개선 할 수있는 데이터를 여러 번 찾기 위해 인덱스를 사용합니다. 즉, 제 1 선택 이드 후 선택한 *;

 

참조 :

https://mp.weixin.qq.com/s/nW3KQ3DoumlXHvuHe1WczQ

发布了95 篇原创文章 · 获赞 16 · 访问量 5万+

추천

출처blog.csdn.net/tiankong_12345/article/details/99670241