我有一个带有符号名称(例如函数)的表以及它们的起始内存地址和结束内存地址放置。现在我想查找起始地址和结束地址之间的许多地址并映射到每个符号名称(或者更简单的起始地址,如下例所示)。
我这样做一个查询:
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的表。符号映射表创建为:
CREATE TABLE
symbolmap
(addrstart BIGINT NOT NULL,
addrend BIGINT NOT NULL,
name VARCHAR(45),
PRIMARY KEY (addrstart),
UNIQUE INDEX (addrend)) ENGINE = InnoDB;
addrend行的所有addrstart都没有重叠,即对于任何请求的addr(示例中为r.caller_addr)只能有一行命中。符号映射表包含42000行。我也尝试过其他一些索引方法,但仍然需要很长时间(很多分钟),并且还没有完成。
有关更好的索引或其他具有更好性能的select语句的建议吗?我在MySQL 5.1.41上运行它,我不需要担心可移植性。
当我搜索其他人所做的事情时,我只找到具有恒定边界的结果,而不是在找到具有正确边界的行时。但在我看来,这似乎是一个非常普遍的问题。
答案 0 :(得分:0)
尝试将两列合并到一个索引中:
CREATE TABLE
symbolmap
(addrstart BIGINT NOT NULL,
addrend BIGINT NOT NULL,
name VARCHAR(45),
PRIMARY KEY (addrstart, addrend)
) ENGINE = InnoDB;
还要确保caller_addr也是bigint