gpt4 book ai didi

mysql - 存储 URL 的最佳主键

转载 作者:IT老高 更新时间:2023-10-29 00:15:53 32 4
gpt4 key购买 nike

哪个是存储网站地址和页面 URL 的最佳主键?

为了避免使用自动增量 id(它与数据没有真正的关联),我使用 URL 的 SHA1 签名作为主键来设计架构。

这种方法在很多方面都很有用:例如,我不需要从数据库中读取 last_id,因此我可以准备所有表更新来计算键并在单个事务中进行真正的更新。没有违反约束。

无论如何,我读了两本书告诉我我错了。在“高性能 MySQL”中,据说随机键对数据库优化器不利。此外,在 Joe Celko 的每一本书中,他都说主键应该是数据的一部分。

问题是:URL 的自然键是... URL 本身。事实是,如果一个站点很短(www.something.com),则对 am URL 没有强加限制(参见 http://www.boutell.com/newfaq/misc/urllength.html)。

考虑到我必须存储(并使用)数百万个它们。

那么,哪个是最好的 key 呢?自动增量 ID、URL、URL 哈希?

最佳答案

您需要一个自动递增的数字主键。当您需要传递 ID 或加入其他表(例如,URL 的可选属性)时,您需要一些小的数字。

至于您想要的其他列和索引,一如既往地取决于您将如何使用它们。

对于几乎所有使用大量 URL 的应用程序来说,存储每个 URL 的散列的列是一个绝妙的主意。它使通过其全文选择 URL 的速度与它要获得的速度一样快。第二个优点是,如果您使该列成为唯一的,则无需担心使存储实际 URL 的列成为唯一的,并且您可以使用 REPLACE INTO 和 INSERT IGNORE 作为简单、快速的原子写入操作。

我要补充一点,使用 MySQL 的内置 MD5() 函数就可以达到这个目的。它唯一的缺点是专门的攻击者可以强制碰撞,我敢肯定您不会关心这一点。例如,使用内置函数可以使某些类型的连接变得更加容易。通过网络传递完整的 URL 可能会稍微慢一点(“SELECT url FROM urls WHERE hash=MD5('verylongurl')”而不是“WHERE hash='32charhexstring'”),但您可以选择如果你愿意,可以这样做。除非您能想出 MD5() 会让您失望的具体场景,否则请随意使用它。

困难的问题是您是否以及如何需要以全文以外的方式查找 URL:例如,您是否希望在任何“bar.com”上查找以“/foo”开头的所有 URL “主持人?虽然“LIKE '%bar.com%/foo%'”将在测试中起作用,但它会在规模上惨遭失败。如果您的需求包括这样的事情,您可以想出创造性的方法来生成针对您需要的数据类型的非 UNIQUE 索引......对于初学者来说可能是一个 domain_name 列。几乎可以肯定,您必须从您的应用程序填充这些列(触发器和存储过程比它们在这里的值(value)要麻烦得多,特别是如果您担心性能 - 不要打扰)。

好消息是关系数据库对于这类事情非常灵活。您始终可以添加新列并在以后填充它们。我建议初学者使用:int unsigned auto_increment 主键、唯一哈希 char(32) 和(假设 64K 字符足够)文本 url。

关于mysql - 存储 URL 的最佳主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3735390/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com