[MYSQL] 프로시저 또는 SQL에서 변수 대입에 관한 문제 0 2 3,379

by 클로이 [MySQL] 변수 파라미터 SQL MYSQL 프로시저 [2016.05.03 18:07:37]


MYSQL 쿼리문을 실행 할때, 변수를 써서 WHERE절에 대입하는 것과, 싱글쿼티션으로 싼 상수로 대입하는 것의

실행계획이 다릅니다. 이유는 무엇이며 , 상수를 썼을때와 같이 실행 되도록 하는 방법이 있는지 궁금합니다.

 

EX)

변수 사용시

SET @A := 1;

SELECT *

FROM TABLE

WHERE COLUMN1 = @A;

 

EX2)

상수사용시

SELECT *

FROM TABLE

WHERE COLUMN1 = 1;

 

그냥 옵티마이저한테 기도해야하는건가요...?

 

 

by 마농 [2016.05.04 08:47:43]

상수 사용시 실행계획을 확인하고
변수 사용 쿼리에 해당 실행계획을 유도하게끔 힌트 사용해 보세요.


1. 인덱스 힌트 사용법
 - 인덱스 선택 지정 : FROM table USE    INDEX(인덱스명)
 - 인덱스 무시 지정 : FROM table IGNORE INDEX(인덱스명)
 - 인덱스 강제 지정 : FROM table FORCE  INDEX(인덱스명)
2. 인덱스 확인
 - SHOW INDEX FROM table명


by l2monkeys [2016.05.04 13:55:11]

위처럼 테스트 해보면 실행계획같이 동일 합니다.

꼭 상수때문에 발생하는 문제는 아닌것 같습니다.

mysql> desc city
    -> ;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.09 sec)

mysql> explain select * from city where id=1 ;
+----+-------------+-------+------------+-------+---------------+---------+-----
----+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_
len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+-----
----+-------+------+----------+-------+
|  1 | SIMPLE      | city  | NULL       | const | PRIMARY       | PRIMARY | 4
    | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+---------+-----
----+-------+------+----------+-------+
1 row in set, 1 warning (0.09 sec)

mysql> set @A:=1 ;
Query OK, 0 rows affected (0.08 sec)

mysql> explain select * from city where id =@A ;
+----+-------------+-------+------------+-------+---------------+---------+-----
----+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_
len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+-----
----+-------+------+----------+-------+
|  1 | SIMPLE      | city  | NULL       | const | PRIMARY       | PRIMARY | 4
    | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+---------+-----
----+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입