前言

现在的java开发人员越来越多,竞争也越来越激烈,之前看到在某钩招聘网站上发布了一个岗位需求,不到短短1天就收到20多份简历,大部分都是应届一年两年的,新鲜血液越来越多,我们也要不断的提升自己才能够不被挤下去,大家可以看下各大网站的java岗位3年以上的招聘需求:

complain使用说明(explain都不会用怎么优化)(1)

complain使用说明(explain都不会用怎么优化)(2)

complain使用说明(explain都不会用怎么优化)(3)

<<< 左右滑动见更多 >>>

大部分java开发岗位都会有写到数据库相关,会把sql优化作为一个重要的岗位要求之一,由此可见sql优化的重要性。mysql调优是一块很大的挑战,并且有很多维度可以优化比如事务方面,表结构方面等等。今天我们就来聊一聊最基本的,如何针对某条sql语句优化,以及explain执行计划的使用。

正文
什么是explain?

explain是MYSQL提供的一个命令,它可以用来分析select语句,并且输出相应的分析结果,使得开发人员可以针对输出结果来对sql语句进行特定的优化。

explaing该怎么使用

explain的使用很简单,只需要在s需要执行的语句前加上explain就可以了

例如

explain select gab_table_id from gravity_plan_operate_record where ID = 7

explain输出格式字段详解

我们准备两张表

CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL DEFAULT '', `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` bigint(20) DEFAULT '0', `product_name` varchar(50) NOT NULL DEFAULT '', `productor` varchar(30) DEFAULT '', PRIMARY KEY (`id`), KEY `idx_user_id_product_name` (`user_id`,`product_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

我们在这两张表中都插入一些数据

INSERT INTO user (name, age) VALUES ('xy是的s', 11); INSERT INTO user (name, age) VALUES ('a的撒风', 10); INSERT INTO user (name, age) VALUES ('asdfb', 13); INSERT INTO user (name, age) VALUES ('csadf', 20); INSERT INTO user (name, age) VALUES ('dsaf', 14); INSERT INTO user (name, age) VALUES ('exzcv', 44); INSERT INTO user (name, age) VALUES ('fgw', 18); INSERT INTO user (name, age) VALUES ('gbht', 17); INSERT INTO user (name, age) VALUES ('hbfd', 14); INSERT INTO user (name, age) VALUES ('ibdfsb', 15);

INSERT INTO tuya_gravity.order (user_id, product_name, productor) VALUES (111, 'qqq', 'aaa'); INSERT INTO tuya_gravity.order (user_id, product_name, productor) VALUES (111, '234', 'aaa'); INSERT INTO tuya_gravity.order (user_id, product_name, productor) VALUES (1333, 'qqq', 'cc'); INSERT INTO tuya_gravity.order (user_id, product_name, productor) VALUES (222, '444', 'aaa'); INSERT INTO tuya_gravity.order (user_id, product_name, productor) VALUES (2222, '555', 'cc'); INSERT INTO tuya_gravity.order (user_id, product_name, productor) VALUES (333, '444', 'dd'); INSERT INTO tuya_gravity.order (user_id, product_name, productor) VALUES (333, 'qerwq', 'cc'); INSERT INTO tuya_gravity.order (user_id, product_name, productor) VALUES (643, 'vdvd', 'qq'); INSERT INTO tuya_gravity.order (user_id, product_name, productor) VALUES (922, 'vdvd', 'qq');

左边为 order表 右边为 user表

complain使用说明(explain都不会用怎么优化)(4)

我们看下explain到底会输出哪些东西

explain select * from user where id = 4

下图就是explain输出的内容,我们来一一解析下

complain使用说明(explain都不会用怎么优化)(5)

各列的含义如下:

explain select * from user where id = 4

complain使用说明(explain都不会用怎么优化)(6)

EXPLAIN SELECT * FROM user, tuya_gravity.order WHERE user.id = tuya_gravity.order.user_id

complain使用说明(explain都不会用怎么优化)(7)

EXPLAIN SELECT * FROM user, tuya_gravity.order WHERE user.id = tuya_gravity.order.user_id AND tuya_gravity.order.user_id = 5

complain使用说明(explain都不会用怎么优化)(8)

EXPLAIN SELECT * FROM user WHERE id BETWEEN 1 AND 11

complain使用说明(explain都不会用怎么优化)(9)

EXPLAIN SELECT name FROM user

complain使用说明(explain都不会用怎么优化)(10)

EXPLAIN SELECT age FROM user WHERE age = 20

complain使用说明(explain都不会用怎么优化)(11)

EXPLAIN SELECT id FROM tuya_gravity.order ORDER BY product_name

complain使用说明(explain都不会用怎么优化)(12)

这个时候我们是没有用到索引的,如果改成ORDER BY user_id, product_name就可以利用我们的最左前缀原则用到索引了,例如

EXPLAIN SELECT id FROM tuya_gravity.order ORDER BY user_id,product_name

complain使用说明(explain都不会用怎么优化)(13)

结语

今天和大家聊了在sql优化中expalin该去怎么使用,每个字段的意义,也和大家简单的聊了下语句的优化方案,当然,这只是sql优化的第一步而已,在很多复杂语句的优化上要考虑很多因素,也有很多方式,比如拆字段,分表,索引重构等等,而每一种解决方案都会面临着不同的问题,以后有机会也会和大家聊到这方面。

,