iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL的优化器对于count(*)的处理方式是什么
  • 167
分享到

MySQL的优化器对于count(*)的处理方式是什么

2024-04-02 19:04:59 167人浏览 八月长安
摘要

今天就跟大家聊聊有关Mysql的优化器对于count(*)的处理方式是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获

今天就跟大家聊聊有关Mysql优化器对于count(*)的处理方式是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

   最近看了很多阿里同学的mysql文章,阿里内核同学的文章一言不合就上代码,不光让我们看到了结果,还能有代码可读,如果碰到了类似的问题,这样的解读确实是很难得的。

   今天做了一个小的测试,发现Mysql 5.7中对于count(*)的处理好像有点霸道,没想象中那么好。

   为了对比,我找了一套5.6的环境。

总体而言5.6的环境中对于count(*)的处理可塑性很强,很随和,你让我怎么查我就怎么查。初始数据为100万。

+----------+
| count(*) |
+----------+
|  1000000 |
+----------+

建表的语句如下:

>show create table test\G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  `c` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `mrrx` (`a`,`b`),
  KEY `xx` (`c`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)一直以来MySQL中count(*)的用法都是不被提倡,或者说是恶名远扬,这一点让很多学习oracle的同学很不理解,其实他们是身在福中不知福。

这样的一个count(*)的查询,在5.6中的效果是这样的,估算的时候默认是走了索引xx

>explain select count(*) from test\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
         type: index
possible_keys: NULL
          key: xx
      key_len: 5
          ref: NULL
         rows: 998396
        Extra: Using index
1 row in set (0.01 sec)   
如果我们强制走mrrx索引,优化器说也行,于是就走了mrrx的索引,估算的数据情况和上面有一些小的差别。
>explain select count(*) from test force index(mrrx)\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
         type: index
possible_keys: NULL
          key: mrrx
      key_len: 10
          ref: NULL
         rows: 947698
        Extra: Using index
1 row in set (0.00 sec)或者我们显式指定就要xx索引了,优化器说好,然后估算得到的行数和第一个差别很小。
>explain select count(*) from test force index(xx)\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
         type: index
possible_keys: NULL
          key: xx
      key_len: 5
          ref: NULL
         rows: 947698
        Extra: Using index
1 row in set (0.00 sec)如果换一种姿势,如果指定索引列c,指定一个条件,再来看看,就会看到前后的结果差别就很大了。
>explain select count(*) from test where c > 0\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
         type: range
possible_keys: xx
          key: xx
      key_len: 5
          ref: NULL
         rows: 473849
        Extra: Using where; Using index
1 row in set (0.00 sec)这么看来,5.6里面的一个硬伤还是对于统计信息这块的评估差别较大,没有了统计信息还是有很大的局限性,不过优化器还是很随和的。

我们看看5.7的表现

同样的语句和数据量,在5.7中明显做了过滤处理,

> explain select count(*) from test\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: NULL
   partitions: NULL
         type: NULL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: NULL
     filtered: NULL
        Extra: Select tables optimized away
1 row in set, 1 warning (0.02 sec)

这表示在优化器阶段已经被优化了。

而接下来同样的语句也都是同样的处理方式。

> explain select count(*) from test force index(mrrx)\G
> explain select count(*) from test force index(xx)\G
        Extra: Select tables optimized away

而如果我们还是像之前一样给定索引列c一个过滤条件,优化器就一下子变得温和起来。很明显这个执行的效果要好很多。

> explain select count(*) from test where c > 0\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
   partitions: NULL
         type: range
possible_keys: xx
          key: xx
      key_len: 5
          ref: NULL
         rows: 498949
     filtered: 100.00
        Extra: Using where; Using index
1 row in set, 1 warning (0.02 sec)

从某种程度来说,5.7这样的处理也算是一种变相的退步啦。

看完上述内容,你们对MySQL的优化器对于count(*)的处理方式是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网数据库频道,感谢大家的支持。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL的优化器对于count(*)的处理方式是什么

