MySQL索引:为什么多列索引的性能比单列索引差?

use*_*669 0 mysql sql indexing

我正在学习索引,我想我会尝试使用MySQL Sakila数据库进行实验.我有以下查询:

SELECT title, release_year
FROM film
WHERE release_year < 2010
AND rating = 'R';
Run Code Online (Sandbox Code Playgroud)

这是我尝试的第一个索引:

CREATE INDEX idx_releaseYear ON film(rating);
Run Code Online (Sandbox Code Playgroud)

当我运行我的查询时,MySQL EXPLAIN返回了这个:

在此输入图像描述

编辑:我对这些结果的解释:MySQL使用索引(按评级排序)快速查找所有'R'级电影,然后检查索引返回的每一行的发行年份.

接下来,我创建了一个关于rating和release_year的索引:

CREATE INDEX idx_releaseYear ON film(rating, release_year);
Run Code Online (Sandbox Code Playgroud)

当我运行我的查询时,MySQL EXPLAIN返回了这个:

在此输入图像描述

编辑:我的期望:MySQL将使用索引(按评级排序,然后发布release_year)快速查找所有'R'级电影和release_years <2010,并且仅使用电影表从索引返回的行中检索电影标题.尽管数据库中的所有电影都具有相同的release_year,但我认为通过评级对索引进行排序,然后发布年份将作为第一个查询执行得更好(或者至少相同,仅使用索引的第一列),因为在第一个查询中查询它必须以随机顺序检查发布年份.

为什么第一个单列索引的性能优于第二个多列索引?我认为它们至少会表现相同,因为评级首先列出.

您应该注意一件事:数据库中的所有电影都有2006年发行年份.

Gor*_*off 5

这个评论太长了.

您的表中有195行.我不知道您的数据结构,但很可能所有行都适合一个数据页,可能是两个.

索引不是为该大小的数据而设计的.它们旨在使查询在更大的数据集上运行得更快.使用索引有一些开销.例如,MySQL需要加载数据页和索引页来运行查询.通过减少读取的页数,您可能无法节省成本.

道德很简单.不要在真正小的查询上判断性能.通常,在这些情况下不需要索引,因为它们有额外的开销.