Назначение вторичного ключа - PullRequest
3 голосов
/ 14 июля 2011

Какова цель Вторичного ключа? Скажем, у меня есть таблица, в которой регистрируются все проверки (по аналогии с Foursquare) со столбцами id, user_id, location_id, post, time, и может быть миллионы строк, многие заявили, что используют вторичные ключи для ускорения процесса.

Почему это работает? И должны ли оба user_id и location_id быть вторичными ключами?

Я использую MySQL, кстати ...

Редактировать: Будет страница, которая перечисляет / рассчитывает все проверки для конкретного пользователя, и другая страница, которая перечисляет всех пользователей, которые зарегистрировались в определенном месте

MySQL Query

Тип 1

SELECT location_id FROM checkin WHERE user_id = 1234 

SELECT user_id FROM checkin WHERE location_id = 4321

Тип 2

SELECT COUNT(location_id) as num_users FROM checkin

SELECT COUNT(user_id) as num_checkins FROM checkin

Ответы [ 2 ]

3 голосов
/ 14 июля 2011

Ключ (также называемый индексом) предназначен для ускорения запросов. Если вы хотите увидеть все чекины для данного пользователя, вам нужен ключ в поле user_id. Если вы хотите увидеть все проверки для данного местоположения, вам нужен индекс в поле location_id. Вы можете прочитать больше в документации mysql

0 голосов
/ 03 августа 2017

Я хочу прокомментировать ваш вопрос и ваши примеры.

Позвольте мне настоятельно рекомендовать вам, что, поскольку вы используете MySQL, вы убедитесь, что в ваших таблицах используется тип механизма innodb по многим причинам, которые вы можетеисследование самостоятельно.

Одной важной особенностью InnoDB является то, что у вас есть ссылочная целостность.Что это значит?В вашей таблице регистрации у вас есть внешний ключ user_id, который является первичным ключом пользовательской таблицы.Благодаря ссылочной целостности MySQL не позволит вам вставить строку с идентификатором user_id, которого нет в пользовательской таблице.Используя MyISAM, вы можете.Одного этого должно быть достаточно, чтобы вы захотели его использовать.

На ваш вопрос о ключах / индексах, особенно когда таблица определена и ключ объявлен для столбца или некоторой комбинации столбцов, mysql создастиндекс.

Индексы важны для производительности при увеличении таблицы с добавлением строк.

Все реляционные базы данных и базы данных документов зависят от реализации Индекса BTree .То, для чего Btree очень хороши, - это найти элемент (или нет), используя предсказуемое количество поисков.Поэтому, когда люди говорят о производительности реляционной базы данных, основным строительным блоком этого является использование индексов btree, которые создаются с помощью операторов KEY или с помощью alter table или создают операторы индекса.

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

В конечном итоге вы получаете то, что у вас есть 10000 строк в файле.

Теперь вы хотитеузнайте, если вы ввели строку для одного конкретного человека с фамилией Смит.Как вы можете это выяснить?

Без какой-либо сортировки файла или отдельного индекса, у вас есть только одна опция - начать с первой строки в файле и просмотреть каждую строку встол ищет совпадения.Даже если вы нашли Смита, это может быть не единственный «Смит» в таблице, поэтому вам придется читать весь файл сверху вниз каждый раз, когда вы хотите выполнить этот поиск.

Очевидно, чтоТаблица растет, производительность поиска становится все хуже и хуже.

На языке реляционных баз данных это называется " сканирование таблицы ".База данных должна начинаться с первой строки и сканировать чтение каждой строки, пока не дойдет до конца.

Без индексов реляционные базы данных по-прежнему работают, но они сильно зависят от производительности ввода-вывода.

С помощью индекса Btree строки, которые вы хотите найти, сначала находятся в индексе.Индексы имеют указатель непосредственно на нужные вам данные, поэтому таблицу больше не нужно сканировать, вместо этого читаются отдельные требуемые страницы данных.Таким образом, база данных может поддерживать адекватную производительность, даже когда миллионы, 10 или 100 миллионов строк.

Чтобы действительно начать понимать, как работает mysql, вам необходимо ознакомиться с EXPLAIN EXTENDED ... и начать изучать планы объяснения для запросов.Простые, подобные тем, которые вы предоставили, будут иметь простые планы, показывающие, сколько строк проверяется, чтобы получить результат, и используют ли они один или несколько индексов.

Для ваших сводных запросов индексыне полезно, потому что вы делаете COUNT ().Таблицу нужно будет сканировать, если у вас нет других критериев, ограничивающих поиск.

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

SELECT COUNT(DISTINCT user_id) as num_users FROM checkin

SELECT COUNT(*) as num_checkins FROM checkin

Это еще одна причина использовать InnoDB, которая при правильной настройке имеет кеш данных (буферный пул innodb), аналогичный другим rdbms, таким как oracle и sql server. MyISAM вообще не кэширует данные, поэтому, если вы неоднократно запрашиваете одни и те же типы запросов, которые могут потребовать большого количества операций ввода-вывода, MySQL придется выполнять всю эту работу по чтению данных снова и снова, тогда как с InnoDB эти данные могут хорошо сидеть в кеш-памяти и возвращать результат без необходимости возвращаться и читать из хранилища.

Первичный и вторичный

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

Независимо от того, является ли индекс уникальным, это отличный инструмент, который позволяет вам поддерживать согласованность вашей базы данных во многих других случаях. Допустим, у вас есть таблица 'employee' со столбцом SS_Number для хранения # социального обеспечения. Имеет смысл иметь индекс для этого столбца, если вы хотите, чтобы система поддерживала поиск сотрудника по номеру SS. Без индекса вы будете сканировать таблицу. Но вы также хотите, чтобы этот индекс был уникальным, чтобы после того, как сотрудник с SS # был вставлен, база данных не позволила бы вам ввести дубликат сотрудника с тем же SS #.

Но чтобы демистифицировать это для вас, когда вы объявляете ключи, эти индексы просто создаются для вас и используются автоматически в большинстве случаев, когда вы определяете таблицы.

Когда вы не имеете дело с ключами (первичными или внешними), как в примере с именами пользователей, именами, фамилиями и фамилиями, ss # и т. Д., Вам также необходимо знать, как создать Индекс, потому что вы ищете (используя критерии условия where) в одном или нескольких столбцах, которые не являются ключами.

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