первичный ключ с поиском нескольких столбцов - PullRequest
1 голос
/ 11 апреля 2011

Я новичок в базах данных. Если я сделаю первичный ключ с двумя столбцами, userId и dayOfWeek. Как я могу найти этот первичный ключ?

(dayOfWeek - int, где 1 = понедельник, 2 = вторник и т. Д.)

Буду ли я использовать:

SELECT * 
 WHERE userId = 1 
   AND dayOfWeek = 4

Будет ли это сканировать всю базу данных или использовать информацию, предоставленную первичным ключом? Есть ли другой более подходящий запрос, который я мог бы использовать?

Ответы [ 2 ]

2 голосов
/ 11 апреля 2011

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

Ваш пример является составным первичным ключом, поскольку он использует более одного столбца в качестве ключа. MySQL теперь автоматически индексирует первичный ключ (начиная с v5?), Поэтому поиск по всем столбцам первичного ключа с меньшей вероятностью приведет к сканированию таблицы, а скорее к поиску / сканированию индекса. Это зависит от того, используется ли какой-либо другой критерий. Поиск по части первичного ключа (IE: только user_id) может использовать индекс - при условии, что это индекс покрытия, если столбец user_id является первым слева, тогда индекс может использоваться. В противном случае нет.

1 голос
/ 11 апреля 2011

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

Будет ли БД использовать составной первичный ключ, зависит от того, как вы задаете ключевые поля в запросе.Учитывая ваш PK (userID, dayOfWeek), тогда

SELECT * FROM mytable WHERE (userID = 1);
SELECT * FROM mytable WHERE (userID = 1) AND (dayOfWeek = 4);

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

Однако

SELECT * FROM mytable WHERE (dayOfWeek = 4)

не будет, поскольку userID не был указан, а userID предшествует dayOfWeek в определении ключа.

...