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(*)

  • 相关阅读:
    软考过后
    最近
    软考复习初体验
    再看提高班
    C语言深入学习系列 字节对齐&内存管理
    C++ 阶段一(已完成)
    小弟,开博学习了!!
    [学习心得] 我总结的进制转换
    《深入浅出设计模式》一书学习(.net版—简单工厂)
    安装mysql 获得 mysql.h 建立C接口
  • 原文地址:https://www.cnblogs.com/yc5518/p/11712223.html
Copyright © 2011-2022 走看看