• ADADADADAD

    MySQL count(*)之索引选择[ mysql数据库 ]

    mysql数据库 时间:2024-12-24 19:11:33

    作者:文/会员上传

    简介:

    覆盖索引对于一些统计问题,如下:MySQL>showcreatetabletest1\G***************************1.row***************************Table:test1CreateTable:CREATETABLE`test1`(`id

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    覆盖索引对于一些统计问题,如下:

    MySQL>showcreatetabletest1\G***************************1.row***************************Table:test1CreateTable:CREATETABLE`test1`(`id`bigint(16)NOTNULLAUTO_INCREMENT,`order_seq`bigint(16)NOTNULL,PRIMARYKEY(`id`),KEY`idx_id`(`id`),KEY`idx_id_ordseq`(`id`,`order_seq`))ENGINE=InnoDBAUTO_INCREMENT=15002212DEFAULTCHARSET=utf8mb41rowinset(0.00sec)MySQL>explainselectcount(*)fromtest1whereid>10000andid<20000;+----+-------------+-------+------------+-------+------------------------------+--------+---------+------+------+----------+--------------------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-------+------------+-------+------------------------------+--------+---------+------+------+----------+--------------------------+|1|SIMPLE|test1|NULL|range|PRIMARY,idx_id,idx_id_ordseq|idx_id|8|NULL|9999|100.00|Usingwhere;Usingindex|+----+-------------+-------+------------+-------+------------------------------+--------+---------+------+------+----------+--------------------------+1rowinset,1warning(0.00sec)

    innodb存储引擎选择了id字段的辅助索引,而不是聚集索引来统计,更不是联合索引。原因是辅助索引远小于聚集索引,选择辅助索引可以减少IO资源消耗。

    而另外一个统计场景:

    select count(*) from test1 where order_seq > 1502131212577 and order_seq< 202007080947244761;

    test1表建有id和order_seq 字段的联合索引。

    MySQL>showcreatetabletest1\G***************************1.row***************************Table:test1CreateTable:CREATETABLE`test1`(`id`bigint(16)NOTNULLAUTO_INCREMENT,`order_seq`bigint(16)NOTNULL,PRIMARYKEY(`id`),KEY`idx_id`(`id`),KEY`idx_id_ordseq`(`id`,`order_seq`))ENGINE=InnoDBAUTO_INCREMENT=15002212DEFAULTCHARSET=utf8mb41rowinset(0.00sec)MySQL>explainselectcount(*)fromtest1whereorder_seq>1502131212577andorder_seq<202007080947244761;+----+-------------+-------+------------+-------+---------------+---------------+---------+------+----------+----------+--------------------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-------+------------+-------+---------------+---------------+---------+------+----------+----------+--------------------------+|1|SIMPLE|test1|NULL|index|NULL|idx_id_ordseq|16|NULL|15068082|11.11|Usingwhere;Usingindex|+----+-------------+-------+------------+-------+---------------+---------------+---------+------+----------+----------+--------------------------+1rowinset,1warning(0.00sec)

    这里使用条件order_seq 查询,一般情况下使用不了联合索引的,但是这个案例中的查询,利用到覆盖索引的信息。possible_keys依然为null,但是key是idx_id_ordseq,extra里出现Using index,表示为覆盖索引。

    MySQL count(*)之索引选择.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: mysqlcount索引