目录
1.创建数据库
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT,
order_date DATE,
total_amount DECIMAL(10, 2)
);
插入数据:
INSERT INTO orders (customer_id, order_date, total_amount) VALUES
(1, '2021-01-01', 100.00),
(1, '2021-01-15', 200.00),
(2, '2021-02-01', 150.00),
(2, '2021-02-15', 250.00),
(3, '2021-03-01', 300.00),
(3, '2021-03-15', 350.00);
2.未创建索引
win+r使用cmd进入命令行,输入mysql -uroot -p,输入密码进行测试
使用explain来分析:
EXPLAIN SELECT * FROM orders WHERE customer_id = 1 AND order_date BETWEEN '2021-01-01' AND '2021-01-31';
结果:
字段分析:
type: ALL 表示全表扫描,即 MySQL 需要扫描整个 orders 表来找到匹配的行。
possible_keys 和 key: 都是 NULL,表示没有使用索引。
rows: 预计需要扫描 6 行。
filtered: 16.67% 的行满足 WHERE 条件。
Extra: Using where 表示在扫描过程中使用了 WHERE 条件。
3.创建索引
假设我们经常需要根据 customer_id 和 order_date 来查询订单信息。为了优化这类查询,我们可以在这两个字段上创建一个复合索引。
创建索引:
CREATE INDEX idx_customer_date ON orders (customer_id, order_date);
使用explian分析:
EXPLAIN SELECT * FROM orders WHERE customer_id = 1 AND order_date BETWEEN '2021-01-01' AND '2021-01-31';
结果:
字段分析:
type: range 表示使用了索引范围扫描,即 MySQL 只扫描索引中满足条件的部分。
possible_keys 和 key: 都是 idx_customer_date,表示使用了这个索引。
key_len: 9,表示索引的长度。
rows: 预计需要扫描 2 行。
filtered: 100% 的行满足 WHERE 条件。
Extra: Using index condition 表示使用了索引来优化条件查询。
4.结论
第一个查询没有使用索引,导致全表扫描,效率较低。
第二个查询使用了索引 idx_customer_date,显著减少了需要扫描的行数,提高了查询效率。
以上效果返回的时间是一样的,因为只是举例说明,数据量比较小,当数据量大的时候效果就会越发明显,并且效果也会越显著。