1.减少连接次数和重用连接
建立与数据库的初始连接从来都不是很容易的事情。除非PHP脚本在完成一些异乎寻常密集的计算任务,否则整个数据库的交互将是代码中最耗费时间和资源的部分。
这里有两个潜在对立的目标。一方面,你会希望在代码中为打开一个全新的数据连接所进行的昂贵、耗时的调用的次数最少。这表明在页面执行期间应该一直打开连接,而不是关闭后再打开。另一方面,有时数据库程序可以支持的同时连接数有很严格的限制,表明应该在可能的情况下就关闭连接,使每个脚本连接着的时间更少,以允许同时执行更多的脚本。
1.1每条语句有一个连接
常用的规则是只要在单个页面的脚本的执行过程中需要,就一直打开单个连接。
1.2多个结果不需要多个连接
一个效率很低的做法是:使用许多数据库程序时,都有可能一次保留多个查询得到的结果(即使只打开了一个连接)。
1.3永久的连接
最后,如果已经确定打开新的数据库连接会降低性能,那么我们就会希望打开永久的连接。和常规的数据库连接不一样,当页面退出时不会自动断开这些连接(甚至当调用mysql_close()时也是如此),而是保存在缓冲池中以后再用。脚本第一次打开这样的连接时,其资源的耗费方式和常规数据库连接一样。但是,被执行的下一个脚本根据请求可能得到完全相同的连接,这样就省去了重新打开新连接的时间(只有在新请求的参数一样时才会重用前一个连接)。
对于MySQL,请求这样的永久连接的PHP函数是mysql_pconnect(),使用它的方式和mysql_connect()一样。
永久数据库连接只用于PHP的模块安装形式。如果CGI版本的PHP中请求永久连接,则只能得到常规的连接。
除了效率能提高以外,永久数据库连接不提供超出常规数据库连接以外的任何功能。特别是,不应该期望永久数据库连接对从以前页面执行程序得到的查询或变量有任何“记忆”。
2.使用数据库提供的功能
常用的规则是,除非愿意在自己的程序中花费大量的精力优化代码,否则最好使用数据库提供的功能,而不要使用自己的解决方案实现同样的任务。
2.1很可能比自己的方案快
如果可能的话,任何对数据库内容的搜索或排序最好在数据库内完成,而不是用自己编写的代码完成。
2.2用例循环却没有限制它
正确的做法是用“WHERE”子句限制查询。WHERE子句确保首先值选出用户关心的记录。这样不仅减少通过SQL连接传递的数据,而且在数据库一端找到记录的正确位置的代码也比PHP代码快得多。
当编写代码对从数据库中返回的数据进行排序、计算、求平均值或者对结果进行集合操作时,应该应用完全一样的参数。一般情况下,SQL中的ORDER BY语句允许根据在查询结果中有任何优先次序的字段列表,对检索出的记录预先排序,这样的排序很可能比自己编写的代码或PHP数组排序函数更有效。类似的,不要在数据库记录中据环进行计数、求和和求平均值操作,而要调查一下自己使用的数据库中的SQL语法是否支持GROUP BY结构和内部查询函数,如count()、sum()和average()。
2.3创建日期和时间字段
对于大多数数据库系统,不需要通过曲折的办法把一个字段设置成当前的日期或时间。许多数据库有得到当前日期的函数,可以直接嵌在查询语句中。
而且,即使需要存储的时间不是执行查询当前的时间,也仍然有比在脚本中构建可读的日期字符串要好的其他方法。除了返回当前日期的函数以外,许多SQL版本提供执行日期算术操作的函数——从某一个日期/时间/开始,然后加上或减去几年、几个月或几个小时。在MYSQL中,这些函数有:
l date_add(date,date-interval)
l date_sub(date,date-interval)
这里,date-interval是包括几个时间单位和单位类型的字符串。下面的MYSQL查询语句把所有的记录设置成从现在开始的一个星期后:
$query=”update mytable set mydate=date_add(now(),’7days’)”;
2.4寻找最后插入的记录
一些数据库系统提供的另一个惊人的有用功能是寻找插入的最后一条记录的ID。
在需要插入最后一条记录的情况下,最好的方案是使数据库自己以检索的方式跟踪最后插入的ID,并在每个连接基础上进行跟踪,这样不必担心同步的问题。对于MYSQL用户,PHP提供的函数mysql_insert_id(),该函数把连接ID当作参数,返回最后插入的记录自动增长的ID。
对于许多PHP/MYSQL函数,mysql_insert_id()的连接参数是可选的,默认是最近打开的连接。
在一些其他的数据库系统中,最近增长的ID可以是能被嵌在下一个查询中的“特殊”变量。例如,在Microsoft SQL Server上,变量是’%%identity’,它可以被嵌在查询中,检索最后插入的ID,如下所示:
$query=”select @@identity”;
3.小结
数据库编码的基本原则很简单。打开和数据库的连接要耗费很多时间和资源,所以不要不必要的打开和关闭数据库连接。要记住,通道是很窄的,应该用来传输每页需要的最少数据。需要学习使用数据库提供的所有功能。SQL非常擅长排序、过滤、约束、计数和分组——使用PHP实现这些功能速度要慢。