调整优化您的LAMP应用程序的5种简单方法

2019-04-09 03:26:20王冬梅
EXPLAIN,它会返回查询计划,而非结果集,如清单 2 所示。


清单 2. MySQL EXPLAIN 结果

				
mysql> explain select * from accounts inner join leads on accounts.id = leads.account_id;
+----+-------------+----------+--------+--------------------------+---------+---
| id | select_type | table  | type  | possible_keys      
 | key   | key_len | ref            | rows | Extra |
+----+-------------+----------+--------+--------------------------+---------+--------
| 1 | SIMPLE   | leads  | ALL  | idx_leads_acct_del    | NULL  | NULL  
| NULL           | 200 |    |
| 1 | SIMPLE   | accounts | eq_ref | PRIMARY,idx_accnt_id_del | PRIMARY | 108  
| sugarcrm.leads.account_id |  1 |    |
+----+-------------+----------+--------+--------------------------+---------+---------
2 rows in set (0.00 sec)

MySQL 手册更深入探究 EXPLAIN 输出的主题(参见 参考资料),但是我考虑的一项重要内容是 ‘type' 列为 ‘ALL' 的地方,因为这需要 MySQL 做一个全表扫描,且不需要键来执行查询。这些帮助您在添加索引时会大幅提高查询速度。

有效缓存数据

正如我们在上一节看到的,数据库往往容易成为您 web 应用程序性能的最大痛点。但是如果您要查询的数据不经常改变怎么办?在这种情况下,一个好的选择就是在本地存储这些结果,而非针对每个请求调用查询。

我们之前探究的两个操作码缓存 APC 和 Wincache 具有实现上述操作的工具,其中您可以将 PHP 数据直接存储到一个共享内存段中,便于快速查询。清单 3 提供了具体示例。


清单 3. 使用 APC 缓存数据库结果的示例

				
<?php

function getListOfUsers()
{
  $list = apc_fetch('getListOfUsers');
  
  if ( empty($list) ) {
    $conn = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass');
    $sql = 'SELECT id, name FROM users ORDER BY name';
    foreach ($conn->query($sql) as $row) {
      $list[] = $row;
    }
    
    apc_store('getListOfUsers',$list);
  }
  
  return $list;
}

我们仅需一次执行查询。之后,我们将结果推送到 getListOfUsers 键下的 APC 缓存中。从这里开始,直到缓存到期,您就能够直接从缓存中获取结果数组,跳过 SQL 查询。

APC 和 Wincache 并非一个用户缓存的惟一选择;memcache 和 Redis 是不需要您在与 Web 服务器相同的服务器上运行用户缓存的其他流行选择。这就提高了性能和灵活性,特别是当您的 web 应用程序跨多个 Web 服务器向外扩展时。

在本文中,我们探究了调优您的 LAMP 性能的 5 种简单方法。我们不仅通过利用一个操作码缓存和优化 PHP 配置探究了 PHP 级别的技术,而且探究了如何优化您的数据库设计来实现合理的索引编制。我们还探讨了如何利用一个用户缓存(以 APC 为例)来展示如何在数据不经常改变时避免重复的数据库调用。

相关文章 大家在看