这些查询中应该使用哪些索引?

Which index(es) should be used in these queries?

我对 SQL 在我的理论 class 中建立索引有疑问。它要求我选择应该为哪一列编制索引以优化这两个查询:(这是 'paper' 问题,所以我没有提供数据库来使用 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, Name, Address
HAVING COUNT(BL.BookId, BranchId)>5;

如果我在 BOOK_LOANS.CardNo、BORROWER.CardNo、名称和地址上创建索引,它会得到优化吗?

class 需要更新。在 JOIN 中使用逗号是过时的;新样式使用 JOIN .. ON

问题不明确——table 包含什么 title?我假设它是 B.

  1. 因为唯一的过滤是 title,优化器将选择 B 作为第一个 table 查看:

     B needs INDEX(title)
    
  2. 从B出发,可以到达BC:

     BC needs INDEX(BookId)
    
  3. 同理:

     LB needs INDEX(BranchId)
    

如果您使用 MySQL,请注意 PRIMARY KEY 是一个索引。每个 table 需要一个 PRIMARY KEYPRIMARY KEY 也必然是唯一的。所以,当我说“需要”时,你可能会发现已经有一个PRIMARY KEY满足了这个需要。

更多:http://mysql.rjweb.org/doc.php/index_cookbook_mysql

我会对架构提出异议——为什么“书籍数量”不仅仅是 Books 中的一列?

至于查询 2,更不清楚 table 每列可能在哪一列中。

请注意,INDEX 只能包含来自单个 table 的列。