MySQL覆盖索引
什么是覆盖索引
覆盖索引是指select查询语句使用了索引,在返回的列,必须在索引中全部能够找到,如果我们使用id查询,它会直接走聚集索引查询,一次索引扫描,直接返数据,性能高。
如果按照二级索引查询数据的时候,返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select*,尽量在返回的列中都包含添加索引的字段。
为什么避免使用select *
- SELECT * 会消耗更多的 CPU。
- SELECT * 无用字段增加网络带宽资源消耗,增加数据传输时间,尤其是大字段(如 varchar、blob、text)。
- SELECT * 无法使用 MySQL 优化器覆盖索引的优化(基于MySQL优化器的覆盖索引策略速度极快,效率极高,业界极为推荐的查询优化方式)。
- SELECT <字段列表> 可减少表结构变更带来的影响。
MySQL超大分页如何处理
超大分页一般都是在数据量比较大时,使用了limit分页查询,并且需要对数据进行排序,这个时候效率就很低,可以采用覆盖索引和子查询来解决。
- 先分页查询数据的id字段。
- 确定了id之后,再用子查询来过滤,只查询这个id列表中的数据就可以了。
因为查询id的时候,走的覆盖索引,所以效率可以提升很多。