2012-07-14 3 views
0

나는 이런 식으로 뭔가 간다 쿼리가 있습니다MySQL은 이전 부분의 쿼리를 캐시합니까?

SELECT t1, t2, 
IF(MATCH(t2) AGAINST ('input*' IN BOOLEAN MODE), 10, 0) AS matches, 
IF(t2 LIKE '%input%', 2, 0) AS similar 
FROM tbl 
WHERE t2 LIKE '%input%' 
ORDER BY (matches + similar) DESC 
LIMIT 5 

쿼리가 잘 작동을하지만 난 여부 MySQL이 t2의 두 번 LIKE '% 입력 %'인지 여부를 확인하고 있습니다 약 걱정하는 부분, 또는 첫 번째 결과를 캐시하면 (멋지다!).

감사합니다.

답변

0

죄송합니다. 가난한 사람의 시험으로

이 고려 :

delimiter // 
create function qqq() 
returns int no sql 
begin 
    set @x:[email protected]+1; 
    return 17; 
end // 
delimiter ; 

set @x := 0; 
select qqq(), qqq(), qqq() > 1, qqq() > 1 from dual; 
+-------+-------+-----------+-----------+ 
| qqq() | qqq() | qqq() > 1 | qqq() > 1 | 
+-------+-------+-----------+-----------+ 
| 17 | 17 |   1 |   1 | 
+-------+-------+-----------+-----------+ 

select @x; 
+------+ 
| @x | 
+------+ 
| 4 | 
+------+ 

하나가이 특별한 경우임을 주장 할 수 있지만, 우리는 저장 루틴을 호출하고 있기 때문에, 내장 함수와 반대로, 더는 없다 그 순간의 차이. 모든 것이 재평가됩니다.

향후 변경 될 수 있습니다. 정확히 은 아무 것도 없습니다. 잘 알려진 결정적 기능에서 이러한 최적화가 발생하지 않도록하십시오. 그러나 때로는 최적화 프로그램에서 진단하기가 어려울 수 있습니다.

+0

매우 흥미 롭습니다. 조금 실망스럽지 않으면, ㅎ. 어쩌면 앞으로는 쿼리를 더 잘 수행 할 수있는 방법을 찾을 것입니다.하지만 지금은 이중 LIKE 비교기가 작업을 빨리/충분하게 수행하고있는 것처럼 보입니다. 검색 제안 상자이며 응답은 즉시입니다. – felamaslen

+0

하지만, 필자는 'IF (t2 LIKE'% input % ', 2, 0)'가 ** 항상 ** ** ** 2 ** 일 것입니다. 그 상태! –

+0

예, 틀림없이 그것은 다소 나쁜 예입니다. 내가하는 정확한 쿼리가 아니에요, 그 자리에서 그 생각을했습니다. – felamaslen