我有 2 个数据库,需要链接两个大表之间的信息(每个表超过 300 万个条目,并且不断增长)。
第一个数据库有一个表“pages”,用于存储有关网页的各种信息,并包括每个页面的 URL。 “URL”列是 varchar(512) 并且没有索引。
第二个数据库有一个表“urlHops”,定义为:
创建表urlHops
(
dest
varchar(512) 不为空,src
varchar(512) 默认为空,timestamp
时间戳 NOT NULL DEFAULT CURRENT_TIMESTAMP,
钥匙dest_key
(dest
),
KEY src_key
(src
)
) 引擎=InnoDB 默认字符集=latin1
现在,我基本上需要发出(有效)这样的查询:
从 db1.pages p、db2.urlHops u 选择 p.id、p.URL,其中 u.src=p.URL 且 u.dest=?
起初,我想在页面(URL)上添加索引。但它是一个非常长的列,而且我已经在同一个表上发出了很多 INSERT 和 UPDATE(远远超过了我使用此索引执行的 SELECT 的数量)。
我认为其他可能的解决方案是:
-向页面添加一列,存储 URL 的 md5 哈希值并对其建立索引;这样我就可以使用 URL 的 md5 进行查询,并具有较小列上的索引的优势。
- 添加另一个仅包含页面 id 和页面 URL 的表,对这两列进行索引。但这可能是浪费空间,唯一的优点是不会减慢我在“页面”上执行的插入和更新速度。
我不想减慢插入和更新速度,但同时我能够有效地对 URL 进行查询。有什么建议吗?
我最关心的是性能;如果需要,浪费一些磁盘空间不是问题。
谢谢,问候
Davide
您的 MD5 哈希建议非常好 - 它记录在 High Performance MySQL 第二版中。有一些技巧可以让它发挥作用:
创建表 url (
id NOT NULL 主键自动增量,
url varchar(255) 不为空,
url_crc32 INT UNSIGNED 不为空,
索引(url_crc32)
);
选择查询必须如下所示:
从 url 中选择 * WHERE url='http://stackoverflow.com http://stackoverflow.com' 和 url_crc32=crc32('http://stackoverflow.com http://stackoverflow.com');
url_crc32 旨在与索引配合使用,包括 WHERE 子句中的 url 旨在防止哈希冲突。
我可能会推荐 crc32 而不是 md5。将会有更多的冲突,但是您有更高的机会将所有索引放入内存中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)