语句/查询缓存与Python数据库库和绑定参数?

时间:2015-10-03 18:04:58

标签: python mysql postgresql caching

据我所知,所有数据库/访问库都支持准备语句和绑定变量(例如PostgreSQLODBCMySQL等)。 Python DB-API似乎意味着数据库库应该在内部使用绑定变量来实现,但我检查的两个数据库不是..?

MySQLdb在内部使用字符串inerpolation(来自cursor.execute(..)的{​​{3}}):

query = query % tuple([db.literal(item) for item in args])

_mysql.c the implementation使用:

r = mysql_real_query(&(self->connection), query, len);

而不是mysql_stmt_*函数。

psycopg2库中,所有执行路径似乎都以_psyco_curs_execute结尾,调用_psyco_curs_merge_query_args,它将“查询字符串及其参数”合并在一起。 (参见implementation)。

绑定参数应该更快更安全,那么为什么这些库会进行字符串格式化呢?由于大多数查询都是唯一的,查询/语句缓存几乎没有用,我是否应该大幅缩小它们的大小(以防止缓存维护开销)?

1 个答案:

答案 0 :(得分:1)

Postgres中预处理语句开销的开销相对较小。这个缓存不是在进程之间共享的,它只是每个进程 - 因此实现非常简单。因此,这不应成为任何决定的论据。还有其他人:

  1. 盲优化(或半盲优化> = 9.3)
  2. 协议的开销略高一点
  3. 但对SQL注入100%安全
  4. 现在,几乎所有接口都能确保安全的客户端预备语句 - 并且在几乎所有情况下都可能更好地选择。异常是非常重复的语句 - 通常是一些INSERT或UPDATE。

    检查使用的方法很简单 - 您可以通过set log_mi_duration_statement = 0在PostgreSQL端记录所有查询,您将在带有或不带有绑定参数(占位符)的postgresql.log查询中看到。