2010년 12월 8일 수요일

MySQL 5.1 페이징 쿼리 최적화.

게시판을 작성하다 보면 페이징으로 인해서 부득이 하게 limit 20,10 이런식으로 쿼리를 작성하게 된다. 문제는 LIMIT 20,10 테이블 행의 풀 스캔을 일으킬수 있다는 것이다. 그리고 비용도 많이 드는데 이를 피할 수 있는 방법은 다음과 같다.


[code sql]
select * from xe_comments_list limit 20, 10;
[/code]

이게 과연 효과가 있을까? 다음을 보자.


[code sql]

mysql> explain extended select * from xe_comments_list limit 20, 10;
+----+-------------+------------------+------+---------------+------+---------+------+---------+----------+-------+
| id | select_type | table            | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra |
+----+-------------+------------------+------+---------------+------+---------+------+---------+----------+-------+
|  1 | SIMPLE      | xe_comments_list | ALL  | NULL          | NULL | NULL    | NULL | 1016616 |   100.00 |       |
+----+-------------+------------------+------+---------------+------+---------+------+---------+----------+-------+
1 row in set, 1 warning (0.00 sec)

mysql> show status like 'last_query_cost';
+-----------------+---------------+
| Variable_name   | Value         |
+-----------------+---------------+
| Last_query_cost | 208867.199000 |
+-----------------+---------------+
1 row in set (0.00 sec)

mysql> explain extended select head, arrange from xe_comments_list inner join ( select comment_srl from xe_comments_list limit 20, 10) as lim using(comment_srl);
+----+-------------+------------------+--------+---------------+---------+---------+-----------------+---------+----------+-------------+
| id | select_type | table            | type   | possible_keys | key     | key_len | ref             | rows    | filtered | Extra       |
+----+-------------+------------------+--------+---------------+---------+---------+-----------------+---------+----------+-------------+
|  1 | PRIMARY     | <derived2>       | ALL    | NULL          | NULL    | NULL    | NULL            |      10 |   100.00 |             |
|  1 | PRIMARY     | xe_comments_list | eq_ref | PRIMARY       | PRIMARY | 8       | lim.comment_srl |       1 |   100.00 |             |
|  2 | DERIVED     | xe_comments_list | index  | NULL          | PRIMARY | 8       | NULL            | 1016616 |   100.00 | Using index |
+----+-------------+------------------+--------+---------------+---------+---------+-----------------+---------+----------+-------------+
3 rows in set, 1 warning (0.00 sec)

mysql> show status like 'last_query_cost';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| Last_query_cost | 0.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

[/code]


last_query_cost 가 join 을 하는 방법이 더 적다.

2010년 12월 3일 금요일

Dag 저장소 추가.

Yum 은 매우 사용하기 편하고 훌륭한 패키지 관리 프로그램입니다. 패키지의 의존성, 버전관리등을 편리하게 해줍니다. 그런데 Yum 은 리눅스 배포판에 의존적이어서 셀수도 없이 많은 패키지들의 관리를 제공하지는 않습니다. 그래서 Third party 에서 많은 패키지들을 제작하고 Yum 저장소(Repository)도 함께 제공하는데, Yum 은 이 저장소 주소를 추가하는 것만으로도 Third party 패키지도 관리할 수 있습니다.

[code bash]
]# vim /etc/yum.repos.d/Dag.repo
[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
enabled=0

]# rpm --import http://tacitus.textcube.com/139/attach/RPM-GPG-KEY.dag.txt
[/code]

이렇게 하면 준비가 끝난 것입니다. 사용은 다음과 같이 합니다.

[code bash]
]# yum --enablerepo=dag search ncftp
[/code]

특징은 '--enablerepo=dag' 를 사용해야 한다는 것입니다. (물론, Dag.repo 파일에서 enabled=1로 설정하면 옵션 사용을 하지 않아도 됩니다.)