2011-04-13 49 views
0

我有一個包含符號名稱(例如函數)及其起始內存地址和結束內存地址位置的表。現在我想查找起始地址和結束地址之間的許多地址,並映射到每個符號名稱(或者像下面的示例一樣簡化起始地址)。查找具有涵蓋所選數百萬個值的最小和最大範圍值的行

我做一個查詢這樣的:

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; 

可再生能源技術是包含大約一百萬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中的例子)。符號映射表包含42000行。我也嘗試了一些其他的索引方法,但仍然需要很長時間(很多10分鐘),並沒有設法完成。

關於更好的索引或其他性能更好的select語句的任何建議?我在MySQL 5.1.41上運行這個,我不需要擔心可移植性。

當我搜索其他人做什麼時,我只能找到恆定邊界的結果,而不是找到具有正確邊界的行時。但在我看來,這似乎是一個相當普遍的問題。

+0

你錯過了指定你的'r'和'sm'表之間的關係的條件。 – zerkms 2011-04-13 15:50:37

+0

不是'r.caller_addr BETWEEN sm.addrstart AND sm.addrend'指定的關係? – Harald 2011-04-13 16:01:40

回答

0

嘗試在單一指標的兩列組合:

CREATE TABLE 
    symbolmap 
    (addrstart BIGINT NOT NULL, 
    addrend BIGINT NOT NULL, 
    name VARCHAR(45), 
    PRIMARY KEY (addrstart, addrend) 
) ENGINE = InnoDB; 

還要確保caller_addr也BIGINT

+0

感謝提示,我沒有計時,但它似乎改善與綜合指數。我決定通過創建一個臨時表來解決數百萬個帶有地址的行的主要問題,其中不同的只有幾萬個。然後我從上面的select查詢中創建另一個臨時表。現在可以使用這個最後一個表格直接從數百萬行中的任何一行到符號進行簡單的平等連接。這個速度要快得多,我的機器上總共只有30秒左右。 – Harald 2011-04-14 08:31:02

相關問題