使用“复合索引”和不使用“复合索引”的优化对比

目录

1.创建数据库

2.未创建索引

3.创建索引

4.结论


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,显著减少了需要扫描的行数,提高了查询效率。

以上效果返回的时间是一样的,因为只是举例说明,数据量比较小,当数据量大的时候效果就会越发明显,并且效果也会越显著。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值