首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL中count是怎样执行的?———count(1),count(id),count(非索引列),count(二级索引列)的分析

经常会看到这样的例子: 当你需要统计表中有多少数据的时候,会经常使用如下语句 SELECT COUNT(*) FROM demo_info;   由于聚集索引和非聚集索引中的记录是一一对应的,而非聚集索引记录中包含的列...(索引列+主键id)是少于聚集索引(所有列)记录的,所以同样数量的非聚集索引记录比聚集索引记录占用更少的存储空间。...注意:这里已经验证过了,uk_key2比其他索引成本更低。 详情可见MySQL查询为什么选择使用这个索引?...再看一下count(非索引列) explain select count(common_field) from demo_info   对于count(非索引列)来说,优化器选择全表扫描,说明只能在聚集索引的叶子结点顺序扫描...而对于count(非索引列)来说,优化器选择全表扫描,说明只能在聚集索引的叶子结点顺序扫描。

1.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL索引15连问,抗住!

    (Innodb存储引擎) 非聚集索引:非聚集索引就是以非主键创建的索引,在叶子节点存储的是主键和索引列。(Innodb存储引擎) 逻辑维度 主键索引:一种特殊的唯一索引,不允许有空值。...普通索引:MySQL中基本索引类型,允许空值和重复值。 联合索引:多个字段创建的索引,使用时遵循最左前缀原则。 唯一索引:索引列中的值必须是唯一的,但是允许为空值。...const:通过一次索引就能找到数据,一般用于主键或唯一索引作为条件,这类扫描效率极高,,速度非常快。...eq_ref:常用于主键或唯一索引扫描,一般指使用主键的关联查询 ref : 常用于非主键和唯一索引扫描。...unique_subquery:类似于eq_ref,条件用了in子查询 index_subquery:区别于unique_subquery,用于非唯一索引,可以返回重复值。

    1.5K30

    100道MySQL数据库经典面试题解析(收藏版)

    后端程序员必备:索引失效的十大杂症 索引不适合哪些场景 数据量少的不适合加索引 更新比较频繁的也不适合加索引 区分度低的字段不适合加索引(如性别) 索引的一些潜规则 覆盖索引 回表 索引数据结构(B+树...覆盖索引:查询列要被所建的索引覆盖,不必读取数据行 组合索引:多列值组成一个索引,用于组合搜索,效率大于索引合并 44. 创建索引有什么原则呢?...by子句中,创建索引需要注意顺序 区分度低的数据列不适合做索引列(如性别) 定义有外键的数据列一定要建立索引。...Mysql一条SQL加锁分析 一条SQL加锁,可以分9种情况进行哈: 组合一:id列是主键,RC隔离级别 组合二:id列是二级唯一索引,RC隔离级别 组合三:id列是二级非唯一索引,RC隔离级别 组合四...:id列上没有索引,RC隔离级别 组合五:id列是主键,RR隔离级别 组合六:id列是二级唯一索引,RR隔离级别 组合七:id列是二级非唯一索引,RR隔离级别 组合八:id列上没有索引,RR隔离级别 组合九

    2.6K20

    【MySQL】015-MySQL索引

    复杂的查询优化:当查询涉及多个表和索引时,数据库查询优化器需要选择合适的索引,这可能会导致查询优化的复杂性增加。选择不当的索引可能导致性能下降。 不适合所有列:并非所有列都适合创建索引。...,分别用于email和username列,以确保这两列中的值不重复。...005 多列组合建立唯一索引(联合索引) 这个唯一索引要求三个列(column1、column2 和 column3)的组合是唯一的,而不是每个列都唯一。...); 这将创建一个名为index_name的索引,用于提高column_name列的检索性能。...不适合创建索引的场景 频繁需要更新的字段:对于需要经常更新的字段不适合建立索引,因为字段频繁被修改,而B+树需要维护索引键的有序性,所以频繁更新的字段会增加维护索引的成本,很影响数据库的性能。

    8710

    绝对必备:MySQL数据库开发的完整规范指南

    索引命名: 非唯一索引以 “idx_字段1_字段2” , 唯一索引以 “uniq_字段1_字段2” 命名,...索引选择数据类型较短的字段。 合理创建联合索引,联合索引(a,b,c) 等于 (a) 、(a,b) 、(a,b,c)三个索引,索引中的字段数不超过5个。 新建的唯一索引不能和主键重复。...禁止like “%abs”做where条件,会全表扫描且不能用索引。 除非必要,避免使用 != 等非等值操作符,会导致用不到索引。 Where条件里不要对列使用函数,不会引用索引。...;不适用于存储函数和触发器;也不适用于在存储函数或者触发器里面调用含有预处理语句的存储过程。...第三范式(3NF):所有的非主属性不依赖于其他的非主属性,非主键列必须直接依赖于主键,不能存在传递依赖;即不能存在非主键列A依赖于非主键列B,非主键列B依赖于主键的情况。

    32110

    如何写出一手好 SQL ?很有必要!

    写多读少的场景,不推荐使用唯一索引,用应用程序保证唯一性。 适当冗余字段,尝试创建中间表,用应用程序计算中间结果,用空间换时间。 不允许执行极度耗时的事务,配合应用程序拆分成更小的事务。...MySQL开发的 36 条军规建议你看下。 避免空值 MySQL中字段为NULL时依然占用空间,会使索引、索引统计更加复杂。从NULL值更新到非NULL无法做到原地更新,容易发生索引分裂影响性能。...索引优化 索引分类 普通索引:最基本的索引。 组合索引:多个字段上建立的索引,能够加速复合查询条件的检索。 唯一索引:与普通索引类似,但索引列的值必须唯一,允许有空值。...组合唯一索引:列值的组合必须唯一。 主键索引:特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般用primary key约束。...用于社交网络构建关系图谱,推荐系统等 参考:https://www.jianshu.com/p/6864abb4d885 鸡汤:你既然已经做出了选择,又何必去问为什么选择。

    51910

    大型分布式业务平台数据库优化方法(上)

    在MySQL中,主要采用B-/B+Tree作为索引的结构(至于为什么选择这两种数据结构,限制篇幅就不展开叙述了)。...比如,了解InnoDB的索引实现后,就容易明白为什么不应该使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。...;字段值分布很稀少的字段不适合建索引,例如"性别"这种只有两个值的枚举字段; c、字符串值的字段只需建前缀索引(最左前缀匹配);同时该类字段最好不要用做主键; d、尽量不用外键,由业务代码约束保证; e...QEP很容易描述这个很困难的统计量; c、possible_keys:指出SQL优化器为查询选定的索引; d、key_len:定义用于SQL语句的连接条件的键的长度; e、table:EXPLAIN命令输出结果中的一个单独行的唯一标识符...锁竞争; f、可以备份和恢复单个分区; (2)分区表的限制和缺点 a、一个表最多只能分1024个区; b、如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引都必须包含; c、分区表中无法使用外键约束

    98850

    浅谈数据库优化

    这里不做过多的解释。看过这篇文章之后抛出一个问题:为什么不用Hash索引,而是使用B-Tree索引结构,理论上Hash索引的查询时间复杂度只有O(1)。...索引注意点 理想的索引应该具有下面几点:1: 查询频繁 2: 区分度高 3: 长度小 4: 尽量能覆盖常用查询字段。 哪些列不应该建立索引呢?1、更新非常频繁的字段不适合建立索引。...2、唯一性太差的字段不适合单独创建索引。3、不会出现在where子句中的字段不应该创建索引。...union all 不过滤 效率提高,如非必须,请用union all。因为 union去重的代价非常高, Mysql会把各个查询结果插入到临时表中,然后做唯一性检查。所以请放在程序里去重。...eq_ref:最多只会有一条匹配结果,一般是通过主键或是唯一索引来访问。一般会出现在连接查询的语句中。通过索引列,直接引用某1行数据 ref: 它返回所有匹配某个单个值的行。

    14410

    Mysql 架构和索引

    ,所有不适合种类不确定的类型 优势:节约空间 劣势:join字符串时会较慢(存在转换) 日期和时间 year date datetime 8字节存储,和时区无关,1001年到9999年,精度为秒 timestamp...从最好到最差: (唯一或非唯一)组合索引的前一部分:select * from t where unique_or_not_unique_combined_index_1 = 'abc' 非唯一组合或单列索引的全部...常见于主键或唯一索引扫描。 这是最好的连接类型。它用在索引所有部分都用于做连接并且这个索引是一个primary key 或 unique 类型。eq_ref可以用于在进行"="做比较时检索字段。...常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找 ref_or_null: 这种连接类型类似 ref,不同的是mysql会在检索的时候额外的搜索包含null值的记录 select * from ref_table...不过它用于在子查询中没有唯一索引的情况下: value in (select key_column from single_table where some_expr) range:索引范围扫描,对索引的扫描开始于某一点

    1.4K90

    MySQL information_schema详解 COLUMNS

    类型的列的scale DATETIME_PRECISION 对于日期类型的列的分数秒精度 CHARACTER_SET_NAME 对于字符串的列,其字符集的名称 COLLATION_NAME 对于字符串的列...该列显示列是否被索引,其有如下可能值 空 代表没有被索引,或者是一个多列的非唯一的索引的次要列 PRI 代表是主键,或者是一个多列主键的其中一个栏位 UNI 代表是一个唯一索引的第一个列,一个唯一索引是可以有多个空值的...MUL 代表该列是一个非唯一索引的第一个列 如果一个栏位在多个索引中,COLUMN_KEY只会显示其中优先级最高的一个,顺序为PRI, UNI, MUL 如果表中无主键,如果一个唯一索引不可以包含空值...(定义非空),该列其可能会被显示为PRI 一个复合索引如果是唯一的,该列也有可能会被显示为MUL 1.2 EXTRA 该列用于显示额外的信息 auto_increment 代表该列有AUTO_INCREMENT...属性 on update 对于TIMESTAMP 或 DATETIME类型的列,CURRENT_TIMESTAMP有ON UPDATE CURRENT_TIMESTAMP属性 VIRTUAL GENERATED

    4K41

    老大问我:“建表为啥还设置个自增 id ?用流水号当主键不正好么?”

    ,流水号都是单独设置了一个字段,比如叫 trans_no,但是这次就遇到了疑问:trans_no 既然是唯一的,那为什么不直接用 trans_no 当做 id 呢?...主键的特征 ? 简而言之: 非空、唯一、少更改或不更改 。 如何添加主键 ? 可以在 create 创建表的时候指定,也可以使用 alter 语句后面添加主键,不过官方建议在创建表时就指定。...为什么要添加主键 主键可以唯一标识这一行数据,从而保证在删除更新操作时,只是操作这一行数据。 索引需要,每个 InnoDB 表又有一个特殊的索引,即聚簇索引,用来存储行数据。...A: 回表:先在二级索引查询到对应的主键值,然后根据主键再去聚簇索引里面取查询。 索引覆盖:二级索引记录了主键列和二级索引列,如果我只查询主键列的值和二级索引列的值,那就不需要回表了。...Q: 为什么要设置自增主键 id ? A: 可以唯一标识一行数据,在 InnoDB 构建索引树的时候会使用主键。

    1.9K20

    【建议收藏】MySQL 三万字精华总结 —索引(二)

    四、索引 ❝ 说说你对 MySQL 索引的理解? 数据库索引的原理,为什么要用 B+树,为什么不用二叉树? 聚集索引与非聚集索引的区别? InnoDB引擎中的索引策略,了解过吗?...创建索引的方式有哪些? 聚簇索引/非聚簇索引,mysql索引底层实现,为什么不用B-tree,为什么不用hash,叶子结点存放的是数据还是指向数据的内存地址,使用索引需要注意的几个地方?...(secondary index) 聚集索引和非聚集索引都是B+树结构 从逻辑角度 主键索引:主键索引是一种特殊的唯一索引,不允许有空值 普通索引或者单列索引:每个索引只包含单个列,一个表可以有多个单列索引...使用复合索引时遵循最左前缀集合 唯一索引或者非唯一索引 空间索引:空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING...❝ 为什么非主键索引结构叶子节点存储的是主键值?

    56430

    SQL Server之索引解析(二)

    (非聚集唯一索引)行数据结构+分割符?+ Page(4) ? 堆表非聚集索引结构 ? 1、2 聚集索引表 组织结构 ?...2、建立索引规则 建立聚集索引规则 唯一性:如果非唯一性,索引节点会增加一列唯一表示。 静态的: 如果对聚集索引键值进行更新时,中间节点页会发生变化,叶子节点页也会发生变化。...连续性:非连续性会造成页分拆,页空间浪费,碎片增多。 键值大小:键值长度越长,中间节点的层数越多,读取层数越多,性能下降。 索引覆盖 对常用查询指定列的索引可以适当增加列覆盖。...非聚集索引 数据密度原则:数据密度是指列值唯一的记录占总记录数的百分比,这个比率越高,则说明此列越适合建立索引。...复合索引键列顺序:在索引中,索引的顺序主要由索引中的每一个键列确定,因此,对于复合索引,索引中的列顺序是很重要的,应该优先把数据密度大,选择性列,存储空间小的列放在索引键列的前面。

    87030

    【建议收藏】MySQL 三万字精华总结 —索引(二)

    四、索引 ❝说说你对 MySQL 索引的理解? 数据库索引的原理,为什么要用 B+树,为什么不用二叉树? 聚集索引与非聚集索引的区别? InnoDB引擎中的索引策略,了解过吗?...创建索引的方式有哪些? 聚簇索引/非聚簇索引,mysql索引底层实现,为什么不用B-tree,为什么不用hash,叶子结点存放的是数据还是指向数据的内存地址,使用索引需要注意的几个地方?...使用复合索引时遵循最左前缀集合 唯一索引或者非唯一索引 空间索引:空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON...❝为什么非主键索引结构叶子节点存储的是主键值?...R-Tree空间索引 空间索引是MyISAM的一种特殊索引类型,主要用于地理空间数据类型 ❝为什么Mysql索引要用B+树不是B树?

    58620

    2018-11-26 oracle查询表信息(索引,外键,列等)1、查询出所有的用户表2、查询出用户所有表的索引3、查询用户表的索引(非聚集索引):4、查询用户表的主键(聚集索引):5、查询表的索引6

    oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助: 1、查询出所有的用户表 select * from user_tables...2、查询出用户所有表的索引 select * from user_indexes 3、查询用户表的索引(非聚集索引): select * from user_indexes where uniqueness...='NONUNIQUE' 4、查询用户表的主键(聚集索引): select * from user_indexes where uniqueness='UNIQUE' 5、查询表的索引 select...cu.constraint_name = au.constraint_name and au.constraint_type = 'P' AND cu.table_name = 'NODE' 7、查找表的唯一性约束...= 外键名称 查询引用表的键的列名: select * from user_cons_columns cl where cl.constraint_name = 外键引用表的键名 9、查询表的所有列及其属性

    3K20

    SQL数据库之索引优缺点

    优点 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。...表中的数据并不按照非聚集索引列的顺序存储,但非聚集索引的索引行中保存了非聚集键值和行定位器,可以快捷地根据非聚集键的值来定位记录的存储位置。...不适合场景 单列索引的列不能包含null的记录,复合索引的各个列不能包含同时为null的记录,否则会全表扫描; 不适合键值较少的列(重复数据较多的列),即低基数情况,索引结构空间冗余,B-Tree树上会存在大量相同键值的叶子节点...不适合场景 不适合模糊查询和范围查询(包括like,>,索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤...其中,Identifier列是每一行的唯一标识,HasInternet是索引列,那么右侧的Bitmaps下方的两列Y和N则表示左侧所对应的bitmap索引。

    1.1K10

    写好SQL很有必要

    它就像体育课上的女同学,一点纠纷就和同学闹别扭(扩容难),跑两步就气喘吁吁(容量小并发低),常常身体不适要请假(SQL约束太多)。...写多读少的场景,不推荐使用唯一索引,用应用程序保证唯一性。 适当冗余字段,尝试创建中间表,用应用程序计算中间结果,用空间换时间。 不允许执行极度耗时的事务,配合应用程序拆分成更小的事务。...避免空值 MySQL中字段为NULL时依然占用空间,会使索引、索引统计更加复杂。从NULL值更新到非NULL无法做到原地更新,容易发生索引分裂影响性能。...索引优化 1) 索引分类 普通索引:最基本的索引。 组合索引:多个字段上建立的索引,能够加速复合查询条件的检索。 唯一索引:与普通索引类似,但索引列的值必须唯一,允许有空值。...组合唯一索引:列值的组合必须唯一。 主键索引:特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般用primary key约束。

    56721

    MySQL数据库建表、优化、算法、分区分库分表总结

    ,对于没有主键的表,在查询和索引定义上有一定的影响; 避免表字段运行为null,建议设置默认值(例如:int类型设置默认值为0)在索引查询上,效率立显; 建立索引,最好建立在唯一和非空的字段上...哈希索引不适用的场景: 不支持范围查询 不支持索引完成排序 不支持联合索引的最左前缀匹配规则 通常,B+树索引结构适用于绝大多数场景,像下面这种场景用哈希索引才更有优势: 在HEAP表中...但某些时候,在负载高的情况下,自适应哈希索引中添加的read/write锁也会带来竞争,比如高并发的join操作。like操作和%的通配符操作也不适用于自适应哈希索引,可能要关闭自适应哈希索引。...(而B 树的非终节点也包含需要查找的有效信息) ? 四、为什么说B+比B树更适合实际应用中操作系统的文件索引和数据库索引? 1、B+的磁盘读写代价更低。...如果分区字段中有主键或者唯一索引的列,那么多有主键列和唯一索引列都必须包含进来。即:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列。

    5.3K31
    领券