SQL_NO_CACH가 작동하지 않습니다.
이 SQL을 처음 실행할 때는 39초가 필요합니다. 다시 실행하여 SQL_NO_CACHE를 늘리면 적용되지 않는 것 같습니다.
mysql> select count(*) from `deal_expired` where `site`=8&&`area`=122 &&
endtime<1310444996056;
+----------+
| count(*) |
+----------+
| 497 |
+----------+
1 row in set (39.55 sec)
mysql> select SQL_NO_CACHE count(*) from `deal_expired` where `site`=8&&`area`=
122 && endtime<1310444996056;
+----------+
| count(*) |
+----------+
| 497 |
+----------+
1 row in set (0.16 sec)
다양한 방법을 시도해봤는데요, 여기서.
그리고 심지어 mysql 서버를 다시 시작하거나 테이블 이름을 변경하기도 하지만 여전히 39초 동안 이 SQL을 실행할 수 없습니다.
다른 SQL을 교체했는데 SQL_NO_CACHE에서 첫 번째 실행이 증가하면 문제는 동일합니다.
mysql> select SQL_NO_CACHE count(*) from `deal_expired` where `site`=25&&`area`=
134 && endtime<1310483196227;
+----------+
| count(*) |
+----------+
| 315 |
+----------+
1 row in set (2.17 sec)
mysql> select SQL_NO_CACHE count(*) from `deal_expired` where `site`=25&&`area`=
134 && endtime<1310483196227;
+----------+
| count(*) |
+----------+
| 315 |
+----------+
1 row in set (0.01 sec)
이유가 뭐야?동일한 SQL 실행 시간을 얻으려면 어떻게 해야 합니까?
이 SQL을 39초를 수행하도록 최적화하는 방법을 찾고 싶습니다.
그건 그렇고,RESET QUERY CACHE
FLUSH QUERY CACHE
FLUSH TABLES
SET SESSION query_cache_type=off
작동하지 않음
mysql 상태 캐시가 닫혔습니다.
mysql> SHOW STATUS LIKE "Qcache%";
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Qcache_free_blocks | 0 |
| Qcache_free_memory | 0 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 0 |
+-------------------------+-------+
8 rows in set (0.04 sec)
mysql> select count(*) from `deal_expired` where `site`=25&&`area`=134 && endtime<1310
483196227;
+----------+
| count(*) |
+----------+
| 315 |
+----------+
1 row in set (0.01 sec)
mysql> SHOW STATUS LIKE "Qcache%";
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Qcache_free_blocks | 0 |
| Qcache_free_memory | 0 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 0 |
+-------------------------+-------+
8 rows in set (0.00 sec)
이 SQL, 사용된 site+endtime composite index(site_endtime이라는 이름)에 대해 설명합니다.
mysql> explain select count(*) from `deal_expired` where `site`=8&&`area`=122 && endti
me<1310444996056;
+--------+------+-------------------------------+--------------+---------+------
-+------+-------------+
| table | type | possible_keys | key | key_len | ref
| rows | Extra |
+--------+------+-------------------------------+--------------+---------+------
-+------+-------------+
| deal_expired | ref | name,url,endtime,site_endtime | site_endtime | 4 | const
| 353 | Using where |
+--------+------+-------------------------------+--------------+---------+------
-+------+-------------+
1 row in set (0.00 sec)
첫 번째 쿼리는 SQL_NO_CACHE를 사용하여 MySQL에 결과를 캐시에 넣지 않도록 해야 합니다.두 번째 쿼리는 캐시를 사용하고 이는 MySQL에 해당 쿼리의 결과를 캐시하지 말라고 지시하며 이는 아무 것도 하지 않습니다.
tl;dr - 쿼리를 되돌립니다.
"동일한 SQL 실행 시간을 얻으려면 어떻게 해야 합니까?"에 대한 답은 - 그럴 수 없습니다.쿼리가 일부 행을 읽는 경우 사용 중인 스토리지 엔진에 따라 캐시되며, 해당 행은 OS 캐시(myisam) 또는 버퍼 풀(innodb)에 있습니다.행이 캐시된 경우 MySQL은 디스크에서 읽을 필요가 없기 때문에 동일한 쿼리를 두 번째로 실행하는 것이 훨씬 빠릅니다.
현재 런타임에 계산되는 SQL 함수를 포함하면 캐시가 되지 않는다는 인상을 받았습니다.다음과 같은 일을 해보셨나요?
select count(*), now() from `deal_expired` where `site`=8&&`area`=122 && endtime<1310444996056;
- 참조: http://forums.mysql.com/read.php?24,225286,225468#msg-225468
- 당신은 시도해 볼수 있습니다.
RESET QUERY CACHE
(RELOAD 권한이 필요합니다) 이 위의 링크를 방금 읽은 것도 아마 작동하지 않을 것입니다 :(
언급URL : https://stackoverflow.com/questions/6666631/sql-no-cache-does-not-work
'source' 카테고리의 다른 글
이 C 코드의 취약한 점은 무엇입니까? (0) | 2023.10.07 |
---|---|
Woocommerce 체크아웃 페이지에서만 총 가격에 텍스트 추가 (0) | 2023.10.07 |
f가 x를 수정하면 x*f(x)의 값이 지정되지 않습니까? (0) | 2023.10.07 |
각도 모듈 구성이 호출되지 않음 (0) | 2023.10.07 |
Oracle에서 CREATE 명령을 사용하여 열 이름을 큰따옴표로 묶으면 제대로 작동하지 않습니다. 이유는 무엇입니까? (0) | 2023.10.07 |