一千萬個為什麽

搜索

查找具有涵蓋所選數百萬個值的最小和最大範圍值的行

我有一個帶有符號名稱(例如函數)的表以及它們的起始內存地址和結束內存地址放置。現在我想查找起始地址和結束地址之間的許多地址並映射到每個符號名稱(或者更簡單的起始地址,如下例所示)。

我做這樣的查詢:

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行。我也嘗試了一些其他索引方法,但仍然需要很長時間(很多10分鐘)並且還沒有完成。

有關更好的索引或其他具有更好性能的選擇語句的任何建議?我在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

轉載註明原文: 查找具有涵蓋所選數百萬個值的最小和最大範圍值的行