Помогает ли первичный ключ MySQL в двух столбцах с запросами во втором столбце? - PullRequest
5 голосов
/ 09 декабря 2010

У меня есть два класса, Foo и Bar. Каждый Bar будет содержать много Foo с. Foo с может быть кратным Bar с, но каждый Foo может быть только в данном Bar один раз. У меня есть следующая структура таблицы:

CREATE TABLE `bar_foos` (
   `bar_id` INT UNSIGNED NOT NULL,
   `foo_id` INT UNSIGNED NOT NULL,
   PRIMARY KEY ( `bar_id` , `foo_id` )
);

Это должно хорошо работать для моих отношений "многие ко многим". У меня вопрос: хочу ли я, чтобы мой код мог проверять, используется ли Foo любым Bar s, I.E. чтобы сказать пользователю «Этот Foo не может быть удален, потому что он используется 5 барами», индекс PRIMARY KEY помогает мне с запросом типа

SELECT * FROM `bar_foos` WHERE `foo_id`=2

или

SELECT COUNT(*) FROM `bar_foos` WHERE `foo_id`=2

Или мне нужен отдельный индекс только для столбца foo_id?

Ответы [ 4 ]

6 голосов
/ 09 декабря 2010

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

"Если таблица имеет индекс из нескольких столбцов, любой крайний левый префикс индекса может использоваться оптимизатором для поиска строк. Например, если у вас включен индекс из трех столбцов (col1, col2, col3) Вы проиндексировали возможности поиска для (col1), (col1, col2) и (col1, col2, col3).

MySQL не может использовать индекс, если столбцы не образуют крайний левый префикс индекса. "

3 голосов
/ 09 декабря 2010

Представьте, что вы искали телефонную книгу, в которой есть указатель на фамилии и вторичный указатель на имя. (И это действительно так.)

  • хорошо - где last_name = 'Smith' и first_name = 'John'
  • хорошо - где last_name = 'Smith'
  • плохо - где first_name = 'Джон'

'Джон может появляться на любой странице телефонной книги, поэтому он не сужает ее.

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

2 голосов
/ 09 декабря 2010

Одним словом, нет.

При частичном поиске по ключу будет полезно только, если частичные значения находятся в порядке, в котором они находятся в индексе.Таким образом, если бы ключ состоял из трех частей, а вы искали части 1 и 2, но не 3, это помогло бы.Если вы производите поиск по частям 2 и 3, это не так.

1 голос
/ 09 декабря 2010

Нет.Помогает на первом или на обоих.

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