Найти строки, имеющие минимальные и максимальные значения диапазона, которые охватывают выбранные миллионы значений - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть таблица с именами символов (например, функциями) и их адресами начальной и конечной памяти.Теперь я хочу найти множество адресов, которые находятся между начальным и конечным адресами, и сопоставить их с каждым именем символа (или проще с начальным адресом, как показано в примере ниже).

Я выполняю запрос, подобный этому:

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, и мне не нужно беспокоиться о переносимости.

Когда я искал то, что делают другие, я нахожу результаты только с постоянными границами, а не при поиске строки, имеющейправильные границы.Но мне кажется, что это довольно общая проблема.

1 Ответ

0 голосов
/ 13 апреля 2011

Попробуйте объединить два столбца в одном индексе:

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

Также убедитесь, что caller_addr также bigint

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...