作者:老王
在网上随便搜搜,就能找到大把的关于MySQL优化的文章,不过里面很多都不准确,说个常见的:
SELECT a FROM ... WHERE b = ...
一般来说,很多文章会告诫你类似这样的查询,不要在“a”字段上建立索引,而应该在“b”上建立索引。这样做确实不错,但是很多时候这并不是最佳结果。为什么这样说?让我们先来分析一下查询的处理过程:在执行查询时,系统会查询“b”索引进行定位,然后再利用此定位去表里查询需要的数据“a”。也就是说,在这个过程中存在两次查询,一次是查询索引,另一次是查询表。那有没有办法用一次查询搞定问题呢?有,就是Covering Index!所谓Covering Index,就是说不必查询表文件,单靠查询索引文件即可完成。具体到此例中就是建立一个复合索引“b, a”,当查询进行时,通过复合索引的“b”部分去定位,至于需要的数据“a”,立刻就可以在索引里得到,从而省略了表查询的过程。
如果你想利用Covering Index,那么就要注意SELECT方式,只SElECT必要的字段,千万别SELECT *,因为我们不太可能把所有的字段一起做索引,虽然可以那样做,但那样会让索引文件过大,结果反倒会弄巧成拙。
如何才能确认查询使用了Covering Index呢?很简单,使用explain即可!只要在Extra里出现Using index就说明使用的是Covering Index。
知道了以上这些知识,估计对Coverging Index的了解也差不多了。再举两个例子,让大家印象深点:
(一)比如说在文章系统里统计总数的时候,一般的查询是这样的:
SELECT COUNT(*) FROM articles WHERE category_id = ...
当我们在category_id建立索引后,这个查询使用的就是Covering Index。
参考文档:
COUNT(*) vs COUNT(col)(二)比如说在文章系统里分页显示的时候,一般的查询是这样的:
SELECT id, title, content FROM article ORDER BY created DESC LIMIT 10000, 10;
通常这样的查询会把索引建在created字段(其中id是主键),不过当LIMIT偏移很大时,查询效率仍然很低,改变一下查询:
SELECT id, title, content FROM article
INNER JOIN (
SELECT id FROM article ORDER BY created DESC LIMIT 10000, 10
) AS page USING(id)
此时,建立复合索引"created, id"就可以在子查询里利用上Covering Index,快速定位id,查询效率嗷嗷的。
Covering Index并不是什么很难的概念,但是人们往往会忽视它的价值,希望本文能给你提个醒。
分享到:
相关推荐
覆盖索引(Covering Index)是数据库索引的一种优化技术,在MySQL等关系型数据库管理系统中被广泛应用。覆盖索引的特点在于它能够使得数据库系统在执行查询时,仅通过访问索引来获取所需的数据,而无需再访问实际的...
使用覆盖索引(covering index)可以避免回表,进一步提高性能。 2. ** ROW_NUMBER()函数**:MySQL 8.0引入了窗口函数ROW_NUMBER(),可以用来生成行号,从而实现分页。例如: ```sql WITH cte AS ( SELECT *, ...
对于多列索引,理解索引合并(index merge)和覆盖索引(covering index)的概念非常重要,这些都可以帮助优化查询性能。例如,覆盖索引允许查询只从索引中获取所需数据,而无需回表,大大减少了I/O操作。 然后,...
MySQL数据库是世界上最流行的开源关系型数据库管理系统之一,其高效的数据查询能力在很大程度上依赖于索引。本笔记将深入探讨MySQL中的索引使用,旨在帮助你提升数据库性能。 1. 索引的概念与类型: - 索引是一种...
六、覆盖索引(Covering Index) 如果一个查询可以从索引中获取所有需要的数据,而无需回表查询数据行,那么这个索引就被称为覆盖索引。覆盖索引可以极大提高查询效率,因为减少了磁盘I/O操作。 七、索引选择性 ...
另外,合理利用覆盖索引(Covering Index)和前缀索引(Prefix Index),可以减少I/O操作,提高查询效率。 集合函数是MySQL处理数据集的重要工具,例如COUNT(), SUM(), AVG(), MAX(), MIN()等。它们用于对一组值...
- **覆盖索引**:使用覆盖索引(covering index),使得查询能直接从索引中获取所有需要的数据,无需回表。 3. **存储引擎选择** - **InnoDB与MyISAM**:InnoDB支持事务和行级锁定,适合高并发读写场景;MyISAM...
- 使用覆盖索引(Covering Index),即索引中包含所有需要查询的列。 - 对于频繁使用的查询,考虑使用视图或存储过程来封装。 #### 数据配置优化 数据配置的优化主要包括缓存大小的设置以及合理的内存分配。通过...
3. **增强的索引**:添加了覆盖索引(covering indexes)和索引条件推送(index condition pushdown),进一步优化查询性能,减少磁盘I/O操作。 4. **动态柱状图(Dynamic Column)**:增强了数据仓库功能,支持更...
- 考虑使用覆盖索引(Covering Index),即查询所用到的所有字段都在索引中,这样可以直接从索引中获取数据,无需回表。 通过这次MySQL练习,你将更深入地理解索引的作用、创建方法以及查看索引的技巧,这对优化...
在使用辅助索引时,如果索引包含了查询所需的所有字段值,就形成了覆盖索引(Covering Index),可以避免回表查询,减少I/O操作。 MySQL 5.6引入的Index Condition Pushdown(ICP)优化策略,也称为索引下推,允许...
- **覆盖索引 (Covering Index)**:查询所需的所有信息都能在索引中找到,无需回表获取数据。 2. **索引创建原则**: - 考虑查询频率高的列。 - 用于排序和分组的列应建立索引。 - 索引数量不宜过多,过多会...
但是前缀索引也有它的坏处:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前缀索引,也不能把它们用作覆盖索引(Covering Index)。 2. 复合索引 复合索引是指一个索引包含多个列,例如在一个表中有多个列都需要建立...
引入了覆盖索引(Covering Indexes)和索引合并(Index Merge),使得查询性能得到显著提升。此外,还有对JSON字段的索引支持。 6. **ACID事务**: MySQL 8.0继续保持其对ACID(原子性、一致性、隔离性、持久性)...
- `get_best_ror_intersect` 和 `get_best_covering_ror_intersect` 函数则用于选择最佳的索引覆盖策略。 #### 四、多表查询 **4.1 多表简单 JOIN** 在处理涉及多个表的查询时,InnoDB 需要考虑多种因素来决定...
避免全表扫描,使用覆盖索引(covering index)可以让查询仅从索引中获取所需数据,而无需回表。对于多表查询,考虑使用UNION ALL代替UNION,因为UNION ALL不进行重复值检查,从而更快。 最后,定期分析和重构查询...
知识点12: 什么是索引的覆盖索引(Covering Index)? 覆盖索引是指索引能够涵盖一个查询所需的所有列,而无需在主表或索引表中进行额外的查找操作。覆盖索引可以大大提高查询性能,减少 IO 操作,并降低数据库的...
- **索引覆盖扫描(Index Covering Scan)** - 通过减少访问聚簇索引的需求来降低I/O成本。 - 计算公式:`(records + keys_per_block - 1) / keys_per_block`,其中`keys_per_block`为索引页中键的数量。 - **索引...
除了上述索引类型,还有**全文索引(FULLTEXT INDEX)**用于全文搜索,**空间索引(SPATIAL INDEX)**适用于地理空间数据,以及**覆盖索引(Covering Index)**,它允许查询仅通过索引完成,无需回表获取数据,从而...