zoukankan      html  css  js  c++  java
  • select COUNT 语句深入解释

    Select count 只统计不是null的列数,所以count(列名),count(常量),count(*)的区别就是:

    count(列名)中的列可能是null,于是不被统计入内

    其余两个倒是统计所有符合条件的行数,且是标准的统计行数的方法,mysql已经做了一些优化,所以推荐

    COUNT(*)的优化

    区分为MyISAM和InnoDB两种引擎的区别。MyISAM是表级锁,且不支持事务,而InnoDB是行级锁,且支持事务。

    由于MyISAM是表级锁,不会存在查询的时候并发对表行数的修改,故可以直接调用缓存下的表的行数。

    而InnoDB是会在查询的时候,行数发生变化的,不可使用缓存行数。就会涉及查询的时候实时去扫表,InnoDB 8.0.13开始,扫表开始有一些有优化:

    count(*)只关心条数,不关心内容,所以会选择低成本的索引扫表。当语句中没有where和group by条件时,InnoDB会使用聚簇索引(主键索引)和非聚簇索引(非主键索引)中的非聚簇索引。聚簇索引的叶子节点保存证行记录,而非聚簇索引只保留该行记录的主键值。所以相比之下,非聚簇索引的成本低很多,MySql会优先选择最小的非聚簇索引来扫表。因此建表的时候,除了主键索引,非主键索引也是很必要的。

    以上优化的条件是当查询语句中不存在where 和group by的时候

    COUNT(*)和COUNT(1)

    MYSQL官方文档是说InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

    COUNT(字段)

    count(字段)会判断列值是不是null,所以性能会低于count(*)

  • 相关阅读:
    Apache-Tomcat 和 Apache-Maven配置
    php版本CKFinder3.4.4自定义上传文件位置
    php版本CKEditor 4和CKFinder安装及配置
    windows10 卸载 Docker 和 DockerNAT
    faker php测试数据库生成2
    faker php测试数据库生成
    我的php.ini上传文件配置
    同一个网址电脑手机访问显示不同内容思路
    mysql where 条件中的字段有NULL值时的sql语句写法
    Chrome导出书签瘦身,去除ADD_DATE和ICON
  • 原文地址:https://www.cnblogs.com/yc5518/p/11712223.html
Copyright © 2011-2022 走看看