我有一個包含符號名稱(例如函數)及其起始內存地址和結束內存地址位置的表。現在我想查找起始地址和結束地址之間的許多地址,並映射到每個符號名稱(或者像下面的示例一樣簡化起始地址)。查找具有涵蓋所選數百萬個值的最小和最大範圍值的行
我做一個查詢這樣的:
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上運行這個,我不需要擔心可移植性。
當我搜索其他人做什麼時,我只能找到恆定邊界的結果,而不是找到具有正確邊界的行時。但在我看來,這似乎是一個相當普遍的問題。
你錯過了指定你的'r'和'sm'表之間的關係的條件。 – zerkms 2011-04-13 15:50:37
不是'r.caller_addr BETWEEN sm.addrstart AND sm.addrend'指定的關係? – Harald 2011-04-13 16:01:40