为什么定义mysql表的索引会增加查询的性能?
答案 0 :(得分:6)
如果您对书中的特定主题感兴趣,请转到书的后面,并在索引中按字母顺序查找。索引会告诉您讨论主题的页码。然后你直接跳到你感兴趣的页面。比阅读整本书快得多。
在数据库中也是如此。索引意味着您可以跳转到连接行,而不是扫描表中的每一行以查找匹配项。
查看聚簇索引的工作原理(http://msdn.microsoft.com/en-us/library/ms177443.aspx)。你可以拥有每张桌子中的一个。
这篇文章解释了非聚集索引的工作原理(http://msdn.microsoft.com/en-us/library/ms177484.aspx)。你可以随心所欲地拥有它们。
这两篇文章都是关于Microsoft Sql Server的,但索引背后的理论在所有关系数据库管理系统中都是相同的。
索引确实有相关费用。每次在表上执行插入/更新时,也可能必须更新受影响的索引。当然,索引会占用空间 - 但这对我们大多数人来说并不是一个问题。因此,您需要平衡快速连接或过滤的性能优势与插入和更新的成本。
作为指南,您通常需要一个与join或where子句中包含的每个列匹配的索引:
SELECT
*
FROM
Customer
WHERE
RegistrationDate > @registrationDate
AND RegistrationCountry = @registrationCountry;
因此,Customer表上包含RegistrationDate和RegistrationCountry列的索引将加速此查询。因为我们使用的是“>”在我们的查询中,这将是聚簇索引的一个很好的候选者(第一篇文章显示聚簇索引以索引顺序物理排列数据,因此范围查询可以非常快速地隔离索引的范围)。
SELECT
*
FROM
Customer c
INNER JOIN Order o
ON o.CustomerID = c.CustomerID
AND o.OrderType = @orderType
在这里,我们希望Customer表上包含CustomerID列的索引。我们希望Order表上包含CustomerID和OrderType列的索引。然后,连接的两侧都不需要进行表扫描。
通常只有少数几种从表中查询数据的方法,因此您不会获得索引过载。很多索引有时表明您的表格有各种各样的问题并且可以进行标准化。
答案 1 :(得分:1)
您可能想要了解数据库indexes的基础知识。索引主要用于组织数据。
答案 2 :(得分:0)
我发现有时用两个较小的查询替换JOIN查询要快得多,然后用PHP或任何调用MySQL的语言加入它们。因此,尝试两者并计算时间,看看哪个更适合特定情况,但请记住,“最快”的解决方案可能会随着数据库大小的增加而改变。