mysql之千万数据试验

  • 表结构

    CREATE TABLE s1 (
        id INT NOT NULL AUTO_INCREMENT,
        key1 VARCHAR(100),
        key2 INT,
        key3 VARCHAR(100),
        key_part1 VARCHAR(100),
        key_part2 VARCHAR(100),
        key_part3 VARCHAR(100),
        common_field VARCHAR(100),
        PRIMARY KEY (id),
        KEY idx_key1 (key1),
        UNIQUE KEY idx_key2 (key2),
        KEY idx_key3 (key3),
        KEY idx_key_part(key_part1, key_part2, key_part3)
    ) Engine=InnoDB CHARSET=utf8;
    
  • 五百万数据
    1.select count(*) from s1;(查看数据量)
    在这里插入图片描述

  1. select * from s1 where id=288;(主键等值查询)
    在这里插入图片描述
    在这里插入图片描述

  2. select * from s1 where id=288;(主键范围查找)
    select * from s1 where id>78888;
    select * from s1 where id>78888 and id<90000;
    select * from s1 where id>78888 and id<90000 or id >100000;
    在这里插入图片描述
    (说明:在多个and条件下,使用的是一个字段的索引,并不需要多次(IO)检索数据页,而是找到最开始那条数据,然后走B+树的叶子节点的双向链表,只是走链表扫描的行数有差别,然后时间会有一点差别)

  3. select key1 from s1 where key1=“z0A”;(二级索引等值查找,走覆盖索引)
    select key1 from s1 where key1>“z0A”;(二级索引范围查找,走覆盖索引)
    select * from s1 where key1=“z0A”;(二级索引等值查找,不走覆盖索引)
    select * from s1 where key1>“z0A”;(二级索引范围查找,不走覆盖索引)
    在这里插入图片描述
    (说明:这里key1是一个二级索引,直接select后面是*和key1是有差别的,执行时间差别就是在于需要回表,回表记录条数越多,执行时间也越多)

  4. select * from s1(直接走的聚簇索引全表扫描);
    在这里插入图片描述
    (说明:500万条数据全表扫描也是4ms,和走索引范围查询等值查询一样)

  5. select * from s1 where key1>“a0A”;(走了二级索引,然后回表进行的全表扫描(查询的数据量超过了一定比例,扫表效率反而高,对于二级索引来说,每条数据回表成本很高的))
    在这里插入图片描述
    在这里插入图片描述

  • 五百万数据试验总结
    1.全表扫表执行时间4ms,数据网络传输80ms
    2.二级索引全表扫描的情况下,要发生回表,需要40ms,扫表建议直接走聚簇索引B+进行扫表
    3.范围查询记录比较多,能走覆盖索引走覆盖索引,否则回表效率低,性能急剧下降
    4.走二级索引的情况下,使用不了覆盖索引,那么查询字段的数量个数多少的执行时间没多大差别,主要是网络传输时间

猜你喜欢

转载自blog.csdn.net/weixin_38312719/article/details/105757197