社区
教程
Wiki
注册
登录
创作新主题
社区所有版块导航
Python
python开源
Django
Python
DjangoApp
pycharm
DATA
docker
Elasticsearch
分享
问与答
闲聊
招聘
翻译
创业
分享发现
分享创造
求职
区块链
支付之战
aigc
aigc
chatgpt
WEB开发
linux
MongoDB
Redis
DATABASE
NGINX
其他Web框架
web工具
zookeeper
tornado
NoSql
Bootstrap
js
peewee
Git
bottle
IE
MQ
Jquery
机器学习
机器学习算法
Python88.com
反馈
公告
社区推广
产品
短视频
印度
印度
一周十大热门主题
飒视频 | ChatGPT给你写的“调查报告”,可能不属于你
【Ludic:轻量Python框架,类似于 React,使用组件-20240322132157
写给不会代码的你:20分钟上手 Python + AI
类ChatGPT平台Cohere正融资5亿美元,估值50亿美元
本周github最火的开源项目是这个!!!
Python编程的终极十大工具
GPT-4「荣升」AI顶会同行评审专家?斯坦福最新研究:ICLR/NeurIPS等竟有16.9%评审...
GitHub(微博搜索)-20240324-1
Stability AI CEO宣布辞职;消息称OpenAI将与好莱坞电影公司会面并推荐Sora丨A...
内容整理人员招募|数据湖、大模型、推荐、图机器学习等
关注
Py学习
»
DATABASE
MySQL count
慧鑫coming
• 5 年前 • 160 次点击
不同引擎count(*)实现方式不同
MyISAM引擎把一个表的总行数记录在了磁盘上,执行count(*)会直接返回这个数值,效率很高。
InnoDB,执行count(*),需要把数据一行行的从引擎中读出来,然后累积计数。
InnoDB对count(*)的优化
我们知道,InnoDB是索引组织表,主键索引的叶子节点保存的是数据;普通索引的叶子节点保存的是主键值。所以,普通索引比主键索引小,
对于count(*)这样的操作,遍历哪个索引树得到的结果逻辑上是一样的
,因此,MySQL优化器会找到最小的索引树来遍历,
在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库系统设计的通用法则之一。
show table status与count(*)
show table status命令输出结果中有一个TABLE_ROW值,但不能代替cout(*),因为它是通过采样统计计算的,误差较大(可能达到40%-50%)。
聚合函数count()
count()是一个聚合函数,对于返回结果,一行行的判断,如果count函数的参数不是NULL,累计值就+1,否则不加,最后返回累计值。
count(*)、count(id)、count(1)都表示返回
满足查询条件
的结果集的总行数;count(字段),表示返回
满足条件的数据行里面参数字段不为NULL
的结果的总个数。
不同count参数性能对比
count(主键id)
:InnoDB引擎会遍历整张表,把每一行id值都取出来,返给server层。server层拿到id后,
判断是不可能为空的
,就按行累加,
不再对每个值进行NULL判断
。
count(1)
:InnoDB引擎会遍历整张表,但不取值。server层对于返回的每一行,放一个数字“1”进去,
判断是不可能为空的
,按行累加,
不再对每个值进行NULL判断
。
count(1)比count(主键id)执行的要快,因为从引擎放回id会涉及解析数据行,以及拷贝字段值的操作。
count(字段)
:
1、如果
参数字段
定义
NOT NULL
,
判断是不可能为空的
,按行累加,
不再对每个值进行NULL判断
。
2、如果
参数字段
定义允许为
NULL
,那么执行的时候,
判断可能是NULL,还要把值取出来再判断一下,不是NULL才累加
。
这也是定义字段时建议设置NOT NULL的原因之一。
count(*)
:前面说过,InnoDB专门对它做了优化
结论
:对于InnoDB引擎,按效率排序,
count(字段) < count(主键id) < count(1) ≈ count(*)
,建议尽量使用count(*)
Python社区是高质量的Python/Django开发社区
本文地址:
http://www.python88.com/topic/29131
160 次点击
登录后回复