Какие индексы следует использовать в этих запросах?

#mysql #join #indexing #group-by #having

Вопрос:

У меня есть вопрос об индексировании SQL в моем классе теории. Он просит меня выбрать, какой столбец следует проиндексировать для оптимизации этих 2 запросов: (Это «бумажный» вопрос, поэтому мне не предоставлена база данных для тестирования этих индексов с помощью ОБЪЯСНЕНИЯ)

1, Первый запрос.

 SELECT BranchName, No_Of_Copies 
FROM BOOK as B, BOOK_COPIES as BC, LIBRARY_BRANCH as LB
WHERE B.BookId = BC.BookId and BC.BranchId=LB.BranchId and title ="The Lost Tribe";
 

У меня есть ответ на этот вопрос, а именно на эту КНИГУ.название, BOOK_COPIES.Идентификатор ветви и БИБЛИОТЕЧНАЯ ВЕТВЬ.Для индексации следует использовать идентификатор ветви. Однако я действительно не понимаю, почему КНИГА.BookID и BOOK_COPIES.BookID не выбраны для индексации.

2, Второй запрос

 SELECT B.cardNo, Name, Address, COUNT(BookId,BranchId) 
FROM BORROWER as B, BOOK_LOANS as BL
WHERE (BL.CardNo=B.CardNo)
GROUP BY B.CardNo, Name, Address
HAVING COUNT(BL.BookId, BranchId)>5;
 

Будет ли это оптимизировано, если я создам индекс на BOOK_LOANS.cardNo, ЗАЕМЩИК.cardNo, Имя и адрес ?

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

1. «Это » бумажный» вопрос, поэтому мне не предоставлена база данных для тестирования этих индексов» — Документ не помешает вам самостоятельно создать тестовую базу данных…

2. Кстати, с 1992 года ваш первый запрос обычно был написан таким образом: SELECT lb.branchname, bc.no_of_copies FROM book b JOIN book_copies bc ON bc.bookid = b.bookid JOIN library_branch lb ON lb.branchid = bc.branchid WHERE title = "the lost tribe";

3. И что же COUNT(BookId,BranchId) делает?

Ответ №1:

Этот класс нуждается в обновлении. Использование запятых в JOIN устарело; новый стиль использует JOIN .. ON

Вопрос неоднозначен-что содержит таблица title ? Я буду считать, что это так B .

  1. Поскольку включена только фильтрация title , Оптимизатор выберет B в качестве первой таблицы для просмотра:
      B needs INDEX(title)
     
  2. От B он может дотянуться до BC:
      BC needs INDEX(BookId)
     
  3. Аналогично:
      LB needs INDEX(BranchId)
     

Если вы используете MySQL, имейте в виду, что a PRIMARY KEY -это индекс. И каждый стол нуждается в PRIMARY KEY . Также a PRIMARY KEY обязательно уникален. Итак, когда я сказал «потребности», вы можете обнаружить, что потребность уже PRIMARY KEY удовлетворена.

Подробнее: http://mysql.rjweb.org/doc.php/index_cookbook_mysql

Я буду спорить со схемой-почему «количество книг» не просто столбец Books ?

Что касается запроса 2, то еще менее ясно, в какой таблице может находиться каждый столбец.

Имейте в виду, что an INDEX может содержать только столбцы из одной таблицы.

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

1. Спасибо вам за ваш ответ ! Да, я согласен с вами, что эти 2 запроса действительно неоднозначны, но это было именно то, что мне предоставил мой учитель. Я попросил у нее схему базы данных или хотя бы некоторую информацию о таблицах, но она сказала, что мне это не понадобится для ответов на вопросы. Однако ваше объяснение по первому вопросу прояснило мне ответ. Как я понимаю, вы имеете в виду, что BOOK.BookId и BOOK_COPIES.BookId являются первичными ключами, поэтому они уже проиндексированы и не нуждаются в включении в ответ.