Mysql InnoDB性能优化和索引

2024-04-24

我有 2 个数据库,需要链接两个大表之间的信息(每个表超过 300 万个条目,并且不断增长)。 第一个数据库有一个表“pages”,用于存储有关网页的各种信息,并包括每个页面的 URL。 “URL”列是 varchar(512) 并且没有索引。

第二个数据库有一个表“urlHops”,定义为:

创建表urlHops ( destvarchar(512) 不为空,srcvarchar(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(使用前将#替换为@)

Mysql InnoDB性能优化和索引 的相关文章

随机推荐