索引(在MySQL中也叫做“键(key)”)是存储引擎用于快速找到记录的一种数据结构。 这是索引的基本功能,除此之外,本章还将讨论索引其他一些方面有用的属性。
索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但 当数据量逐渐增大时,性能则会急剧下降。
不过,索引却经常被忽略,有时候甚至被误解,所以在实际案例中经常会遇到由糟糕索引导致的问题。这也是我们把索引优化放在了靠前的章节,甚至比査询优化还靠前的原因。
索引优化应该是对査询性能优化最有效的手段了。索引能够轻易将查询性能提高几个数量级,“最优”的索引有时比一个“好的”索引性能要好两个数量级。创建一个真正“最 优”的索引经常需要重写査询,所以,本章和下一章的关系非常紧密。
要理解MySQL中索引是如何工作的,最简单的方法就是去看看一本书的“索引”部分: 如果想在一本书中找到某个特定主题,一般会先看书的“索引”,找到对应的页码。
在MySQL中,存储引擎用类似的方法使用索引,其先在索引中找到对应值,然后根据 匹配的索引记录找到对应的数据行。假如要运行下面的査询:
mysql> SELECT first_ame FROM sakila.actor WHERE actor_id = 5;
如果在actor_id列上建有索引,则MySQL将使用该索引找到actor_id为5的行,也 就是说,MySQL先在索引上按值进行査找,然后返回所有包含该值的数据行。
索引可以包含一个或多个列的值。如果索引包含多个列,那么列的顺序也十分重要,因 为MySQL只能高效地使用索引的最左前缀列。创建一个包含两个列的索引,和创建两 个只包含一列的索引是大不相同的,下面将详细介绍。
简而言之:是的,仍然需要理解索引,即使是使用对象关系映射(ORM)工具。
(ORM)工具能够生产符合逻辑的、合法的查询(多数时候),除非只是生成非常基本 的查询(例如仅是根据主键查询),否则它很难生成适合索引的查询。无论是多么 复杂的(ORM)工具,在精妙和复杂的索引面前都是“浮云”。读完本章后面的内容 以后,你就会同意这个观点的!很多时候,即使是查询优化技术专家也很难兼顾到 各种情况,更别说(ORM) 了。