zoukankan      html  css  js  c++  java
  • 回表查询的说明

    你可能从来都没有听说过回表一词,但是你在实际工作中肯定用过回表。如果还没有听过回表,那我相信不管你看多少 SQL 优化的知识,都还只是停留在表面。即使你参考学习过我前面的这篇文章《MySQL 性能优化神器 Explain 使用教程》。

    一条SQL语句的查询过程

    我们先来看看什么是回表?

    通俗的讲就是,如果索引的列在 select 所需获得的列中(因为在 mysql 中索引是根据索引列的值进行排序的,所以索引节点中存在该列中的部分值)或者根据一次索引查询就能获得记录就不需要回表,如果 select 所需获得列中有大量的非索引列,索引就需要到表中找到相应的列的信息,这就叫回表。

    根据这个概念,当你使用 Explain 执行查询计划时,当结果中 Extra 出现了 using index、using where、using index condition 等你就认为使用了过滤条件,使用了索引,SQL 优化的还不错。这其实是一种错误的认识。

    因为,使用了索引并不代表查询就最优。从 using index condition、using index & using where 等可以看出,这条 SQL 语句其实是进行了回表的。

    还有些时候,你查看 Explain 执行计划后,发现明明走了索引,为什么还是慢?这里面可能就是存在回表了。下面我们通过一个例子来说明什么是回表。先创建一张表,sql 语句如下:

    create table xttblog(
        id int primary key, 
        k int not null, 
        name varchar(16),
        index (k)
    )engine = InnoDB;

    然后,我们再执行下面的 SQL 语句,插入几条测试数据。

    INSERT INTO xttblog(id, k, name) VALUES(1, 2, 'xttblog'),
        (2, 1, '业余草'),
        (3, 3, '业余草公众号');

    假设,现在我们要查询出 id 为 2 的数据。那么执行 select * from xttblog where ID = 2; 这条 SQL 语句就不需要回表。原因是根据主键的查询方式,则只需要搜索 ID 这棵 B+ 树。主键是唯一的,根据这个唯一的索引,MySQL 就能确定搜索的记录。

    但当我们使用 k 这个索引来查询 k = 2 的记录时就要用到回表。select * from xttblog where k = 2; 原因是通过 k 这个普通索引查询方式,则需要先搜索 k 索引树,然后得到主键 ID 的值为 1,再到 ID 索引树搜索一次。这个过程虽然用了索引,但实际上底层进行了两次索引查询,这个过程就称为回表。

    也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。

    我这里表里的数据量比较少,如果数据量大的话,你能很明显的看出两次查询所用的时间,很明显使用主键查询效率更高。

  • 相关阅读:
    XtraBackup2.3.3安装配置使用(innobakupex)
    MySQL主从配置问题整理
    saltstack之(十二)配置管理mount
    常用HTTP状态码和CURL 000问题
    RHEL6解决无法使用YUM源问题
    zabbix监控MySQL
    ELK-Python(三)
    解决eclipse项目下出现deployment descriptor和jax-ws web services
    【未来畅想】未来的电信通讯行业,账号密码将取代sim卡
    最新samba.tar.gz安装方法
  • 原文地址:https://www.cnblogs.com/tuanz/p/11806017.html
Copyright © 2011-2022 走看看