问题描述
我在理论课上有一个关于 sql 索引的问题。它要求我选择应该索引哪一列来优化这两个查询:(这是“纸”问题,所以我没有提供数据库来使用 EXPLAIN 测试这些索引)
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.title、BOOK_copIES.BranchId 和 LIBRARY_BRANCH.BranchId 应该用于索引。但是,我真的不明白为什么不选择 BOOK.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,Address
HAVING COUNT(BL.BookId,BranchId)>5;
如果我在 BOOK_LOANS.CardNo、BORROWER.CardNo、Name 和 Address 上创建索引会优化吗?
解决方法
该类需要更新。在 JOIN
中使用逗号已过时;新样式使用 JOIN .. ON
问题不明确——哪个表包含title
?我假设它是 B
。
-
由于唯一的过滤是在
title
上,优化器将选择B
作为要查看的第一个表:B needs INDEX(title)
-
从 B 可以到达 BC:
BC needs INDEX(BookId)
-
同样:
LB needs INDEX(BranchId)
如果您使用 MySQL,请注意 PRIMARY KEY
是一个索引。每个表都需要一个 PRIMARY KEY
。 PRIMARY KEY
也必须是唯一的。所以,当我说“需要”时,你可能会发现已经有一个PRIMARY KEY
可以满足需要。
更多:http://mysql.rjweb.org/doc.php/index_cookbook_mysql
我会质疑架构——为什么“书的数量”不仅仅是 Books
中的一列?
对于查询 2,更不清楚每列可能在哪个表中。
请注意,INDEX
只能包含单个表中的列。