count(1)与count(id)与count(*)效率,以及覆盖索引,索引下推
select count(*)和select count(1)的区别:一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的,假如表没有主键(Primary key), 那么count(1)比count(*)快,如果有主键的话,那主键作为count的条件时候count(主键)最快,如果你的表只有一个字段的话那count(*)就是最快的
count(1) > count() > count(主键id) > count(带索引column) > count(不带索引column),count(1)效率稍微高于count(),但差距微乎其微。
select count(*) from T;
如果表T只有主键聚簇索引,那么count(*)比较慢:原因聚簇索引,主键上有整行数据,同样容量的空间,存储更少的查询索引树。
如果表T除了主键聚簇索引外还有非空普通索引,那么同样容量的空间,存储更多的索引树,普通索引的叶子节点存储的是主键。
一个表最多建16个索引
mysql 版本不同单表支持索引数也不同,64位系统,版本5.0后,mysql 可支持16个索引,最大索引长度256字节
索引越多,更新索引代价越大,一般在5-6个索引。
索引下推
什么是索引下推(Index Condition Pushdown,ICP)呢?假设有这么个需求,查询表中“名字第一个字是张,性别男,年龄为10岁的所有记录”。那么,查询语句是这么写的:
mysq> select * from tuser where name like ‘张 %’ and age=10 and ismale=1;
根据前面说的“最左前缀原则”,该语句在搜索索引树的时候,只能匹配到名字第一个字是‘张’的记录(即记录ID3),接下来是怎么处理的呢?当然就是从ID3开始,逐个回表,到主键索引上找出相应的记录,再比对age和ismale这两个字段的值是否符合。
但是!MySQL 5.6引入了索引下推优化,可以在索引遍历过程中,对索引中包含的字段先做判断,过滤掉不符合条件的记录,减少回表字数。
下面图1、图2分别展示这两种情况。
(图1)
(图2)
图 1 中,在 (name,age) 索引里面我特意去掉了 age 的值,这个过程 InnoDB 并不会去看 age 的值,只是按顺序把“name 第一个字是’张’”的记录一条条取出来回表。因此,需要回表 4 次。
图 2 跟图 1 的区别是,InnoDB 在 (name,age) 索引内部就判断了 age 是否等于 10,对于不等于 10 的记录,直接判断并跳过。在我们的这个例子中,只需要对 ID4、ID5 这两条记录回表取数据判断,就只需要回表 2 次。
总结:如果没有索引下推优化(或称ICP优化),当进行索引查询时,首先根据索引来查找记录,然后再根据where条件来过滤记录;在支持ICP优化后,MySQL会在取出索引的同时,判断是否可以进行where条件过滤,也就是说提前执行where的部分过滤操作,在某些场景下,可以大大减少回表次数,从而提升整体性能。
覆盖索引
从普通索引树回到主键索引树的过程,称为回表
不用回表,就是覆盖索引
count(1)与count(id)与count(*)效率,以及覆盖索引,索引下推相关推荐
- mysql 求count和_MySQL的统计总数count(*)与count(id)或count(字段)的之间的各自效率性能对比...
执行效果: 1. count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和coun ...
- 【Mysql学习笔记】count(1)、count(*)、count(id)和count(字段)
reference1 reference2 count(1),表示扫描表,count(1)它在扫描到一行时不会取任何值,而是直接返回一个1,然后累加1的个数. count(),MyISAM引擎中直接在 ...
- High Version Count Issues(SQL高Version Count) (文档 ID 296377.1)
Troubleshooting: High Version Count Issues (文档 ID 296377.1) In this Document Purpose Ask Questions ...
- Troubleshooting: High Version Count Issues (文档 ID 296377.1)
In this Document Purpose Ask Questions, Get Help, And Share Your Experiences With This Article ...
- mysql count 不等于_Mysql 不同的 count 区别
不同 count 的区别: count(*).count(主键 id)和 count(1) 都表示返回满足条件的结果集的总行数:而 count(字 段), 则表示返回满足条件的数据行里面,参数&quo ...
- count返回0_MySQL实战 | 14 为什么count(*)越来越慢?
select count(*) 应该是一个比较常用的语句,用来统计记录行数. 但是,慢慢地你会发现,这个语句越来越慢了,为什么呢? count(*) 的实现方式 首先,我们来看下它的实现方式. MyS ...
- 性能对比:Count(字段)、Count(主键)、Count(1)、Count(*)
本文经授权转载自微信公众号:猿人谷 最近有几个小伙伴留言说不清楚Count(字段).Count(主键).Count(1).Count(*)的区别,特此写篇短文说明下. 以下讨论是基于InnoDB引擎. ...
- 【优化】COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名)
[优化]COUNT(1).COUNT(*).COUNT(常量).COUNT(主键).COUNT(ROWID).COUNT(非空列).COUNT(允许为空列).COUNT(DISTINCT 列名) 1. ...
- oracle count最快的方法,Oracle count哪种写法更快
1)创建测试表 test@CISCOSYS> create table t as select * from dba_objects; 表已创建. test@CISCOSYS> updat ...
- mysql聚合函数count用法_MySQL中聚合函数count的使用和性能优化技巧
本文的环境是Windows 10,MySQL版本是5.7.12-log 一. 基本使用 count的基本作用是有两个: 统计某个列的数据的数量: 统计结果集的行数: 用来获取满足条件的数据的数量.但是 ...
最新文章
- java数组转换成字符串,附小技巧
- linux 文件夹换所属用户,Linux中账号管理之权限管理(下)
- net clr via c sharp chap1-- note
- shell磁盘监控自动化处理
- 如何在Scala中将Double转换为String?
- 2015 8月31 工作计划与执行
- Spark之SparkSQL实战
- Android Handler消息机制源码分析
- java 注入为空_Spring @Autowired 注入为 null
- 十款微信小程序源码分享
- Sqlmap中代理及其他常用参数
- angular 获取上一个路由地址 获取当前页地址 地址裁切
- 学习 stm32(TTL)串口通信控制16路舵机控制板(维特智能)
- for循环语句求数组当中的最大元素
- 高德地图 定位失败,10: 定位服务启动失败 解决办法
- C++-Cmake指令:cmake_minimum_required
- 巡查使:智能巡检领域“引航者”
- python项目策划书_Python实战计划学习第一周
- 百度SDK移动开发平台学习 - 人体分析
- Android9.0 程序锁实现