在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

MySQL的优化器对于count(*)的处理方式是什么

106次阅读
没有评论

共计 2912 个字符,预计需要花费 8 分钟才能阅读完成。

今天就跟大家聊聊有关 MySQL 的优化器对于 count(*)的处理方式是什么,可能很多人都不太了解,为了让大家更加了解,丸趣 TV 小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

  最近看了很多阿里同学的 MySQL 文章,阿里内核同学的文章一言不合就上代码,不光让我们看到了结果,还能有代码可读,如果碰到了类似的问题,这样的解读确实是很难得的。

  今天做了一个小的测试,发现 MySQL 5.7 中对于 count(*) 的处理好像有点霸道,没想象中那么好。

  为了对比,我找了一套 5.6 的环境。

总体而言 5.6 的环境中对于 count(*) 的处理可塑性很强,很随和,你让我怎么查我就怎么查。初始数据为 100 万。

+———-+
| count(*) |
+———-+
|  1000000 |
+———-+

建表的语句如下:

show create table test\G
*************************** 1. row ***************************
  Table: test
Create Table: CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  `c` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `mrrx` (`a`,`b`),
  KEY `xx` (`c`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8
1 row in set (0.00 sec) 一直以来 MySQL 中 count(*) 的用法都是不被提倡,或者说是恶名远扬,这一点让很多学习 Oracle 的同学很不理解,其实他们是身在福中不知福。

这样的一个 count(*) 的查询,在 5.6 中的效果是这样的,估算的时候默认是走了索引 xx

explain select count(*) from test\G
*************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: test
  type: index
possible_keys: NULL
  key: xx
  key_len: 5
  ref: NULL
  rows: 998396
  Extra: Using index
1 row in set (0.01 sec) 
如果我们强制走 mrrx 索引,优化器说也行,于是就走了 mrrx 的索引,估算的数据情况和上面有一些小的差别。
explain select count(*) from test force index(mrrx)\G
*************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: test
  type: index
possible_keys: NULL
  key: mrrx
  key_len: 10
  ref: NULL
  rows: 947698
  Extra: Using index
1 row in set (0.00 sec) 或者我们显式指定就要 xx 索引了,优化器说好,然后估算得到的行数和第一个差别很小。
explain select count(*) from test force index(xx)\G
*************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: test
  type: index
possible_keys: NULL
  key: xx
  key_len: 5
  ref: NULL
  rows: 947698
  Extra: Using index
1 row in set (0.00 sec) 如果换一种姿势,如果指定索引列 c, 指定一个条件,再来看看,就会看到前后的结果差别就很大了。
explain select count(*) from test where c 0\G
*************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: test
  type: range
possible_keys: xx
  key: xx
  key_len: 5
  ref: NULL
  rows: 473849
  Extra: Using where; Using index
1 row in set (0.00 sec) 这么看来,5.6 里面的一个硬伤还是对于统计信息这块的评估差别较大,没有了统计信息还是有很大的局限性,不过优化器还是很随和的。

我们看看 5.7 的表现

同样的语句和数据量,在 5.7 中明显做了过滤处理,

explain select count(*) from test\G
*************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: NULL
  partitions: NULL
  type: NULL
possible_keys: NULL
  key: NULL
  key_len: NULL
  ref: NULL
  rows: NULL
  filtered: NULL
  Extra: Select tables optimized away
1 row in set, 1 warning (0.02 sec)

这表示在优化器阶段已经被优化了。

而接下来同样的语句也都是同样的处理方式。

explain select count(*) from test force index(mrrx)\G
explain select count(*) from test force index(xx)\G
  Extra: Select tables optimized away

而如果我们还是像之前一样给定索引列 c 一个过滤条件,优化器就一下子变得温和起来。很明显这个执行的效果要好很多。

explain select count(*) from test where c 0\G
*************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: test
  partitions: NULL
  type: range
possible_keys: xx
  key: xx
  key_len: 5
  ref: NULL
  rows: 498949
  filtered: 100.00
  Extra: Using where; Using index
1 row in set, 1 warning (0.02 sec)

从某种程度来说,5.7 这样的处理也算是一种变相的退步啦。

看完上述内容,你们对 MySQL 的优化器对于 count(*)的处理方式是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注丸趣 TV 行业资讯频道,感谢大家的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计2912字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 日韩三级理论 | 国产精品日韩欧美在线 | 在线播放葵千惠激烈潮催 | 国产精品扒开做爽爽爽的视频 | 日本成熟视频免费视频 | 无码专区一ⅴa亚洲v天堂 | 欧美19综合中文字幕 | xart在线 | 国产亚洲精品久久久闺蜜 | 国产一区二区免费视频 | 精品久久久久久人妻无码中文字幕 | av人摸人人人澡人人超碰下载 | 靠比网站在线观看 | 免费特黄级夫费生活片 | 毛片特级| 亚洲国产另类久久久精品网站 | 久草这里只有精品 | 亚洲午夜精品久久久久久成年 | 99riav国产精品 | 狠狠色噜噜狠狠狠888米奇视频 | 天天摸日日摸狠狠添 | 亚洲av无码日韩精品影片 | 国产精品400部自产在线观看 | 人人玩人人添天天爽 | 精品偷拍一区二区三区在线看 | 亚洲春色av无码专区在线播放 | 亚洲毛片不卡av在线播放一区 | 精品亚洲永久免费精品 | 亚洲av无码成人网站在线观看 | 日本高清在线免费 | 边做边流奶水的人妻 | 亚洲精品无码久久久久y | 日日草夜夜草 | 男人扒开女人的腿做爽爽视频 | 久久一区二区免费播放 | 亚洲av无码一区东京热久久 | 一级特色黄大片 | 亚洲精品无码久久毛片 | 日韩欧美视频一区二区 | 日韩精品一区二区三区四区 | 精品一区二区免费视频 |