05深入浅出索引(下).pptx
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
在数据库管理中,索引是一种重要的数据结构,用于提高查询效率。本篇主要探讨了索引的类型、使用策略以及优化方法,以MySQL为例进行讲解。 我们创建了一个名为`T`的表,包含三个字段:`ID`为主键,`k`为非主键且有默认值,`s`为非主键字符串字段,并为`k`字段创建了索引。在InnoDB引擎中,主键索引(聚簇索引)是表数据的物理存储方式,而非主键索引(二级索引)则是一个单独的B+树结构,包含索引列和指向主键的指针。 当我们执行`SELECT * FROM T WHERE k BETWEEN 3 AND 5`这样的查询时,会先在`k`索引树上查找满足条件的记录,获取`k`值,然后根据`k`值对应的主键`ID`在主键索引中查找完整记录。这个过程被称为“回表”。而如果查询只需要索引中的列,如`SELECT ID FROM T WHERE k BETWEEN 3 AND 5`,则可以直接在`k`索引树上完成,无需回表,这种现象称为“覆盖索引”,能显著提升查询性能。 接着,我们讨论了联合索引和最左前缀原则。联合索引如`(name, age, id)`允许按顺序的任何前缀进行查询优化。例如,`WHERE name = '张三'`或`WHERE name LIKE '张%'`都可以利用`name`这一部分的索引。然而,`WHERE age = 10`不能利用此联合索引,因为它不遵循最左前缀原则。而在MySQL 5.6及以上版本,如果有`WHERE name LIKE '张%' AND age = 10`的查询,可以通过索引下推优化,即在遍历索引时同时检查`age`的条件。 我们面对一个思考题,涉及表`geek`的索引设计。表`geek`有四个字段`a`、`b`、`c`、`d`,主键为`(a, b)`,还有两个额外的索引`c`和`(c, a)`。对于`SELECT * FROM geek WHERE c=N ORDER BY a LIMIT 1`和`SELECT * FROM geek WHERE c=N ORDER BY b LIMIT 1`的查询,虽然`c`索引可以快速定位到`c`值,但为了满足`ORDER BY`和`LIMIT`,仍然需要回表并排序,这可能不是最优的。而`(c, a)`和`(c, b)`联合索引分别对`ORDER BY a`和`ORDER BY b`的查询提供了优化,但`LIMIT 1`意味着只返回一条记录,如果`c`相同,`a`或`b`的顺序并不重要,因此这些索引可能过于冗余。 理解索引的工作原理,特别是聚簇索引、二级索引、覆盖索引、联合索引以及最左前缀原则,对于优化数据库查询性能至关重要。在实际应用中,应根据查询模式和数据分布来设计合理的索引策略,以达到最佳的查询效率。
- 粉丝: 48
- 资源: 8282
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助