在上一次中我们已经讨论过单列索引和多列索引,接下来我们来看看 覆盖索引和 局部列索引.
更好的索引
覆盖索引
覆盖索引是多列索引中的一种
如果我们想查询所有在1969年出道的艺人名字,可以运行下面的查询:
这个表有大约500000行数据,在没有索引的情况下查询需要耗时190毫秒.
我们给这个表加一个索引:
加了单列索引后查询耗时减少到5.9毫秒,比原来提高了97%的速度
但是我们还可以更快:
使用多列索引后,查询执行只需要1.2毫秒
多列索引导致的性能提升绝不是因为额外增加的列限制了访问的行数.
我们可以发现Extra这一列中显示了using index.
在innoDB中,主码的值会被附加在非主码索引的每个对应记录后面,因此没有必要在非主码索引中指定主码.
也就是说:primary key就是隐藏的索引,不需要手动创建的.
存储引擎的含义
对于innoDB引擎而言,非主码索引使用了主码的实际值而不是指向底层数据行的指针.myisam使用了一种B-树索引的不同的实现方式:
也就是说,在myisam引擎下主键artist_id不会再自动添加索引.
局部索引
索引可以用来限制需要查询的行数,但是一行是具有多列的,如果我们能减少列的扫描,那就能够实现进一步优化,我们可以创建具有更小宽度的小型索引.
现在添加一个索引: