使用MySQL查询缓存来加速网站

时间:2020-01-09 10:44:16  来源:igfitidea点击:

加快Web应用程序速度的最佳方法之一是在数据库中启用查询缓存,该数据库将常用的SQL查询缓存在内存中,以便下一个发出相同请求的页面几乎可以即时访问。

该方法之所以如此强大,是因为我们不必对Web应用程序进行任何更改,而只需要牺牲一点内存即可。这不会解决我们所有的问题,但是绝对不会造成伤害。

注意:如果应用程序频繁更新表,那么查询缓存将不断清除,我们将不会从中获得任何好处。这是最适合对数据库进行读取的应用程序的理想选择,例如WordPress博客。如果我们在共享主机上运行,这也将不起作用。

在服务器运行时启用缓存

我们要做的第一件事是确保我们安装的MySQL实际上具有可用的查询缓存支持。大多数发行版都可以,但是仍然应该检查。

我们需要从MySQL控制台运行此命令,它将告诉我们查询缓存是否可用。

mysql> show variables like 'have_query_cache';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+

不要误认为这实际上启用了查询缓存,因为大多数托管提供程序默认不会启用该功能。奇怪的是,我的Ubuntu Feisty安装已经启用了它

接下来,我们需要检查并查看是否启用了查询缓存。我们将需要检查多个变量,因此我们最好通过检查变量query%一次完成所有操作

mysql> show variables like 'query%';
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| query_alloc_block_size       | 8192    |
| query_cache_limit            | 1048576 |
| query_cache_min_res_unit     | 4096    |
| query_cache_size             | 8388608 |
| query_cache_type             | ON      |
| query_cache_wlock_invalidate | OFF     |
| query_prealloc_size          | 8192    |
+------------------------------+---------+

以下是列表中的重要项目及其含义:

  • query_cache_size这是缓存的大小(以字节为单位)。将此值设置为0将有效地禁用缓存。

  • query_cache_type此值必须为ON或者1,以默认情况下启用查询缓存。

  • query_cache_limit这是将被缓存的最大查询大小(以字节为单位)。

如果将query_cache_size值设置为0或者只想更改它,则需要运行以下命令,请记住该值以字节为单位。例如,如果我们想为高速缓存分配8MB,我们将使用1024 * 1024 * 8 = 8388608作为值。

SET GLOBAL query_cache_size = 8388608;

同样,可以使用相同的语法设置其他选项:

SET GLOBAL query_cache_limit = 1048576;
SET GLOBAL query_cache_type = 1;

现在我们如何确定它是否确实在工作?我们可以使用SHOW STATUS命令提取所有以Qc开头的变量,以了解幕后情况。

mysql> SHOW STATUS LIKE 'Qc%';
+-------------------------+--------+
| Variable_name           | Value  |
+-------------------------+--------+
| Qcache_free_blocks      | 65     | 
| Qcache_free_memory      | 201440 | 
| Qcache_hits             | 18868  | 
| Qcache_inserts          | 2940   | 
| Qcache_lowmem_prunes    | 665    | 
| Qcache_not_cached       | 246    | 
| Qcache_queries_in_cache | 492    | 
| Qcache_total_blocks     | 1430   | 
+-------------------------+--------+
8 rows in set (0.00 sec)

我们会在统计数据中注意到,我还有足够的可用内存。如果服务器显示大量的低级修剪,则可能需要考虑增加此值,但我不会在用于Web服务器的查询缓存上花费过多的内存,而需要为apache,php,ruby或者其他资源保留可用内存我们正在使用。

在配置文件中启用

如果我们希望这些更改在mysql服务器重新启动或者重启后仍然存在,则需要将它们添加到MySQL的/etc/mysql/my.cnf配置文件中。请注意,它可能在安装中的其他位置。

使用sudo或者root模式的文本编辑器打开文件,然后添加这些值(如果文件中尚不存在这些值)。如果确实存在,则取消注释。

query_cache_size = 268435456
query_cache_type=1
query_cache_limit=1048576

查询缓存可以显着提高Web应用程序的速度,尤其是在应用程序确实主要读取的情况下。