MySQL

62-MySQL索引优化与查询优化-索引下推

2022-11-09  本文已影响0人  紫荆秋雪_文

一、索引下推概念

Index Condition Pushdown(ICP)是MySQL 5.6中新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式。ICP可以减少存储引擎访问基表的次数以及MySQL服务器访问存储引擎的次数。

1.1、使用前后对比

1.2、ICP的开启/关闭

默认情况下启用索引条件下推,可以通过设置系统变量optimizer_switch控制:index_condition_pushdown

SET OPTIMIZER_SWITCH = 'index_condition_pushdown=off';
SET OPTIMIZER_SWITCH = 'index_condition_pushdown=on';

二、准备数据

CREATE TABLE `people`
(
    `id`        INT NOT NULL AUTO_INCREMENT,
    `zipcode`   VARCHAR(20) COLLATE utf8_bin DEFAULT NULL,
    `firstname` VARCHAR(20) COLLATE utf8_bin DEFAULT NULL,
    `lastname`  VARCHAR(20) COLLATE utf8_bin DEFAULT NULL,
    `address`   VARCHAR(50) COLLATE utf8_bin DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `zip_last_first` (`zipcode`, `lastname`, `firstname`)
);
INSERT INTO `people`
VALUES ('1', '000001', '三', '张', '北京市'),
       ('2', '000002', '四', '李', '南京市'),
       ('3', '000003', '五', '王', '上海市'),
       ('4', '000001', '六', '赵', '天津市');

三、实战

3.1、知道邮编时,查询

EXPLAIN
SELECT *
FROM people
WHERE zipcode = '000001'
  AND lastname LIKE '%张%'
  AND address LIKE '%北京市%';
SET optimizer_switch = 'index_condition_pushdown=on';

Extra中显示了Using index condition,这表示使用了索引下推Using where表示条件中包含需要过滤的非索引列的数据,即address LIKE '%北京市%'这个条件并不是索引列,需要在服务端过滤掉

四、开启和关闭 ICP 的性能对比

创建存储过程,主要目的就是插入很多 000001 的数据,这样查询的时候为了在存储引擎层做过滤,减少IO,也为了减少缓冲池(缓存数据页,没有IO)的作用

DELIMITER $
CREATE PROCEDURE insert_people(max_num INT)
BEGIN
    DECLARE i INT DEFAULT 0;
    SET autocommit = 0;
    REPEAT
        SET i = i + 1;
        INSERT INTO people (zipcode, firstname, lastname, address) VALUES ('000001', '六', '赵', '天津市');
    UNTIL i = max_num
        END REPEAT;
    COMMIT;
END $

DELIMITER ;
CALL insert_people(1000000);

4.1、开启 PROFILING

SET PROFILING = 1;

4.2、查询SQL

SELECT *
FROM people
WHERE zipcode = '000001'
  AND lastname LIKE '%张%';

4.3、查看SHOW PROFILES

SHOW PROFILES
image.png

4.4、关闭 ICP

SET optimizer_switch = 'index_condition_pushdown=off';
SELECT *
FROM people
WHERE zipcode = '000001'
  AND lastname LIKE '%zhang%';
image.png
show profile for query 查询id;
执行时最耗时.png

五、 ICP的使用条件

六、在不使用 ICP 索引扫描的过程

image.png image.png

七、使用 ICP 索引扫描的过程

首先将index key条件满足的索引记录区间确定,然后在索引上使用index filter进行过滤。将满足的index filter条件的索引记录才去回表取出整行记录返回server层。不满足index filter条件的索引记录丢弃,不回表、也不会返回server层

对返回的数据,使用table filter条件做最后的过滤

image.png image.png

八、小结

上一篇 下一篇

猜你喜欢

热点阅读