索引在mysql中的性能作用

hd.*_*hd. 0 mysql join

为什么定义mysql表的索引会增加查询的性能?

she*_*tie 6

如果你有兴趣在一本书一个特定的主题,你去书的后面,并在索引中按字母顺序找到它.索引会告诉您讨论主题的页码.然后你直接跳到你感兴趣的页面.比阅读整本书快得多.

它在数据库中是相同的.索引意味着您可以跳转到连接行,而不是扫描表中的每一行以查找匹配项.

看看一个聚集索引是如何工作的(http://msdn.microsoft.com/en-us/library/ms177443.aspx).你可以拥有每个表中的一个.

这ARTICAL解释了非聚集索引是如何工作的(http://msdn.microsoft.com/en-us/library/ms177484.aspx).你可以随心所欲地拥有它们.

这两篇文章都是关于Microsoft Sql Server的,但索引背后的理论在所有关系数据库管理系统中都是相同的.

索引确实有相关的成本.每次在表上执行插入/更新时,也可能必须更新受影响的索引.当然,索引会占用空间 - 但这对我们大多数人来说并不是一个问题.因此,您需要在更快的连接或过滤的性能优势与插入和更新的成本之间取得平衡.

作为指南,您通常需要一个与join或where子句中包含的每个列匹配的索引:

SELECT 
    * 
FROM 
    Customer 
WHERE 
    RegistrationDate > @registrationDate 
    AND RegistrationCountry = @registrationCountry;
Run Code Online (Sandbox Code Playgroud)

因此,Customer表上包含RegistrationDate和RegistrationCountry列的索引将加速此查询.由于我们在查询中使用">",这将是聚簇索引的良好候选者(第一篇文章显示聚簇索引按索引顺序物理排列数据,因此范围查询可以非常快速地隔离索引的范围).

SELECT 
    * 
FROM 
    Customer c
    INNER JOIN Order o
        ON o.CustomerID = c.CustomerID
        AND o.OrderType = @orderType
Run Code Online (Sandbox Code Playgroud)

在这里,我们希望Customer表上包含CustomerID列的索引.我们希望Order表上包含CustomerID和OrderType列的索引.然后,连接的两侧将不需要进行表扫描.

通常,只有少数几种方法可以从表中查询数据,因此您不会获得索引过载.很多索引有时表明您的表格有各种各样的问题并且可以进行标准化.