本文链接: https://www.lsjlt.com/news/66189.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL的优化器对于count(*)的处理方式是什么
    今天就跟大家聊聊有关MySQL的优化器对于count(*)的处理方式是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获...
    99+
    2024-04-02
  • Mysql优化器对in list的处理
    select * from table where id in (....)这样的查询,是走范围索引还是走等值索引? select * from table where...
    99+
    2024-04-02
  • MySQL优化的方法是什么
    这篇文章主要介绍“MySQL优化的方法是什么”,在日常操作中,相信很多人在MySQL优化的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL优化的方法是什么”...
    99+
    2024-04-02
  • 在PHP7中对于Error的处理方法是什么
    这篇文章主要讲解了“在PHP7中对于Error的处理方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在PHP7中对于Error的处理方法是什么”吧!前段时间在项目中遇到一个当时觉得比...
    99+
    2023-06-25
  • mysql的linux机器优化方法是什么
    本篇内容主要讲解“mysql的linux机器优化方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql的linux机器优化方法是什么”吧! 文件系...
    99+
    2024-04-02
  • mysql oom优化的方法是什么
    OOM(Out of Memory)是指MySQL在执行过程中耗尽了服务器的内存资源,导致MySQL服务异常退出。为了解决OOM问题...
    99+
    2024-04-12
    mysql
  • mysql中的优化器是什么
    这篇文章主要讲解了“mysql中的优化器是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql中的优化器是什么”吧!说明分析器生成的语法树被认为是合法的,由优化器转化为执行计划。在m...
    99+
    2023-06-20
  • 分布式数据库对2PC的优化方法是什么
    本篇内容主要讲解“分布式数据库对2PC的优化方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分布式数据库对2PC的优化方法是什么”吧!两阶段提交(2PC...
    99+
    2024-04-02
  • MySQL表结构优化管理的方法是什么
    MySQL表结构优化管理的方法包括以下几个方面: 正确选择数据类型:选择适当的数据类型可以减小存储空间的占用,并提高查询和索引的...
    99+
    2023-10-24
    MySQL
  • C++对全局函数的处理方式是什么
    这篇文章主要介绍“C++对全局函数的处理方式是什么”,在日常操作中,相信很多人在C++对全局函数的处理方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++对全局函数的处理方式是什么”的疑惑有所帮助!...
    99+
    2023-06-17
  • Mysql中怎么进行优化器对子查询的处理
    本篇文章给大家分享的是有关Mysql中怎么进行优化器对子查询的处理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。根据子查询的类型和位置不同,m...
    99+
    2024-04-02
  • MySQL索引优化的方法是什么
    MySQL索引优化的方法有以下几种: 选择合适的列创建索引:根据查询的列和条件,选择最经常使用的列创建索引,以提高查询的效率。 ...
    99+
    2024-04-09
    MySQL
  • mysql优化查询的方法是什么
    MySQL 优化查询的方法包括但不限于以下几点: 使用合适的索引:在查询中使用适当的索引可以大大提高查询性能。确保表中的字段有适当...
    99+
    2024-04-23
    mysql
  • MySQL性能优化的方法是什么
    本篇内容主要讲解“MySQL性能优化的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL性能优化的方法是什么”吧!一、优化思路数据查询慢,不代表...
    99+
    2024-04-02
  • mysql中find_in_set优化的方法是什么
    在MySQL中,可以通过使用适当的索引来优化FIND_IN_SET()函数的性能。 FIND_IN_SET()函数用于在逗号分隔的字...
    99+
    2024-04-09
    mysql
  • mysql自动优化的方法是什么
    MySQL自动优化的方法主要包括使用MySQL的自动优化器和执行自动优化工具。 MySQL的自动优化器:MySQL自带了一个优化...
    99+
    2024-04-22
    mysql
  • mysql排序优化的方法是什么
    MySQL排序优化的方法有以下几种: 索引优化:为排序的列创建索引,可以大幅提高排序的效率。可以考虑创建单列索引、组合索引或者覆...
    99+
    2024-04-09
    mysql
  • Java中对于并发问题的处理方法是什么
    本篇内容介绍了“Java中对于并发问题的处理方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先我们一起回顾一些并发的场景最基本的,...
    99+
    2023-07-05
  • 对象化自然语言处理:Python API 中的实现方式是什么?
    自然语言处理是人工智能领域的一个重要分支,其目的是让机器能够理解和处理人类的语言。Python 作为一种流行的编程语言,在自然语言处理领域也有着广泛的应用。Python 中提供了很多自然语言处理的库和 API,其中对象化的自然语言处理 A...
    99+
    2023-09-09
    api 自然语言处理 对象
  • MySQL查询优化器的工作原理是什么
    本篇内容介绍了“MySQL查询优化器的工作原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  My...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作