Skip to content

Commit e2de821

Browse files
committed
补充mysql面试题
1 parent 3148b1e commit e2de821

2 files changed

Lines changed: 32 additions & 1 deletion

File tree

docs/advance/excellent-article/27-mq-usage.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,16 @@ head:
122122

123123
以上实际是消息队列的两种消息模式,点对点或发布订阅模式。模型为示意图,供参考。
124124

125-
*本文转载自:https://www.cnblogs.com/ruiati/p/6649868.html*
125+
126+
127+
128+
129+
130+
131+
最后给大家分享一个Github仓库,上面有大彬整理的**300多本经典的计算机书籍PDF**,包括**C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生**等,可以star一下,下次找书直接在上面搜索,仓库持续更新中~
132+
133+
![](http://img.topjavaer.cn/image/Image.png)
134+
135+
![](http://img.topjavaer.cn/image/image-20221030094126118.png)
136+
137+
[**Github地址**](https://github.com/Tyson0314/java-books)

docs/database/mysql.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,4 +1180,23 @@ canal的原理如下:
11801180
- row:不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大。
11811181
- mixed:一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。
11821182

1183+
## 阿里手册为什么禁止使用 count(列名)或 count(常量)来替代 count(*)
1184+
1185+
先看下这几种方式的区别。
1186+
1187+
count(主键id):InnoDB引擎会遍历整张表,把每一行id值都取出来,返给server层。server层拿到id后,判断是不可能为空的,就按行累加,不再对每个值进行NULL判断。
1188+
1189+
count(常量):InnoDB引擎会遍历整张表,但不取值。server层对于返回的每一行,放一个常量进去,判断是不可能为空的,按行累加,不再对每个值进行NULL判断。count(常量)比count(主键id)执行的要快,因为从引擎放回id会涉及解析数据行,以及拷贝字段值的操作。
1190+
1191+
count(字段):全表扫描,分情况讨论。
1192+
1193+
1、如果参数字段定义NOT NULL,判断是不可能为空的,按行累加,不再对每个值进行NULL判断。
1194+
2、如果参数字段定义允许为NULL,那么执行的时候,判断可能是NULL,还要把值取出来再判断一下,不是NULL才累加。
1195+
1196+
count(*):统计所有的列,相当于行数,统计结果中会包含字段值为null的列;
1197+
1198+
COUNT(`*`)是SQL92定义的标准统计行数的语法,效率高,MySQL对它进行了很多优化,MyISAM中会直接把表的总行数单独记录下来供COUNT(*)查询,而InnoDB则会在扫表的时候选择最小的索引来降低成本。
1199+
1200+
所以,建议使用COUNT(\*)查询表的行数!
1201+
11831202
![](http://img.topjavaer.cn/img/20220612101342.png)

0 commit comments

Comments
 (0)