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

  • 相关阅读:
    洛谷 P3366 【模板】最小生成树
    libfreenect
    openni2 和opencv读取数据
    kinect数据读取
    kinect for windows sdk
    caffe android lib
    Hlsl2glsl
    手势识别半自动标注结果视频
    CLM
    10位算法大师
  • 原文地址:https://www.cnblogs.com/yc5518/p/11712223.html
Copyright © 2011-2022 走看看