2017-08-10 76 views
0

背景:如何构建数据库,以加快项目的检索

我有一个SQLite数据库。数据库有两个表格:键和元素。

CREATE TABLE keys (id INTEGER PRIMARY KEY, key TEXT) 
CREATE TABLE elements (key_id INTEGER, element TEXT) 

实施例的键:

  • (1,一些关键的)
  • (2,其他键)

实施例的元素:

  • (1,弗里斯特字)
  • (1,第二个字)
  • (1,第三字)
  • (2,第一个字)
  • (2,第二个字)

算:

  • 键:2.600.000
  • 元素:3.800.000

我生成数据库,基于此的文字:

cursor.execute(""" 
    SELECT id 
    FROM keys 
    WHERE key = ? 
""", (key,)) 
key_id = cursor.fetchone()[0] 

cursor.execute(""" 
    SELECT element 
    FROM elements 
    WHERE key_id = ? 
""", (key_id,)) 
elements = cursor.fetchall() 
word = "".join(random.choice(elements)) 

该代码被执行10-20次。但它太慢了。一代可能需要20-30秒。

问题:

  1. 为了加快一代如何组织数据库?
  2. 什么是存储元素的最佳方式?在自己的行中的每个元素与key_id和值?或者一行key_id和value包含所有元素?
+0

我发现数据库设计仅仅是人类:关于数据库设计的实践指南是一个很好的资源。 – WombatPM

回答

0

要加快第一个查询的执行速度,可以在key列中添加一个索引。同样,加快第二个查询,你可以在key_id添加索引:

CREATE INDEX key_idx ON keys (key); 
CREATE INDEX elmt_idx ON element (key_id); 

这将有助于这两个查询的WHERE子句来找到你想要返回的记录或记录。

至于你的第二个问题,你目前的设计,每个关键和价值在一个单独的行,可能是最好的方式去这里。首先,它使查找给定值变得更加容易。例如,如果要将这些值存储为以逗号分隔的数据,则筛选出一个值将会困难得多。而且你将无法利用任何索引。

+0

太棒了!现在这代人需要大约1-2秒。但是这减慢了数据库的创建,是的?尺寸也增加了1.5。 – Immersion

+0

@Immersion是的,索引占用空间,这可能是一个缺点,特别是如果数据库驻留在空间非常宝贵和有限的移动设备上。为了增加数据库创建时间,这对你来说真的很重要吗?如果它只发生一次,我会认为它不像查询的空间或速度那么大。 –