使用查询缓存
查询缓存的目的很简单,将 select 查询的结果缓存在内存中,以供下次直接获取。在默认情况下,MySQL 是没有开启查询缓存的,我们可以进行以下配置:
query_cache_size = 268435456
query_cache_type=1
query_cache_limit=1048576
这样一来,MySQL 将拥有 256 MB的内存空间来查询缓存结果、对于以 select 为主的查询应用,查询缓存理所当然地起到性能提升的作用,无论是 Innodb 还是 MyISAM,查询缓存都可以很好地工作,因为它在逻辑中位于比较高的层次。
-- -- 表的结构 `count_t` -- CREATE TABLE `count_t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `count` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
我们编写了一段 PHP 代码来比较查询缓存对 select 查询性能的影响,代码如下所示:
<?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "runoob"; // 创建链接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查链接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } for($i = 1;$i <= 1000; $i++) { $sql = "select * from count_t where id = ".$i; $result = $conn->query($sql); } $conn->close();
我们先关闭查询缓存,对它进行压力测试,结果如下所示:
然后我们打开查询缓存,再次进行同样的测试,结果如下所示:
可见,使用了查询缓存后,总时间减少了接近 16%。
但是,查询缓存有一个需要注意的问题,那就是缓存过期策略,MySQL 采用的机制是,当一个数据表有更新操作(比如 update 或者 insert )后,那么涉及这个表的所有查询缓存都会失效。
这样一来,对于 select 和 update 混合的应用来说,查询缓存反而可能会添乱,我们编写了以下这段 PHP 代码,将 update 和 select 交替执行,代码如下所示:
<?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "runoob"; // 创建链接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查链接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } for($i = 1;$i <= 100; $i++) { $sql = "UPDATE `count_t` SET `count`=`count`+1 where id = ".$i; $conn->query($sql); $sql = "select * from count_t where id = ".$i; $conn->query($sql); } $conn->close();
不使用查询缓存时,测试结果如下所示:
开启查询缓存后,测试结果如下所示:
使用查询缓存后,花费了更多的时间。
上一篇: PS简单制作超漂亮的叶雕效果
下一篇: PHP 时间、int、字符串转换