从text / url生成数字id以快速“SELECT”

时间:2009-08-04 12:19:12

标签: mysql guid

我有以下问题:

  • 我有一个饲料捕获器,可以每半小时捕获不同来源的新闻。

  • 我只插入数据库中已有URL的条目(URL用于查看记录是否已存在于数据库中)。

    即使这样,我也会得到一些重复的条目,因为有些网站会报道相同的新闻(通常来自路透社等新闻来源)。我可以在插入过程中查找这些重复的条目,但我认为这会延迟插入时间。

    所以,我稍后可以通过标题找到这些重复的条目。但我认为这种搜索很慢。然后,我的想法是从标题生成一个数字字段,然后通过这个数字搜索重复的标题。

  • 我可以使用哪种编码(我认为与base64相反)对标题进行编码?

  • 我认为搜索重复的数字要快于搜索重复的单词。这是真的吗?
  • 您是否建议更好地解决此问题?

好吧,我不在乎数据库中有重复的条目,我只是不想向用户显示。像谷歌一样,它可以过滤重复的结果,但是如果你愿意的话可以显示。

我希望我解释得很好。提前谢谢。

3 个答案:

答案 0 :(得分:2)

填写MD5和标题的URL哈希,并在其上构建UNIQUE索引:

CREATE UNIQUE INDEX ux_mytable_title_url ON (title_hash, url_hash)

INSERT
INTO    mytable (url, title, url_hash, title_hash)
VALUES  ('url', 'title', MD5('url'), MD5('title'))

要选择Google(每个title一个结果),请使用此查询:

SELECT  *
FROM    (
        SELECT  DISTINCT title_hash
        FROM    mytable
        ) md
JOIN    mytable mo
ON      mo.url_title = md.title_hash
        AND mo.url_hash =
        (
        SELECT  url_hash
        FROM    mytable mi
        WHERE   mi.title_hash = md.title_hash
        ORDER BY
                mi.title_hash, mi.url_hash
        LIMIT 1
        )

答案 1 :(得分:0)

因此您可以使用仅包含基于标题和网址的编码密钥的新表,然后您可以在其上添加密钥以加速搜索。但我不认为你可以使用有效的算法将字符串转换为数字。

用于加密使用

SELECT MD5(CONCAT('title', 'url'));

并在每次插入之前测试此表上是否存在title和url的编码串联。

答案 2 :(得分:0)

@Quassnoi可以比我更好地解释,但如果您在索引中使用VARCHAR / CHARINT,我认为性能没有明显差异稍后用于GROUP或其他方法来查找重复项。这样您就可以使用him提出的解决方案,但使用普通INDEX而不是UNIQUE索引,并将重复项保留在数据库中,仅在向用户显示时过滤掉。