这些查询中应该使用哪些索引?
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
.
因为唯一的过滤是 title
,优化器将选择 B
作为第一个 table 查看:
B needs INDEX(title)
从B出发,可以到达BC:
BC needs INDEX(BookId)
同理:
LB needs INDEX(BranchId)
如果您使用 MySQL,请注意 PRIMARY KEY
是一个索引。每个 table 需要一个 PRIMARY KEY
。 PRIMARY KEY
也必然是唯一的。所以,当我说“需要”时,你可能会发现已经有一个PRIMARY KEY
满足了这个需要。
更多:http://mysql.rjweb.org/doc.php/index_cookbook_mysql
我会对架构提出异议——为什么“书籍数量”不仅仅是 Books
中的一列?
至于查询 2,更不清楚 table 每列可能在哪一列中。
请注意,INDEX
只能包含来自单个 table 的列。
我对 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
.
因为唯一的过滤是
title
,优化器将选择B
作为第一个 table 查看:B needs INDEX(title)
从B出发,可以到达BC:
BC needs INDEX(BookId)
同理:
LB needs INDEX(BranchId)
如果您使用 MySQL,请注意 PRIMARY KEY
是一个索引。每个 table 需要一个 PRIMARY KEY
。 PRIMARY KEY
也必然是唯一的。所以,当我说“需要”时,你可能会发现已经有一个PRIMARY KEY
满足了这个需要。
更多:http://mysql.rjweb.org/doc.php/index_cookbook_mysql
我会对架构提出异议——为什么“书籍数量”不仅仅是 Books
中的一列?
至于查询 2,更不清楚 table 每列可能在哪一列中。
请注意,INDEX
只能包含来自单个 table 的列。