在过去的几天里,我一直在努力规范我们的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
答案 0 :(得分:0)
您可以通过添加索引来加快查询速度。
k
的第一次加入可以更快,如果keyword
上的索引以及unNormalized_tabel.keyword
上的索引与项目p
上的索引相同awrProject
}和p.project
以及s.searchEngine
和unNormalized_tabel.searchEngine
但最后一次加入反正会很慢,因为必须在查询时计算哈希值,这对于大量数据来说非常慢。您可以做的是在插入url
之前散列unNormalized_tabel
,然后在hash_field上添加索引。