У меня есть таблица с именами символов (например, функциями) и их адресами начальной и конечной памяти.Теперь я хочу найти множество адресов, которые находятся между начальным и конечным адресами, и сопоставить их с каждым именем символа (или проще с начальным адресом, как показано в примере ниже).
Я выполняю запрос, подобный этому:
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;
Все строки добавления в строки добавления не перекрываются, т. Е. Для любого запрошенного адреса может быть только одно попадание строки (в примере r.caller_addr).Таблица символов содержит 42000 строк.Я также попробовал несколько других методов индексации, но все же выбор занимает очень много времени (много десятков минут) и не смог завершиться.
Любые предложения по лучшим индексам или другим операторам выбора, которые лучшеспектакль?Я запускаю это на MySQL 5.1.41, и мне не нужно беспокоиться о переносимости.
Когда я искал то, что делают другие, я нахожу результаты только с постоянными границами, а не при поиске строки, имеющейправильные границы.Но мне кажется, что это довольно общая проблема.