日期:2010-12-20  浏览次数:20387 次

对查询进行缓存

上个月,我们简单地了解了ADOdb中,如何进行SELECT、INSERT和UPDATE的操作。如果你在ADOdb上是个新手,我建议先读一下那篇文章。 ADOdb 还有很多更高级的特征,这个月,我们就一起来关注其中的部分内容。

数据库时常会成为应用程序效率低下的祸首。尽量减少对数据库的查询,是提高执行效率的方法之一。这,通常可以通过对整页内容进行缓存(有很多种方法来实现。比如,PEAR->Cache),或者,如果你需要做一张动态页面,并且只想让查询指令被缓存,那么,你可以使用ADOdb,简单地将查询指令缓存起来。在你视图通过缓存来提高你的应用程序的糟糕性能之前,我建议你先试图去优化你的查询指令。有时候,一些简单的索引可以改变一切——有太多的所谓的专业的解决方案,都在使用糟糕的索引。在本文中,你能找到很多这样的实例。现在,让我们来看看ADOdb是如何使你能够对数据库的查询结果进行缓存的。在这个实例中,ADOdb把我们的最后的一次查询的结果保存在/var/tmp/adodb_cache这个缓存文件中,并保留10分钟。

include("$adodb_path/db_values.inc.php");

include("$adodb_path/adodb.inc.php");

$db = NewADOConnection('$database_type');

$db->Connect("$host", "$user", "$password", "employees");

$ADODB_CACHE_DIR = "/var/tmp/adodb_cache"; //Directory to store cached files

$sql = "SELECT surname, age FROM employees";

$rs = &$db->CacheExecute(600,$sql);  // Executes, and caches the results for 600 seconds

if (!$rs) {

print $db->ErrorMsg(); // Displays the error message if no results could be returned

}

else {

while (!$rs->EOF) {

 print $rs->fields[0].' '.$rs->fields[1].'<BR>';

  // fields[0] is surname, fields[1] is age

 $rs->MoveNext();  //  Moves to the next row

}  // end while

} // end else


CacheExecute() 函数有两个参数: 第一个参数是缓存文件将被保留的时间,以秒计时;第二个参数是 SQL 声明。 第一个参数是可选择的 (一些开发者或许会认为它应当成为第二个参数) ,如果你没有限定时间,那么,默认值是 3600 秒,也就是1个小时。缓存文件被命名为 adodb_*.cache,你可以在文件系统中安全地将他们删除。你应该定期清楚过期的缓存文件(用UNIX的“crontab万年历”,或者WINDOWS的“计划任务”。译者注:万年历不知有没有译错,我没有UNIX。)。要注意的是,要使用缓存方法,你需要将PHP的参数magic_quotes_runtime设为off(译者注:在php.ini中,将值设为0)。你可以根据需要,在运行时修改它的值:

set_magic_quotes_runtime(0);

只需将上述代码放到你调用数据库的指令之前就可以了。你可以在任何时候,通过调用CacheFlush();来清除缓存。处于对安全的考虑,ADOdb 也建议将PHP的参数register_globals 设为0(在PHP最新版中,这是默认值) 。

更多关于查询结果的信息

开发者通常会对他们的要得到的结果产生一些质疑,最通常的问题是:有多少个记录?ADOdb能够很容易地通过RecordCount()来回答这个问题。 RowCount()是同义函数。

$sql = "SELECT surname, age FROM employees";

$rs = &$db->CacheExecute(600,$sql);  // Executes, and caches the results for 600 seconds

print $rs->RecordCount() . " rows returned]"; // Display number of rows returned


或许第二个问题会产生在需量列表上:被返回字段数量是多少?不用担心,ADOdb有FieldCount()。

$sql = "SELECT surname, age FROM employees";

$rs = &$db->CacheExecute(600,$sql);  // Executes, and caches the results for 600 seconds

print $rs->FieldCount() . " columns returned]"; // Display number of rows returned


限制结果

上次我们讨论了如何通过使用一个数据库库函数使你的应用程序更简洁,更易于移植。在从MySQL转移到 Informix中 , 我经历了一次痛苦的移植过程。一切都归咎于非ANSII标准的LIMIT子句( 举例来说, 在MySQL中允许下列指令:SELECT name FROM employee LIMIT 15),它是一个非常有用的功能,可在Informix中却不被支持。(在Informix中,相同功能的书写应该是:SELECT FIRST 15 name FROM employee in Informix。)它似乎对你敲响了警钟,要你停止在你的查询中使用非标准SQL的指令,而去认真地学习标准的SQL。幸运的是,ADOdb有一个处理LIMIT的方法:SelectLimit()。

$sql = "SELECT surname, age FROM employees";

$rs = &$db->SelectLimit($sql, 10, 100); // Select 10 rows, starting at row 100

if (!$rs) {

print $db->ErrorMsg(); // Displays the error message if no results could be returned

}

else {

while (!$rs->EOF) {

 print $rs->fields[0].' '.$rs->fields[1].'<BR>';

  // f