MySQL自加入查询优化

时间:2012-07-12 20:12:54

标签: mysql django

我有一个从单词列表生成的子串数据库。我正在进行比较以检索所有与一些输入词共享子串的单词。

'word_substrings'数据库格式和示例(单词'aback'):

    id (primary key), word_id (Foreign Key), word_substring (char(3))

    30                4                      "  a"
    31                4                      " ab"
    32                4                      "aba"
    33                4                      "bac"
    34                4                      "ack"
    35                4                      "ck "
    36                4                      "k  "

'word_id'是单词表中单词的关键字。

我尝试过等价:

    select distinct t1.word_id 
        from word_substrings t1, word_substrings t2 
        where t1.word_substring = t2.word_substring 
        and t2.word_id = [some word_id]

以及表连接:

    select distinct t1.word_id
        from word_substrings as t1
        join word_substrings as t2 
        on t1.word_substring = t2.word_substring
        where and t2.word_id = [some word_id]

但是,两个查询都需要大约10秒才能返回结果。

鉴于word_substrings的单词表和表格都容易改变,但数据会定期检索,我尝试制作一个视图来帮助改善查询时间。但是,我没有看到回报时间的名义变化。

我的单词列表目前是40k行,我的子串列表大约是400k行。

有没有人对如何优化查询或重新格式化数据库以改善返回时间有任何想法?

我已经考虑过生成一个包含代表每个可能子字符串的列的表,并在相应的列中注册每个单词,但是我不太清楚它是如何工作的。

谢谢你的帮助!如果有任何我忽略的信息,我将很乐意为您检索这些数据。

注意:如果是相关信息,则适用于Django Web应用程序。

1 个答案:

答案 0 :(得分:0)

您需要word_idword_substring上的索引。 (如果可以的话,也可以将列设置为not null

这样,仅使用word_id的查询就可以使用,而使用word_idword_substring的其他人也可以使用。

干杯。