128june

[Mysql] where 뒤의 조건은 몇번이나 반복할까? 본문

Database/Mysql

[Mysql] where 뒤의 조건은 몇번이나 반복할까?

128june 2020. 6. 18. 09:52
반응형

먼저 1,000개의 데이터를 가진 Table test가 있습니다.

간단히 num과 title을 가진 test 테이블에 1,000개의 데이터를 넣어보겠습니다.

넣는 방식은 Procedure을 생성하여 반복문으로 넣었습니다.

DELIMITER //
DROP PROCEDURE if EXISTS test_loop1//
CREATE PROCEDURE test_loop1()
BEGIN
	DECLARE i INT DEFAULT 1;
	while i <= 1000 do
		INSERT INTO test ( num, title)
		VALUES (i, CONCAT(i,'번째 글 입니다.') );
		SET i = i + 1;
	END while;
END//
DELIMITER ;

CALL test_loop1();

1000개의 행이 들어간 'test'라는 Table

다음과 같이 SQL 구문을 작성하면 where 조건은 몇번이나 반복할까요?

select * from test where title like '%번째%';

/* 영향 받은 행: 0  찾은 행: 1,000  경고: 0  지속 시간 2 쿼리: 0.016 초 */

당연히 test Table 전체의 개수를 확인하는 1,000번 반복됩니다.

 

만약 num 중 1이 들어가는 번호를 찾아본다고 해도

테이블 전체를 확인하기 위해 1,000번 반복되고 이후 검색된 272개의 행을 출력합니다.

select * from test where num like '%1%';

/* 영향 받은 행: 0  찾은 행: 272  경고: 0  지속 시간 2 쿼리: 0.000 초 */

 


같은 방식으로 10만개의 데이터를 가진 board Table을 만들어봅니다. (reg_date는 default로 now()를 설정하였습니다)

DELIMITER //
	DROP PROCEDURE if EXISTS test_while_loop//
	CREATE PROCEDURE test_while_loop2()
	BEGIN
		DECLARE i INT DEFAULT 1;
		while i <= 100000 do
			INSERT INTO board (id, pid, user_id, user_name,  subject,  contents,  views)
			VALUES (i, 0, CONCAT('aaa',i), CONCAT('홍길동',i), CONCAT('제목 : ',i), CONCAT(i, '번째 글 입니다.'), 0);
			SET i = i+1;
		END while;
	END//
DELIMITER ;

CALL test_while_loop2();

100,000개의 데이터를 가진 board Table

subject에서 where 구문으로 '제목 : '을 검색하여 보면 당연히 100,000번 실행이됩니다.

select * from board WHERE subject LIKE "%제목 : %";

/* 영향 받은 행: 0  찾은 행: 100,000  경고: 0  지속 시간 2 쿼리: 0.016 초 (+ 0.390 초 네트워크) */

이제 두 테이블을 Join하여 데이터를 출력해 봅시다.

SELECT * FROM board 
  JOIN test
    ON board.id = test.num;

test 와 board Table을 join 하여 출력한 table, 왼쪽에는 board의 내용 / 오른쪽 num과 title은 test의 내용이다.

다음과 같은 1,000개의 행을 찾을 수 있었습니다.

여기서! board와 test Table은 총 몇번 실행되었을까요?

바로 1,000 X 100,000 = 100,000,000 번, 즉 1억번 실행됩니다. (board 행 하나당 test 전체를 검색합니다!)

 

그럼 board의 데이터가 100,000개라고 가정한다면?

총 100억번 검색을 실행할 것이고, 당연히 무게가 무거워질 것입니다.

 

따라서 쿼리를 작성할 때 무작정 검색하기보단 효율성을 생각해야 합니다.

반응형
Comments