首页
学习
活动
专区
工具
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.3K30

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.3K20

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

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

50110

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

在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、分区表中无法使用外键约束

90650

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

浅谈数据库优化

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

10810

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

3.8K40

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

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

1.8K20

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

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

53230

SQL Server之索引解析(二)

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

81330

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

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

55620

MySQL系列之索引知识学习笔记

五、索引适用情况 六、索引不适情况 一、索引概念 MySQL官方给出索引定义:索引(Index)是帮助MySQL高效获取数据数据结构。...所以说索引就是排好序快速查找数据结构 二、索引分类 MySQL索引可以分为几种: 单值索引:单值索引就是只包含一个索引 唯一索引唯一索引要求索引必须是唯一,比如说主键或者unique索引...:只有叶子节点(最下面的节点)是存储要查找数据叶子节点存储数据只是用于指针索引数据项而已 五、索引适用情况 1、频繁用于查询条件适合建立索引 2、主键默认要加上Primary索引 3、和其它表有外键关系建立索引...4、where条件后面的条件可以建上索引 5、用于排序order by可以加上索引 6、用于分组group by可以加上索引 注意:需要经常修改不适合建立索引,因为更新数据同时也会重新构建索引...3、如果某个数据包含很多重复数据,比如用户信息表性别这个,一般只有两种情况,所以加了索引,是没有太大实际效果 注意:索引应该加在经常查询或者排序,数据重复而且分布很平均情况,是不适合加索引

39320

SQL数据库之索引优缺点

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

1.1K10

写好SQL很有必要

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

54021

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、查询表所有及其属性

2.9K20

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

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

5.2K31

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

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

80430
领券