Bug #40986 | Leading line comments prevent Query Cache from caching result. | ||
---|---|---|---|
Submitted: | 24 Nov 2008 16:29 | Modified: | 7 Jul 2017 9:44 |
Reporter: | David Walker | Email Updates: | |
Status: | Won't fix | Impact on me: | |
Category: | MySQL Server: Query Cache | Severity: | S3 (Non-critical) |
Version: | 4.1, 5.0, 5,1, 6.0 bzr | OS: | Any |
Assigned to: | CPU Architecture: | Any | |
Tags: | query cache comment |
[24 Nov 2008 16:29]
David Walker
[24 Nov 2008 16:32]
David Walker
Sorry, the manual page I was trying to refer to was: http://dev.mysql.com/doc/refman/5.0/en/query-cache-how.html (Not the comment syntax page.)
[4 Apr 2009 20:42]
Sveta Smirnova
Thank you for the report. Verified as described. PHP test case: <? $mysqli = mysqli_connect('127.0.0.1', 'root', '', 'test', 4040); mysqli_multi_query($mysqli, ' flush status; drop table if exists t1; create table t1(id int); insert into t1 values(1),(2),(3),(3),(4),(5); insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1;'); do { if ($res = $mysqli->store_result()) { $res->free(); } } while ($mysqli->next_result()); echo "show status like 'Qcache%':\n"; var_dump(mysqli_error($mysqli)); mysqli_multi_query($mysqli, "show status like 'Qcache%'"); do { if ($res = $mysqli->store_result()) { while ($row = mysqli_fetch_array($res)) echo $row[0] . ': ' . $row[1] . "\n"; $res->free(); } }while ($mysqli->next_result()); //$query = "select * from t1"; $query="--comment\nselect * from t1"; mysqli_multi_query($mysqli, $query); do { if ($res = $mysqli->store_result()) { $res->free(); } } while ($mysqli->next_result()); mysqli_multi_query($mysqli, $query); do { if ($res = $mysqli->store_result()) { $res->free(); } } while ($mysqli->next_result()); mysqli_multi_query($mysqli, $query); do { if ($res = $mysqli->store_result()) { $res->free(); } } while ($mysqli->next_result()); echo "Error: " . mysqli_error($mysqli) . "\n"; mysqli_multi_query($mysqli, "show status like 'Qcache%'"); echo "show status like 'Qcache%':\n"; do { if ($res = $mysqli->store_result()) { while ($row = mysqli_fetch_array($res)) echo $row[0] . ': ' . $row[1] . "\n"; $res->free(); } }while ($mysqli->next_result()); ?>
[12 May 2010 0:44]
Justin Swanhart
It is a problem with 5.1.45 with non-static comments, even with /* */ comments. I made a PHP test case: <?php $conn = mysql_connect('127.0.0.1','root','',true) or die(mysql_error() . "\n"); function get_counters() { $com_select=0; $qcache_hits=0; global $conn; $stmt = mysql_query("show global status where Variable_name in( 'com_select', 'Qcache_hits' )", $conn) or die(mysql_error() ."\n"); while($row = mysql_fetch_assoc($stmt)) { #print_r($row); if($row['Variable_name'] == 'Com_select') $com_select = $row['Value']; if($row['Variable_name'] == 'Qcache_hits') $qcache_hits = $row['Value']; } return array("cs" => $com_select, "qc" => $qcache_hits); } /* return 1 on qc hit, 0 on miss*/ function test_sql($sql) { global $conn; $sql = sprintf($sql, mt_rand(1,10000)); $old = get_counters(); $stmt = mysql_query($sql, $conn); $new = get_counters(); /* was it a miss? */ if ($new['cs'] - $old['cs'] > 0) return 0; return 1; } function testit($sql, $count=25) { // this will only change the query with %d in it.. $hits = 0; for($i=0;$i<$count;++$i) { if(test_sql($sql) == 1) { ++$hits; } } echo "$sql\nTotal: $count\nHits: $hits\n"; } $sql = "select c1 from test.t1 limit 1"; testit($sql); $sql = " select c1 from test.t1 limit 1"; testit($sql); $sql = "/* static comment*/select c1 from test.t1 limit 1"; testit($sql); $sql = "/* changing comment %d*/select c1 from test.t1 limit 1"; testit($sql); $sql = "/* changing query*/select c1 from test.t1 where c1 <= %d limit 1"; testit($sql); $sql = "-- static comment\nselect c1 from test.t1 limit 1"; testit($sql); echo "\ndone\n"; ----- OUTPUT ----- select c1 from test.t1 limit 1 Total: 25 Hits: 25 select c1 from test.t1 limit 1 Total: 25 Hits: 25 /* static comment*/select c1 from test.t1 limit 1 Total: 25 Hits: 25 /* changing comment %d*/select c1 from test.t1 limit 1 Total: 25 Hits: 0 /* changing query*/select c1 from test.t1 where c1 <= %d limit 1 Total: 25 Hits: 0 -- static comment select c1 from test.t1 limit 1 Total: 25 Hits: 0 done
[12 May 2010 0:52]
Justin Swanhart
I do not think that this should be marked as a feature request. This is clearly a bug with the query cache!
[6 Jul 2010 7:05]
Valeriy Kravchuk
Bug #55016 was marked as a duplicate of this one.
[7 Jul 2017 9:44]
Erlend Dahl
MySQL will no longer invest in the query cache, see: http://mysqlserverteam.com/mysql-8-0-retiring-support-for-the-query-cache/