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(*)效率,以及覆盖索引,索引下推相关推荐

  1. mysql 求count和_MySQL的统计总数count(*)与count(id)或count(字段)的之间的各自效率性能对比...

    执行效果: 1.  count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和coun ...

  2. 【Mysql学习笔记】count(1)、count(*)、count(id)和count(字段)

    reference1 reference2 count(1),表示扫描表,count(1)它在扫描到一行时不会取任何值,而是直接返回一个1,然后累加1的个数. count(),MyISAM引擎中直接在 ...

  3. High Version Count Issues(SQL高Version Count) (文档 ID 296377.1)

    Troubleshooting: High Version Count Issues (文档 ID 296377.1) In this Document Purpose   Ask Questions ...

  4. Troubleshooting: High Version Count Issues (文档 ID 296377.1)

    In this Document   Purpose   Ask Questions, Get Help, And Share Your Experiences With This Article   ...

  5. mysql count 不等于_Mysql 不同的 count 区别

    不同 count 的区别: count(*).count(主键 id)和 count(1) 都表示返回满足条件的结果集的总行数:而 count(字 段), 则表示返回满足条件的数据行里面,参数&quo ...

  6. count返回0_MySQL实战 | 14 为什么count(*)越来越慢?

    select count(*) 应该是一个比较常用的语句,用来统计记录行数. 但是,慢慢地你会发现,这个语句越来越慢了,为什么呢? count(*) 的实现方式 首先,我们来看下它的实现方式. MyS ...

  7. 性能对比:Count(字段)、Count(主键)、Count(1)、Count(*)

    本文经授权转载自微信公众号:猿人谷 最近有几个小伙伴留言说不清楚Count(字段).Count(主键).Count(1).Count(*)的区别,特此写篇短文说明下. 以下讨论是基于InnoDB引擎. ...

  8. 【优化】COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名)

    [优化]COUNT(1).COUNT(*).COUNT(常量).COUNT(主键).COUNT(ROWID).COUNT(非空列).COUNT(允许为空列).COUNT(DISTINCT 列名) 1. ...

  9. oracle count最快的方法,Oracle count哪种写法更快

    1)创建测试表 test@CISCOSYS> create table t as select * from dba_objects; 表已创建. test@CISCOSYS> updat ...

  10. mysql聚合函数count用法_MySQL中聚合函数count的使用和性能优化技巧

    本文的环境是Windows 10,MySQL版本是5.7.12-log 一. 基本使用 count的基本作用是有两个: 统计某个列的数据的数量: 统计结果集的行数: 用来获取满足条件的数据的数量.但是 ...

最新文章

  1. java数组转换成字符串,附小技巧
  2. linux 文件夹换所属用户,Linux中账号管理之权限管理(下)
  3. net clr via c sharp chap1-- note
  4. shell磁盘监控自动化处理
  5. 如何在Scala中将Double转换为String?
  6. 2015 8月31 工作计划与执行
  7. Spark之SparkSQL实战
  8. Android Handler消息机制源码分析
  9. java 注入为空_Spring @Autowired 注入为 null
  10. 十款微信小程序源码分享
  11. Sqlmap中代理及其他常用参数
  12. angular 获取上一个路由地址 获取当前页地址 地址裁切
  13. 学习 stm32(TTL)串口通信控制16路舵机控制板(维特智能)
  14. for循环语句求数组当中的最大元素
  15. 高德地图 定位失败,10: 定位服务启动失败 解决办法
  16. C++-Cmake指令:cmake_minimum_required
  17. 巡查使:智能巡检领域“引航者”
  18. python项目策划书_Python实战计划学习第一周
  19. 百度SDK移动开发平台学习 - 人体分析
  20. Android9.0 程序锁实现

热门文章

  1. 利用jquery实现电商网站常用特效之:五星评分
  2. mysql 配置 explicit_defaults_for_timestamp
  3. 海量数据 网站中用户积分排名问题
  4. es 安装 ik 分词器
  5. ubuntu系统颜色更改
  6. Adobe下周将推新补丁和新的更新模式
  7. [CTO札记]Disney也进军数字出版市场了
  8. Q109:用PBRT渲染Blender导出的模型
  9. error: 'NULL' was not declared in this scope
  10. 大数据平台系统设计包括哪些