如何构建数据库以加速项目的检索

时间:2017-08-10 13:51:18

标签: python sql sqlite

背景

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

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

示例键:

  • (1,Some key)
  • (2,其他关键)

示例元素:

  • (1,Frist word)
  • (1,Second word)
  • (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包含所有元素?

1 个答案:

答案 0 :(得分:0)

要加快第一个查询的效果,您可以向key列添加索引。同样,为了加快第二个查询,您可以在key_id上添加索引:

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

这将有助于两个查询中的WHERE子句找到您要返回的记录。

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