优化

API 调用

持久连接

通过使用持久连接,我们保持与服务器的连接处于打开状态,这样可以在不关闭和重新打开连接的情况下执行多个查询

需要注意的是,这并不总是一个好的优化方法。试想一下,如果每个托管站点仅使用持久连接,在共享主机环境下,服务器的内存应该能存储多少个持久连接:这会导致内存过载。

许多编程语言都支持持久连接。

释放内存

当你执行查询时,返回的记录集会被存入一个变量。将这些数据保留在内存中,尤其是在不再需要时,是对内存的浪费。因此,通常应该尽早释放内存。如果只能在脚本结束前几行释放内存,那就没有意义了。但在某些情况下,提前释放内存是有益的。

获取行

许多 API 支持两种获取数据行的方式:可以将数据放入常规数组、对象或关联数组中。将数据放入对象中是最慢的方式,而放入普通数组是最快的方式。如果你每行只需要获取一个值,那么将其放入数组中可能是个不错的主意。

API 与 SQL

通常,API 支持某些方法,这些方法会创建 SQL 语句并将其发送到 MySQL 服务器。你也可以手动创建语句来实现相同的效果,但这样是最慢的方式。API 方法通常更优化。

减少客户端/服务器通信

有些脚本使用两个查询来提取数据透视表。客户端与服务器的通信通常是瓶颈,因此你应该尽量只使用一个 JOIN 查询

如果你需要使用多个查询,尽量使用一个连接。如果可能,避免在 SQL 命令中包含太多无意义的字符(如空格、制表符、注释等)。

CREATE ... SELECT, INSERT ... SELECT

当你从现有表创建新表时,应该使用 CREATE ... SELECT。当你希望从查询中填充现有表时,应该使用 INSERT ... SELECTREPLACE ... SELECT。这样,你可以通过发送一个 SQL 语句来告知服务器执行所有需要的操作。

INSERT DELAYED

许多脚本没有检查 INSERT 是否成功。如果是这种情况,应该使用 INSERT DELAYED。这样,客户端就不必等待服务器的确认再继续执行。

REPLACE

如果你先执行一个 DELETE 然后执行一个 INSERT,你需要与服务器通信两条 SQL 命令。你可以考虑使用 REPLACE。如果需要,可以使用 REPLACE DELAYED

其他技术

将数据存储在 Cookie 中

有时,会将会话数据存储在数据库中。每当用户加载页面时,这至少需要一次 UPDATE 和一次 SELECT。通过将会话数据存储在 Cookie 中,可以避免这个问题。

浏览器允许用户选择不接受 Cookie,但如果用户不接受 Cookie,就无法访问许多现代网站。

唯一不能安全存储在 Cookie 中的是密码。你可以设置 Cookie 的短期有效期,这样用户的隐私就不会被过度暴露。或者你可以采用以下方法:

  • 当用户成功登录时,创建一个记录,包含 CURRENT_TIMESTAMP() 和一个随机 ID;
  • 设置一个包含该 ID 的 Cookie;
  • 当用户尝试执行操作时,检查是否已登录:
SELECT FROM `access` WHERE `id`=id_from_cookie AND `tstamp`>=CURRENT_TIMESTAMP() - login_lifetime
UPDATE tstamp

创建静态内容

当用户浏览文章或其他动态内容(即存储在数据库中的内容)时,需要生成一个 HTML 文档。通常,页面的内容不会变化,只是在数据库中插入一次,且很少(或从不)更新。文章或链接列表就是一个很好的例子。

因此,创建一个程序,当文章插入到数据库时生成一个静态 HTML 页面可能是个不错的主意。如果文章被更新,页面可以被删除并重新生成。这可以节省大量的 SQL 语句和数据库管理系统的工作。

当然,这要求你有一些权限,可能在使用托管服务时需要联系技术支持团队来讨论此事。

Last modified: Friday, 17 January 2025, 7:38 PM