#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
.
- Поскольку включена только фильтрация
title
, Оптимизатор выберетB
в качестве первой таблицы для просмотра:B needs INDEX(title)
- От B он может дотянуться до BC:
BC needs INDEX(BookId)
- Аналогично:
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
являются первичными ключами, поэтому они уже проиндексированы и не нуждаются в включении в ответ.