优化 Python 代码以进行数据库访问

89 阅读4分钟

我正在构建一个应用程序,其中对象的数据存储在 mysql 表中(分布在多个表中)。当需要使用对象(检索对象属性/更改属性)时,我使用 mysqldb 查询 sql 数据库(select/update)。但是,由于应用程序计算量很大,执行时间非常慢。

我想了解是否存在将所有数据加载到 python 中的方法,在这些对象上执行计算/修改,然后随后对 mysql 数据库执行完整数据更新?一次性从数据库将数据加载到这些对象的列表中是否会提高性能?此外,由于数据库大小约为 25 mb,这是否会导致任何内存问题。

解决方案

方法一:直接加载数据

25Mb 的数据量非常小。SQL 速度很慢。如果您没有事务(具有锁定和多个用户),请不要在 SQL 上浪费时间。如果您要进行“分析”,尤其是计算密集型分析,请将所有数据加载到内存中。

如果数据不太可能装入内存,请执行以下操作:

  • 将数据查询到平面文件中。这可以很快。如果您不使用 Python,而是使用数据库原生工具将数据提取到 CSV 或其他小文件中,则速度最快。
  • 读取平面文件并执行计算,写入平面文件。这真的很快。
  • 从平面文件中进行批量更新。同样,如果您使用数据库原生工具集进行插入或更新,则速度最快。

如果您一开始不需要 SQL,请考虑您最初收到的数据以及您打算用它做什么。

  • 一次读取原始文件,解析它,创建您的 Python 对象并对整个列表或字典进行 pickle。这意味着每个后续程序都可以简单地加载 pickle 文件并开始进行分析。但是。您无法轻松更新 pickle 文件。您必须创建一个新的。这不是一件坏事。它为您提供了完整的处理历史记录。
  • 一次读取原始文件,解析它,使用 shelve 创建您的 Python 对象。这意味着您可以更新文件。
  • 一次读取原始文件,解析它,创建您的 Python 对象并将整个列表或字典保存为 JSON 或 YAML 文件。这意味着每个后续程序都可以简单地加载 JSON(或 YAML)文件并开始进行分析。但是。您无法轻松更新文件。您必须创建一个新的。这不是一件坏事。它为您提供了完整的处理历史记录。 这可能会比 pickling 慢一点。并且它需要您编写一些辅助函数,以便 JSON 对象能够正确转储和加载。但是,您可以读取 JSON(和 YAML),从而为您在使用文件时带来一些优势。

方法二:使用缓存

您可以通过缓存经常查询的数据来加速 SQL 查询。有几种不同的缓存策略可供您选择,例如:

  • 查询缓存:查询缓存将查询结果存储在内存中,以便可以在以后的请求中重用它们。
  • 结果缓存:结果缓存将查询的结果存储在内存中或持久化存储(例如文件系统或数据库)中。
  • 连接池:连接池通过重用现有的数据库连接来减少创建新连接的开销。

方法三:优化 SQL 查询

您还可以通过优化 SQL 查询来提高性能。以下是一些技巧:

  • 使用索引:索引可以帮助数据库更快地查找数据。
  • 选择正确的查询类型:有些查询比其他查询更快。例如,SELECT 语句通常比 UPDATE 语句更快。
  • 避免执行不必要的操作:例如,避免使用 SELECT * 语句,因为它们会检索所有列的数据,即使您只需要其中的一些列。
  • 使用 JOIN 操作:JOIN 操作可以将来自多个表的数据组合到一个结果集中。这比执行多个查询并手动组合结果要快得多。