了解SQL中索引的基础知识

时间:2017-02-12 00:08:43

标签: sql indexing

SELECT  *  
FROM    Movies  
WHERE   studioName =    ‘Disney’    AND year    =   1990;  

每个索引的帮助程度是多少?

CREATE  INDEX   YearIndex ON    Movies(year);  
CREATE  INDEX   StudioIndex ON  Movies(studioName);  
CREATE  INDEX   YSIndex ON  Movies(year,studioName);  
CREATE  INDEX   SYIndex ON  Movies(studioName,year);  

如果WHERE子句是year = 1990,每个索引会有多少帮助?

创建年度指数确实会有所帮助,因为电影创建的时间很多,所以搜索量会大大降低。

Studioname 

也会有所帮助,但不会像年份一样多,因为有多年的时间比学生更多。

year,studioname 
在这种情况下,

是更好的选择,因为显然搜索最小化的次数超过前两次

studioname,year 

很好但不如以前好。

如果WHERE子句是年<每个索引有多少帮助? 1990?

对studioname进行索引比在年度索引更有帮助,因为在这种情况下我们必须查看所有年份不到1990年,所以如果我们在年份上进行索引,我们将不得不搜索所有年份的路径,而不是1990年,所以我认为对studioname,年份进行索引是更好的选择。

这是考虑这个的正确方法吗?

1 个答案:

答案 0 :(得分:2)

你是对的,(year,studioName)上的索引是最好的。当两个列都有条件时,它允许快速查找。

如果您有第二个查询只搜索年份,但不搜索studioName,那么相同的索引也会有所帮助。

但是如果你只有一个索引(studioName,year),而你只搜索特定年份,那么索引就无济于事。

想一下电话簿。您可以按姓氏搜索人员,因为这是该书的排序方式。您还可以按姓氏和名字搜索人员,这本书可以提供更多帮助。

但是如果你只搜索具有给定名字的人,那么这本书的排序顺序就没什么用了。

您可能会喜欢我的演示文稿,How to Design Indexes, Really或我提供的视频:https://www.youtube.com/watch?v=ELR7-RdU9XU

该演示文稿是针对MySQL量身定制的,但许多想法适用于使用B树结构实现索引的任何数据库。