查询时间呈指数增长?

时间:2013-12-02 10:06:26

标签: mysql database-design data-structures relational-database

在过去的几天里,我一直在努力规范我们的600GB数据库。 我已将所有冗余数据分成4个单独的表和一个主条目表。

到目前为止一切都很顺利,但是最后一步,用新的数据记录加入新表并将新的规范化数据记录插入到数据库中。为此,我使用"INSERT INTO SELECT"。但不是问题。如果我在前100个id上运行此查询它需要10秒但如果我在前300行上运行它需要几分钟。我该怎么做才能解决这个问题?

SELECT * FROM oldDB.`unNormalized` 
INNER JOIN `new_normalized_db`.`keyword` k ON `unNormalized_tabel`.`keyword` = k.`keyword`
INNER JOIN `new_normalized_db`.`project` p ON `unNormalized_tabel`.`awrProject` = p.`project`
INNER JOIN `new_normalized_db`.`searchEngine` s ON `unNormalized_tabel`.`searchEngine` = s.`searchEngine`
INNER JOIN `new_normalized_db`.`urlHash` u ON MD5(`unNormalized_tabel`.`url`) = u.`hash`
WHERE oldDB.`unNormalized_tabel`.`id` < 100
GROUP BY k.`id`, p.`id`, s.`id`,u.`id`

截至目前,旧的entrys只有一个primery密钥索引,我应该为所有旧数据列添加一个全文索引吗?我认为这可能需要几个月的600GB非规范化数据库?那么空间4个新索引会占用多少空间呢?

 id  select_type  table              type    possible_keys                                                    key           key_len  ref                                 rows  Extra                                         
------  -----------  -----------------  ------  ---------------------------------------------------------------  ------------  -------  --------------------------------  ------  ----------------------------------------------
     1  SIMPLE       p                  index   (NULL)                                                           projectName   42       (NULL)                               427  Using index; Using temporary; Using filesort  
     1  SIMPLE       unormalized_tabel  range   PRIMARY,keyword_url_insDate,keyword,searchEngine,url,awrProject  PRIMARY       4        (NULL)                               358  Using where; Using join buffer                
     1  SIMPLE       u                  ref     url                                                              url           767      oldDB.unormalized_tabel.url       1                                                
     1  SIMPLE       k                  index   (NULL)                                                           keyword       42       (NULL)                            107340  Using where; Using index; Using join buffer   
     1  SIMPLE       s                  index   (NULL)                                                           searchEngine  42       (NULL)                              1155  Using where; Using index; Using join buffer   

1 个答案:

答案 0 :(得分:0)

您可以通过添加索引来加快查询速度。

k的第一次加入可以更快,如果keyword上的索引以及unNormalized_tabel.keyword上的索引与项目p上的索引相同awrProject }和p.project以及s.searchEngineunNormalized_tabel.searchEngine

但最后一次加入反正会很慢,因为必须在查询时计算哈希值,这对于大量数据来说非常慢。您可以做的是在插入url之前散列unNormalized_tabel,然后在hash_field上添加索引。