正文约: 5300字
预计阅读时间: 13分钟
文章首发于我的微信公众号:哪儿来的moon,欢迎大家关注
mysql┃explain 都不会用?怎么优化?
现在的java开发人员越来越多,竞争也越来越激烈,moon在某钩招聘网站上发布了一个岗位需求,不到短短1天就收到20多份简历,大部分都是应届一年两年的,新鲜血液越来越多,我们也要不断的提升自己才能够不被挤下去,大家可以看下各大网站的java岗位3年以上的招聘需求:
<<< 左右滑动见更多 >>>
大部分java开发岗位都会有写到数据库相关,会把sql优化作为一个重要的岗位要求之一,由此可见sql优化的重要性。
mysql调优是一块很大的挑战,并且有很多维度可以优化比如事务方面,表结构方面等等。
今天我们就来聊一聊最基本的,如何针对某条sql语句优化,以及explain执行计划的使用。
explain是MYSQL提供的一个命令,它可以用来分析select语句,并且输出相应的分析结果,使得开发人员可以针对输出结果来对sql语句进行特定的优化。
explain的使用很简单,只需要在s需要执行的语句前加上explain就可以了
例如:
explain select gab_table_id from gravity_plan_operate_record where ID = 7
我们准备两张表
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表
我们看下explain到底会输出哪些东西
explain select * from user where id = 4
下图就是explain输出的内容,我们来一一解析下
各列的含义如下:
explain select * from user where id = 4
EXPLAIN SELECT * FROM user, tuya_gravity.order WHERE user.id = tuya_gravity.order.user_id
EXPLAIN SELECT * FROM user, tuya_gravity.order WHERE user.id = tuya_gravity.order.user_id AND tuya_gravity.order.user_id = 5
EXPLAIN SELECT * FROM user WHERE id BETWEEN 1 AND 11
EXPLAIN SELECT name FROM user
EXPLAIN SELECT age FROM user WHERE age = 20
EXPLAIN SELECT id FROM tuya_gravity.order ORDER BY product_name
这个时候我们是没有用到索引的,如果改成ORDER BY user_id, product_name就可以利用我们的最左前缀原则用到索引了,例如
EXPLAIN SELECT id FROM tuya_gravity.order ORDER BY user_id,product_name
今天moon和大家聊了在sql优化中expalin该去怎么使用,每个字段的意义,也和大家简单的聊了下语句的优化方案,当然,这只是sql优化的第一步而已,在很多复杂语句的优化上要考虑很多因素,也有很多方式,比如拆字段,分表,索引重构等等,而每一种解决方案都会面临着不同的问题,以后有机会也会和大家聊到这方面。
下期见~