sqlite 在合理的时间内查询关系数据

ijxebb2r  于 2022-11-15  发布在  SQLite
关注(0)|答案(3)|浏览(214)

我有一个电子表格,大约有170万行,总计1 GB,需要对其执行查询。
我最熟悉的就是使用Python,我的第一个方法是把一堆词典拼凑在一起,这些词典以一种便于我试图进行查询的方式输入。例如,如果我需要访问具有特定区号和年龄的每个人,我会制作一个areacode_age二维词典。我最终需要相当多的内存,这使内存占用量增加到约10 GB,即使我有足够的RAM,处理过程也很慢。
我导入了sqlite3,并将我的数据导入到内存数据库中。结果发现,执行像SELECT (a, b, c) FROM foo WHERE date1<=d AND date2>e AND name=f这样的查询只需要0.05秒。对我的170万行执行此操作将需要24小时。对于这个特定的任务,我使用词典的方法大约快了3个数量级(在本例中,我不能键入date1date2,所以我获取匹配名称的每一行,然后按日期过滤)。
为什么它这么慢,我怎么才能让它快一点?什么是毕德学派的方法?我一直在考虑的可能性:

  • SQlite3太慢了,我需要更重量级的东西。
  • 我需要更改我的架构或查询以使其更优化。
  • 我需要一个新的工具。
  • 我在某个地方读到,在SQLite 3中,重复调用cursor.execute比使用cursor.executemany慢得多。但事实证明,executemany与SELECT语句不兼容,所以我认为这是在转移注意力。
xqk2d5yq

xqk2d5yq1#

Sqlite3太慢了,我需要更重量级的
首先,sqlite3速度很快,有时甚至比MySQL还快
其次,你必须使用索引,在(日期1,日期2,名称)中放一个复合索引会大大加快速度

ki1q1bka

ki1q1bka2#

但事实证明,执行类似“SELECT(a,b,c)from foo where Date1<=d and ate2>e and name=f”这样的查询需要0.05秒。对我的170万行执行此操作将需要24小时的计算时间。对于这个特定的任务,我使用词典的方法大约快了3个数量级(在本例中,我显然不能键入日期1和日期2,所以我获取匹配名称的每一行,然后按日期过滤)。
你是否真的**尝试*并观察到这需要24小时?处理时间不一定与数据大小成正比。
您是在建议您可能需要运行SELECT (a, b, c) FROM foo WHERE date1<=d AND date2>e AND name=f 170万次吗?您只需运行一次,它将返回与您的查询匹配的整个行子集。
170万行不是很小,但对于完全位于本地计算机内存中的数据库来说,肯定不是问题。(没有缓慢的磁盘访问;没有缓慢的网络访问。)
证据就在布丁中。这对我来说是相当快的(大部分时间都花在生成约1000万个随机浮点数上)。

import sqlite3, random

conn = sqlite3.connect(":memory:")
conn.execute("CREATE TABLE numbers (a FLOAT, b FLOAT, c FLOAT, d FLOAT, e FLOAT, f FLOAT)");
for _ in xrange(1700000):
    data = [ random.random() for _ in xrange(6) ];
    conn.execute("INSERT INTO numbers VALUES (?,?,?,?,?,?)", data)

conn.commit()

print "done generating random numbers"

results = conn.execute("SELECT * FROM numbers WHERE a > 0.5 AND b < 0.5")
accumulator = 0
for row in results:
    accumulator += row[0]

print ("Sum of column `a` where a > 0.5 and b < 0.5 is %f" % accumulator)

**编辑:**好的,你真的需要运行170万次。

在这种情况下,您可能需要一个索引。引用维基百科的话:数据库索引:
数据库索引是一种数据结构,它提高了对数据库表的数据检索操作的速度,但代价是写入速度较慢,存储空间增加。可以使用数据库表的一个或多个列创建索引,这为快速随机查找和高效访问有序记录提供了基础。
您将执行类似CREATE INDEX dates_and_name ON foo(date1,date2,name)的操作,然后(我相信)像往常一样执行其余的SELECT语句。试试这个,看看它是否能加快速度。

ctehm74n

ctehm74n3#

因为您已经在谈论SQL,所以最简单的方法是:
1.将您的所有数据放入MySQL表。它应该在170万行的情况下表现良好。
1.添加需要的索引,检查设置,确保它是run fast on big table
1.从Python访问
1.
1.利润!

相关问题