MYSQL быстрый поиск по двум столбцам

#mysql #sql

#mysql #sql

Вопрос:

У меня есть таблица, которая содержит идентификаторы и электронные письма. Для простоты предположим, что идентификатор — это номер строки. Оба этих столбца уникальны — никакие две строки не будут иметь одинаковый идентификатор, и никакие две строки не будут иметь одинаковый адрес электронной почты. Мне нужно иметь возможность запрашивать быстрый идентификатор по электронной почте и электронную почту по идентификатору.

Если бы я сам программировал эту схему, в дополнение к основной таблице (которая индексируется по идентификатору), я бы сохранил хэш-таблицу, в которой в качестве ключей были бы электронные письма. Это обеспечило бы O (1) для поиска в обоих направлениях.

Вот как я планирую создавать свои таблицы:

 CREATE TABLE main_table (
    id      INT AUTO_INCREMENT,
    email   VARCHAR(256) NOT NULL,
            ...
    PRIMARY KEY(id)
    UNIQUE(email)
);

CREATE TABLE id_by_email (
    email   VARCHAR(256),
    id      INT,
    PRIMARY KEY(email),
    FOREIGN KEY(email) REFERENCE main_table(email),
    FOREIGN KEY(id) REFERENCE main_table(email),
);
  

Будет ли эта настройка вообще работать? И если это произойдет, приведет ли это к поиску O (1), к которому я стремлюсь?

Комментарии:

1. Мне нужно иметь возможность запрашивать быстрый идентификатор по электронной почте и электронную почту по идентификатору. Самый быстрый метод заключается в создании индексов по (id, email) и по (email, id) . Эти индексы покрывают и не требуют доступа к телу таблицы для извлечения данных.

2. Это намного лучше, чем то, что я имел в виду. Таким образом, нет необходимости в таблице id_by_email. Спасибо!

Ответ №1:

Поиск в индексе B-дерева O(log n) . Для всех практических целей это достаточно быстро. В конце концов, журнал в 1 000 000 составляет всего около 30.

Кроме того, с индексом вам не нужно беспокоиться о том, помещается ли хэш-таблица в память. И SQL поддерживает индекс даже при изменении данных.

Комментарии:

1. Итак, будет ли работать настройка, которую я описал выше? Я имею в виду, займет ли поиск электронной почты в id_by_email O (log n). Я спрашиваю, потому что я не знаю, повлияет ли наличие ключа, который является как основным, так и внешним, на алгоритм поиска.

2. @RoyVaron . . Да, но вы должны использовать целочисленный идентификатор, особенно если вас беспокоит производительность.