본문 바로가기
MySql

MySQL 거대한 테이블의 MySQL 최적화

by 베이스 공부 2020. 10. 12.
반응형

특정 SELECT 쿼리에서 속도 향상을 위해 노력해 왔습니다. The situation is as follows: There is a (in my eyes) huge crossing table. It currently has about 20 million rows, but I expect this to grow alot. 이 교차 테이블을 기반으로 다른 테이블을 만들어야합니다. 이렇게하려면 다음 쿼리를 실행해야합니다.

SELECT hugeCrossingTable.field3, otherTable.field1, hugeCrossingTable.field2 * otherTable.field3 AS someName
FROM hugeCrossingTable 
INNER JOIN otherTable ON hugeCrossingTable.field1 = otherTable.field2

이제 이것은 현재 약 백만 개의 행을 생성합니다. 두 테이블의 field1에 이미 인덱스가 있지만 완료하는 데 여전히 18 분이 걸립니다. 테이블 분할에 대해 생각했지만 데이터를 분할하는 방법을 찾아야합니다. 데이터를 분할하는 방법에 대한 방법을 찾아야합니다. 이것은 교차 테이블 일 뿐이므로이를 수행하는 방법에 대해서는 아무 생각도하지 않습니다.

이것이 어떻게 최적화 될 수 있는지에 대한 아이디어가 있습니까?

감사.

요청에 따라 다음은 create 문입니다.

CREATE TABLE  `hugeCrossingTable` (
  `field` int(11) NOT NULL,
  `field1` int(11) NOT NULL,
  `field2` double(10,5) DEFAULT NULL,
  `field3` int(4) DEFAULT NULL,
  KEY `field1` (`field1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE  `otherTable` (
  `field` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `field1` int(10) unsigned NOT NULL,
  `field2` int(10) unsigned NOT NULL,
  `field3` decimal(5,2) NOT NULL,
  PRIMARY KEY (`field`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

그리고 Explain 출력 :

id, select_type, table              , type , possible_keys, key     , key_len, ref                , rows, Extra
1 , 'SIMPLE'   , 'otherTable'       , 'ALL', ''           , ''      , ''     , ''                 , 294 , ''
1 , 'SIMPLE'   , 'hugeCrossingTable', 'ref', 'field1'     , 'field1', '4'    , 'otherTable.field2', 69  , 'Using where'

 

해결 방법

 

다음은 약의 큰 테이블에서 작동하는 몇 가지 innodb 예제입니다. 잘 설계된 innodb 테이블의 장점과 클러스터형 인덱스를 가장 잘 사용하는 방법을 보여주는 60 ~ 5 억 행 (innodb에서만 사용 가능)




또한 다음을 읽어야합니다.



테이블 디자인을 분류하고 innodb 구성을 최적화했으면 :



다음과 같이 시도 할 수 있습니다.

start transaction;

insert into target_table (x,y) select x,y from source_table order by x,y;

commit;

도움이 되었기를 바랍니다.

 

참조 페이지 https://stackoverflow.com/questions/5557838

 

 

반응형

댓글