select count(*)使用全表扫描?闲聊下其中的成本计算...

本文探讨了MySQL中全表扫描和索引使用的选择,通过成本计算公式解释为何在某些场景下全表扫描可能更优。通过示例SQL和optimizer_trace,分析了不同查询的执行成本,揭示了MySQL选择执行计划的依据并不总是时间最短。
摘要由CSDN通过智能技术生成

0、关键字

  • mysql
  • explain
  • optimizer_trace
  • 成本
  • 全表扫描
SELECT count(*) FROM table;
SELECT count(1) FROM table;

1、sql执行成本

sql查询是否选择索引还是全表,执行引擎会通过成本核算出最佳的方式,如果全表扫描成本最低,则使用全表扫描。mysql执行成本组成如下:

  • IO成本:即从磁盘把数据加载到内存的成本,默认情况下,读取数据页的IO成本是1,mysql是以页的形式读取数据。即当用到某个数据时,并非仅读取该数据,会把这个数据相邻的数据一起读到内存中,这就是有名的程序局部性原理,所以mysql每次会读取一整页数据(一页大小16kb),一页成本即1。
  • CPU成本:数据读入内存后,还要检测数据是否满足条件和排序等CPU操作成本,显然与行数有关,默认情况下,检查成本0.2。

成本核算公式如下:

cost = rows*0.2 + data_length/(1024*16)

在了解mysql查询成本核算公式后,计算下table表的全表扫描成本,通过以下命令查询table表属性信息。

show table status like 'table'
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
table InnoDB 10 Dynamic 8139 324 2637824 0 0 4194304 200000000000008199 2020-06-03 16:56:50 2020-06-03 11:24:01 utf8_general_ci 样例信息表

字段说明

Name:表名;
Engine:存储引擎类型;
Row_format:行的格式;
Rows:行数;
Avg_row_length:平均每行包

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值