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:平均每行包