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

问题描述

我在理论课上有一个关于 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

  1. 由于唯一的过滤是在 title 上,优化器将选择 B 作为要查看的第一个表:

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

     BC needs INDEX(BookId)
    
  3. 同样:

     LB needs INDEX(BranchId)
    

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

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

我会质疑架构——为什么“书的数量”不仅仅是 Books 中的一列?

对于查询 2,更不清楚每列可能在哪个表中。

请注意,INDEX 只能包含单个表中的列。