01-谁最便宜就选谁——基于成本的优化

什么是成本

我们之前老说MySQL在执行一个查询时可以有不同的执行方案。它会选择其中成本最低,或者说代价最低的那种方案去真正地执行查询。不过我们之前对成本的描述是非常模糊的,其实一条查询语句在 MySQL 中的执行成本是由两个方面组成的。
  • I/O成本:我们的表经常使用的 MyISAM、InnoDB 存储引擎都是将数据和索引存储到磁盘上。当查询表中的记录时,需要先把数据或者索引加载到内存中,然后再进行操作。这个从磁盘到内存的加载过程损耗的时间称为 I/O 成本。
  • CPU成本:该取记录以及检测记录是否满足对应的搜索条件、对结果集进行排序等这些操作损耗的时问称为 CPU 成本。

对InnoDB 存储引擎来说,页是磁盘和内存之间进行交互的基本单位。设计 MySQL 的大叔规定:读取一个页面花费的成本默认是 1.0;读取以及检测一条记录是否符合搜索条件的成本默认是 0.2。1.0、02 这些数字称为成本常数,这两个成本常数最常用到,其余的成本常数会在后面再说。

需要注意的是,在读取记录时,即时不需要检测记录是否符合搜索条件,其成本也算作0.2

单表查询的成本

2.1 准备工作

为了故事的顺利发展,我们还得把之前用到的 single_table 表搬出来。为了避免大家忘记这个表的模样,这里再给大家抄一遍:
CREATE TABLE single_table (
	id INT NOT NULL AUTO_ INCREMENT, 
	key1 VARCHAR (100), 
	key2 INT, 
	key3 VARCHAR (100),
	key_part1 VARCHAR (100),
	key_part2 VARCHAR (100),
	key_part3 VARCHAR (I00),
	common_field VARCHAR (100),
	
	PRIMARY KEY (id),
	KEY idx_key1 (key1),
	UNIQUE KEY uk_key2 (key2),
	KEY idx_key3 (key3),
	KEY idx_key_part (key _part1, key_part2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

层巅余落日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值