微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查找具有覆盖选定的数百万个值的最小和最大范围值的行

如何解决查找具有覆盖选定的数百万个值的最小和最大范围值的行

|| 我有一个带有符号名称(例如函数)及其起始存储地址和结束存储地址位置的表。现在,我想查找起始地址和结束地址之间的许多地址,并映射到每个符号名称(或更简单的如下所示的起始地址)。 我做这样的查询
SELECT r.caller_addr AS caller_addr,sm.addrstart AS caller FROM rets AS r 
JOIN symbolmap AS sm ON r.caller_addr BETWEEN sm.addrstart AND sm.addrend;
rets是一个包含大约一百万个caller_addr的表。 Symbolmap表的创建方式为:
CREATE TABLE 
  symbolmap  
  (addrstart BIGINT NOT NULL,addrend BIGINT NOT NULL,name VARCHAR(45),PRIMARY KEY (addrstart),UNIQUE INDEX (addrend)) ENGINE = InnoDB;
所有addrstart至addrend行都没有重叠,即,任何请求的addr都只能命中一行(在示例中为r.caller_addr)。 Symbolmap表包含42000行。我也尝试了其他一些索引方法,但是选择仍然需要很长时间(很多10分钟),而且还没有完成。 对更好的索引或其他具有更好性能的select语句有何建议?我正在MysqL 5.1.41上运行此程序,无需担心可移植性。 当我搜索其他内容时,我只会找到边界不变的结果,而在找到具有正确边界的行时却找不到。但是在我看来,这似乎是一个非常普遍的问题。     

解决方法

尝试将两个列合并到一个索引中:
CREATE TABLE 
  symbolmap  
  (addrstart BIGINT NOT NULL,addrend BIGINT NOT NULL,name VARCHAR(45),PRIMARY KEY (addrstart,addrend)
  ) ENGINE = InnoDB;
还要确保caller_addr也是bigint     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。