1、Explain含义
-
Explain是sql分析工具中非常重要的一部分,它可以模拟优化器执行查询语言,帮助我们理解查询是如何执行的;分析查询计划可以帮助我们发现瓶颈,优化查询性能。
2、Explain作用
-
表的读取顺序
-
sql执行时查询操作类型
-
可以使用哪些索引
-
实际使用哪些索引
-
每张表有多少行记录被扫描
-
sql语句性能分析
3、Explain用法
数据准备:
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS products;
CREATE TABLE users(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) DEFAULT NULL,
email VARCHAR(100) NOT NULL,
password VARCHAR(100) NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE products(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
price FLOAT NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE orders(
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
order_date DATETIME NOT NULL,
total_price FLOAT NOT NULL,
product_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (product_id) REFERENCES products(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
alter table users add index index_name_email(name, email);
INSERT INTO users(name, email, password)
VALUES('张三', 'zhangsan@example.com', 'password123'),
('李四', 'lisi@example.com', 'password123'),
('王五', 'wangwu@example.com', 'password123'),
('赵六', 'zhaoliu@example.com', 'password123'),
('钱七', 'qianqi@example.com', 'password123');
INSERT INTO products(name, price)
VALUES('产品1', 10.00),
('产品2', 15.00),
('产品3', 20.00),
('产品4', 12.00),
('产品5', 18.00);
INSERT INTO orders(user_id, order_date, total_price, product_id)
VALUES(1, '2024-05-01 10:00:00', 100.00, 1),
(2, '2024-05-01 11:00:00', 50.00, 2),
(3, '2024-05-01 12:00:00', 20.00, 3),
(4, '2024-05-01 13:00:00', 15.00, 4),
(5, '2024-05-01 14:00:00', 25.00, 5);
MySQL5.7版本之前,使用Explain Extended在Explain的基础上额外多返回filtered列和extra列
例如:
Explain Extended select * from users;
MySQL5.7版本之前,使用Explain Partitions在Explain的基础上额外多返回partitions列
例如:
Explain Partitions select * from users;
MySQL5.7版本引入了这两个特性,直接使用Explain关键字可以将partitions列、 filtered列、extra列直接查询出来
例如:
Explain select * from users;
Explain语句返回列的含义: