MySQL의 최적화 대용량 데이터

         우리는 많은 양의 데이터가있을 때 일반적으로, 당신은 페이징하기 위해 페이징 일반 문은 오프셋 한계 행이 필요합니다. 페이징이 영향을 아무것도 이러한 소량의 데이터가 한 번 데이터 증가의 양을 증가, 성능이 악화 될 오프셋. 우리는 다음 실험에 와서 이곳까지 :

  1. 데이터 준비
    1. 테스트 테이블 엔진을 구축하는 것은의 MyISAM (어떤 트랜잭션 데이터가 제출되지 삽입, 빠른 속도 삽입) 테이블입니다.  
CREATE TABLE USER (
id INT ( 20 ) NOT NULL auto_increment,
NAME VARCHAR ( 20 ) NOT NULL,
address VARCHAR ( 20 ) NOT NULL,
PRIMARY KEY ( id ) 
) ENGINE = MyISAM;
  1. 대량 삽입 저장 프로 시저를 작성
delimiter //
# 删除表数据
TRUNCATE TABLE t;
# 如果已经有sp_test_batch存储过程,将其删除,后面重新创建
DROP PROCEDURE IF EXISTS sp_test_batch;
# 创建存储过程,包含num和batch输入,num表示插入的总行数,batch表示每次插入的行数
CREATE PROCEDURE sp_test_batch(IN num INT,IN batch INT)
BEGIN
	SET @insert_value = '';
	# 已经插入的记录总行数
  SET @count = 0;
	# 
	SET @batch_count = 0;
	WHILE @count < num DO
		# 内while循环用于拼接INSERT INTO t VALUES (),(),(),...语句中VALUES后面部分
		WHILE (@batch_count < batch AND @count < num) DO
			IF @batch_count>0
			THEN 
				SET @insert_value = concat(@insert_value,',');
			END IF;
			SET @insert_value = concat(@insert_value,"('name", @count, "','address", @count, "')");
			SET @batch_count = @batch_count+1;	
		END WHILE;
 
		SET @count = @count + @batch_count;
		# 拼接SQL语句并执行
		SET @exesql = concat("insert into user(name,address) values ", @insert_value);	
		PREPARE stmt FROM @exesql;
		EXECUTE stmt;
		DEALLOCATE PREPARE stmt;
		# 重置变量值
		SET @insert_value = '';
		SET @batch_count=0;
	END WHILE;
	# 数据插入完成后,查看表中总记录数
	SELECT COUNT(id) FROM user;
END
CALL sp_test_batch(10000000,10000);

데이터 100w 삽입

  1. 테스트 성능          이 걸리는 경우 오프셋과 동일한 10000 : 여기에 우리가 다른로 이동 된 실제 값과 동일한 오프셋 (offset)

 

  • 100000 소모 동일한 오프셋

 

 

  • 1,000,000 소비 동일한 오프셋

 

  • 소모 할 때 500 만에 동일한 오프셋 (offset)

 

 

  • 10,000,000 소비 동일한 오프셋

 

 

그래프는 값으로 그릴 수에서 큰 시간 소모적 더를 오프셋. 이것은 우리가 할 경우 데이터의 수억의 효율성, 우리는 쿼리의이 시간에 상상할 수 얼마나 나쁜 단지 1,000w 데이터입니다. 의 최적화 할 수 있습니다.

4. 최적화

   페이지 매김 서브 쿼리 :

 

 

SELECT * FROM user WHERE  id >=  
(SELECT id FROM user  ORDER BY id LIMIT 9000000, 1) LIMIT 10

从图可以得出子查询确实速度快了一倍。

페이지 매김 가입 :

SELECT * FROM user t1 INNER join
(SELECT id FROM user  ORDER BY id LIMIT 9000000, 10) t2 on t2.id =t1.id

조금 더 하위 쿼리 성능에 가입보다 훨씬.

궁극의 최적화 :

이 성능은 가장 좋은 시간이다. 그렇게 클릭 한 후, 단 하나 여야합니다, 충분하지 않습니다 얼마나 많은 페이지를 지정할 수 있습니다 직접 페이징의 종류 인 경우 가장 큰 ID 쿼리 최적화 중 하나는,이 전면에 의존해야합니다.

SELECT id FROM user  where id > 9000000 ORDER BY id  LIMIT 10;

의사 ID 열 매김, 당신은 캐시에 동시에 데이터를로드하는 페이지의 전체 양을 여러 스레드를 조회 할 수 있습니다.

ID의 범위를 부여하려면


select id from(
SELECT @rownum:=@rownum+1 AS rownum, id FROM   user as t1 ,(SELECT @rownum:=0) t2 order
by t1.id asc
) t3 where t3.rownum%5000=0

* 여기서 사용자로부터 ID> 0 ID <= 5000까지 ID 최대 선택

게시 55 개 원래 기사 · 원 찬양 31 ·은 80000 +를 볼

추천

출처blog.csdn.net/zengfanwei1990/article/details/105320440