MySQL数据库优化(二)

58 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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_nameValue
last_query_cost1.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_nameValue
last_query_cost21.125421

结果也可以看出大概是20个页。

这里能看出来页的数量大概是刚才的20倍,但是查询的效率并没有明显的变化,实际上这两个SQL查询的时间基本上一样,就是因为采用了顺序读取的方式将页面一次性加载到缓冲池中,然后再进行查找。虽然页数量(last_query_cost)增加了不少,但是通过缓冲池的机制,并没有增加多少查询时间。

使用场景:它对于比较开销是非常有用的,特别是我们有好几种查询方式可选的时候。

今天先学习到这里,明天继续。