开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
前言
上篇我们学习了MySQL中的数据库优化。有兴趣的小伙伴可以阅读(MySQL数据库优化(一))。
下面我们继续学习MySQL中的数据库优化。
统计SQL的查询成本
使用last_query_cost。
创建一张student表。
CREATE TABLE student (
id INT(11) NOT NULL AUTO_INCREMENT,
student_id INT NOT NULL,
name VARCHAR(20) DEFAULT NULL,
create_time DATATIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
如果想要查询id=1的记录,可以直接在聚簇索引上进行查找。
SELECT student_id, name, create_time
FROM student
WHERE id = 1;
运行结果,时间为0.032s。
然后我们再看下查询上次执行SQL的优化器的成本,这里实际上我们只需要检索一个页即可:
SHOW STATUS LIKE 'last_query_cost';
得到如下结果:
Variable_name | Value |
---|---|
last_query_cost | 1.000000 |
结果也可以看出是一个页。
如果想要查询id在1到100之间的记录。
SELECT student_id, name, create_time
FROM student
WHERE id BETWEEN 1 AND 100;
运行结果,时间为0.036s。
然后我们再看下查询上次执行SQL的优化器的成本,这里实际上我们只需要检索20个页即可:
SHOW STATUS LIKE 'last_query_cost';
得到如下结果:
Variable_name | Value |
---|---|
last_query_cost | 21.125421 |
结果也可以看出大概是20个页。
这里能看出来页的数量大概是刚才的20倍,但是查询的效率并没有明显的变化,实际上这两个SQL查询的时间基本上一样,就是因为采用了顺序读取的方式将页面一次性加载到缓冲池中,然后再进行查找。虽然页数量(last_query_cost)增加了不少,但是通过缓冲池的机制,并没有增加多少查询时间。
使用场景:它对于比较开销是非常有用的,特别是我们有好几种查询方式可选的时候。
今天先学习到这里,明天继续。