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

问题描述

|| 我有一个带有符号名称(例如函数)及其起始存储地址和结束存储地址位置的表。现在,我想查找起始地址和结束地址之间的许多地址,并映射到每个符号名称(或更简单的如下所示的起始地址)。 我做这样的查询
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