【问题标题】:What's the most efficient way to get this information from the database?从数据库中获取这些信息的最有效方法是什么?
【发布时间】:2012-07-13 02:44:45
【问题描述】:

与这个问题有关:

Wildcards in column name for MySQL

基本上,其中会有不同数量的列名称为“word”。

我想知道的是,对每一行进行单独的数据库调用(通过从信息架构中获取列信息),每行生成一个 Python 查询会更快,还是简单地调用会更快? SELECT *,并且只使用我需要的列?可以说SELECT * NOT XYZ吗?据我所知,不,没有办法专门排除列。

一开始不会有很多不同的行 - 只有三个。但是这有可能无限行。这基本上取决于我们想在我们的网站上放置多少不同类型的搜索查询。我们的整体可扩展性基于扩展行数。

【问题讨论】:

  • 在您的问题中,您所说的“行”是指“列”吗?否则,我不太明白你的意思。
  • 不,据我所知,我正在做一些奇怪的数据库设计 - 如果您有更好的建议,很高兴听到。我为每个单独的单词设置了多个列,因为所有单词都将与另一个列相关联,并带有一个值。然后将所有这些词组合成一个强词,将值关联到一个数组或字典中,然后将其传递给另一个函数。
  • 你的数据库设计完全错误。
  • 我自己也很担心。
  • 好吧,没有任何启示,我这里真的什么都做不了。

标签: python mysql database


【解决方案1】:

如果您所做的只是限制返回的列数,则无需进行动态查询。数据库的艰苦工作是选择与WHERE 子句匹配的行;将 10 列中的 5 列或全部 10 列发送给您几乎没有什么区别。

只需使用“SELECT * FROM ...”并使用 Python 从结果集中挑选列。您将只对数据库使用 一个 查询,因此 MySQL 只需工作一次,然后过滤掉您的列:

cursor.execute('SELECT * FROM ...')
cols = [i for i, col in enumerate(cursor.description) if col[0].startswith('word')]
for row in cursor:
    columns = [row[c] for c in cols]

您可能必须改用for row in cursor.fetchall(),具体取决于您的 MySQL python 模块。

【讨论】:

  • 但这不会得到比我需要的更多的列吗?我被告知那是低效的。虽然我会说实话,但我认为没有更有效的方法可以做到这一点,没有非常hack-y代码的潜力,最终可能会变得更加/低效/
  • 效率低下是相对的。例如,多个数据库查询效率较低。解析和执行 SQL 查询(远)比选择要发送的列子集更昂贵。除非您将自己限制在 1000 列中的 3 列,否则选择所有列并在 python 中进行限制将会获胜。
  • 好吧,你的论据已经足够我用了。我只是想为这个项目编写我所拥有的最干净的代码。
  • results = c.execute("""SELECT * from searchtest where onstate = 1;""") print results.description 得到这个错误:AttributeError: 'long' object has no attribute 'description'
  • 对不起,应该是cursor.description;见Python DB API spec 2.0
猜你喜欢
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多