SQL_CALC_FOUND_ROWS와 FOUND_ROWS()

SELECT {...} FROM {테이블} WHERE {조건} LIMIT M, M+N
형식의 문법을 많이들 사용하실텐데..
전체 결과값을 구하기 위해 LIMIT를 제외한 앞문장에서 {...} 부분에 "COUNT(*)"을 써서 쿼리를 한 번 더 날려서 처리하곤 했습니다.
WHERE {조건}을 2번 처리해야 하는 비효율적인 코드를 남발했는데,
MySQL 4.0대에서 지원하는 Query Caching 기능의 일부로서 SQL_CALC_FOUND_ROWS가 들어간 문장에 대해 LIMIT와 상관없이 전체 결과값을 버퍼에 저장하고 FOUND_ROWS() 함수로 값을 가져올 수 있습니다.

검색 결과 리스트를 구할 때 아래와 같은 쿼리를 썼다면,

SELECT SQL_CALC_FOUND_ROWS
CI.cid, CI.sid, CI.ts, CI.perm, CD.title, W.wid, W.name
FROM ContentInfo CI LEFT JOIN ContentData CD USING (cid)
LEFT JOIN Writer W ON W.wid=CI.wid
WHERE INSTR(CD.title, '검색') OR INSTR(CD.body, '검색')
ORDER BY CI.ts DESC
LIMIT 0, 20

아래와 같이 LIMIT와 상관없는 전체 결과값을 얻을 수 있습니다.

SELECT FOUND_ROWS()


*주의: InnoDB 타입이 아닌 경우, 또는 동시접속이 많은 곳에서 TRANSACTION과 함께 사용하지 않을 때 제대로 작동할지 여부에 대해서는 아직 알아보지 못했습니다.

다른 데이터 베이스에서는 아직 미지원입니당 ~

참조 페이지입니다.
http://www.mysql.com/doc/en/Query_Cache_How.html
http://www.mysql.com/doc/en/SELECT.html

Posted by 웅쓰

2006/10/09 10:40 2006/10/09 10:40
Response
1383 Trackbacks , 9 Comments
RSS :
http://comefeel.com/tt/comefeel/rss/response/277


블로그 이미지

웅자의 상상플러스

- 웅쓰

Archives

Authors

  1. 웅쓰

Recent Trackbacks

Calendar

«   2012/02   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Site Stats

Total hits:
289285
Today:
15
Yesterday:
353