MySQL数据库
优化
API 调用
持久连接
通过使用持久连接,我们保持与服务器的连接处于打开状态,这样可以在不关闭和重新打开连接的情况下执行多个查询。
需要注意的是,这并不总是一个好的优化方法。试想一下,如果每个托管站点仅使用持久连接,在共享主机环境下,服务器的内存应该能存储多少个持久连接:这会导致内存过载。
许多编程语言都支持持久连接。
释放内存
当你执行查询时,返回的记录集会被存入一个变量。将这些数据保留在内存中,尤其是在不再需要时,是对内存的浪费。因此,通常应该尽早释放内存。如果只能在脚本结束前几行释放内存,那就没有意义了。但在某些情况下,提前释放内存是有益的。
获取行
许多 API 支持两种获取数据行的方式:可以将数据放入常规数组、对象或关联数组中。将数据放入对象中是最慢的方式,而放入普通数组是最快的方式。如果你每行只需要获取一个值,那么将其放入数组中可能是个不错的主意。
API 与 SQL
通常,API 支持某些方法,这些方法会创建 SQL 语句并将其发送到 MySQL 服务器。你也可以手动创建语句来实现相同的效果,但这样是最慢的方式。API 方法通常更优化。
减少客户端/服务器通信
有些脚本使用两个查询来提取数据透视表。客户端与服务器的通信通常是瓶颈,因此你应该尽量只使用一个 JOIN
查询。
如果你需要使用多个查询,尽量使用一个连接。如果可能,避免在 SQL 命令中包含太多无意义的字符(如空格、制表符、注释等)。
CREATE ... SELECT, INSERT ... SELECT
当你从现有表创建新表时,应该使用 CREATE ... SELECT
。当你希望从查询中填充现有表时,应该使用 INSERT ... SELECT
或 REPLACE ... 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 语句和数据库管理系统的工作。
当然,这要求你有一些权限,可能在使用托管服务时需要联系技术支持团队来讨论此事。