下面我来详细讲解“Mysql性能优化案例 - 覆盖索引分享”的完整攻略。
什么是覆盖索引
在 MySQL 中,如果使用了索引的列恰好是查询列,那么就称该索引覆盖了查询,叫做覆盖索引。
具体地说,覆盖索引指对于一条 SQL 语句,查询列的所有数据都可以从索引中获取,而不必访问表中的数据行。这种情况下,查询效率可以达到最大化。
为什么需要覆盖索引
因为 MySQL 的查询性能和索引有很大关系。当我们查询的数据量大时,如果没有使用索引,MySQL 就会进行全表扫描,这种行为耗费 CPU 和内存资源非常大。
当我们对 SQL 语句进行优化时,光是在列上建立索引是不够的;如果查询场景是一个特定的列或几个列,我们可以使用覆盖索引,从而显著提高查询效率,降低 CPU 和内存的耗费。
如何使用覆盖索引
对于 MySQL 的覆盖索引来说,主要涉及到两个方面:
- 对列的索引
- 查询的列必须是索引列
下面是两条示例说明:
示例 1:查询定向加速
假设我们有一个用户表,并建立了两个字段的索引:
CREATE TABLE user (
id INT,
username VARCHAR(20),
age INT,
PRIMARY KEY (id),
INDEX (username),
INDEX (age)
);
这个时候,要查询用户名为'johndoe'的用户时,我们可以写出以下 SQL:
SELECT id, age FROM user WHERE username = 'johndoe';
由于用户名已经建立了索引,所以这个语句就是一个典型的覆盖索引查询,查询语句中只需要使用到用户名所在的索引,而不需要再访问表中其他列的数据,从而显著提高了查询的效率。
示例 2:排序优化
假设我们有一个存储股票信息的表,并建立了两个字段的索引:
CREATE TABLE stocks (
symbol VARCHAR(10),
date DATE,
price FLOAT(7,2),
PRIMARY KEY (symbol, date),
INDEX (price)
);
这个时候,如果我们要获取最近一年股票涨幅最高的10只股票,我们可以写出以下 SQL:
SELECT symbol, price FROM stocks WHERE date >= '2019-01-01' AND price > 10 ORDER BY price DESC LIMIT 10;
由于日期和价格都建立了索引,我们可以采用覆盖索引的方式,从而避免了使用索引的列排序时需要访问表格数据的缺点。
综上所述,采用覆盖索引的方式,可以显著提高 MySQL 的查询效率,特别是在大数据量的情况下,更是具有非常重要的意义。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mysql性能优化案例 – 覆盖索引分享 - Python技术站