sql优化实战之全值匹配和范围查询

本文通过实例分析了MySQL中的SQL优化,重点探讨了全值匹配和范围查询(如'>'、'like'、'in'、'or'等)时的索引使用情况。说明了在不同场景下,MySQL优化器如何决定是否使用索引,以及索引下推的概念。总结指出,SQL优化需结合业务场景,不能一概而论。

一、前提准备

创建一个employees表,一个主键索引,一个联合索引,表结构如下:

-- 创建表
CREATE TABLE `employees` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名',
  `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
  `position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位',
  `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入职时间',
  PRIMARY KEY (`id`),
  KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='员工记录表';

-- 插入3条数据
INSERT INTO employees(name,age,position,hire_time) VALUES('LiLei',22,'manager',NOW());
INSERT INTO employees(name,age,position,hire_time) VALUES('HanMeimei', 23,'dev',NOW());
INSERT INTO employees(name,age,position,hire_time) VALUES('Lucy',23,'dev',NOW());

使用存储过程插入10万条数据

-- 使用存储过程 插入10w条数据
drop procedure if exists insert_emp;
delimiter ;;
create procedure insert_emp()
begin
declare i int;
set i=1;
while(i<=100000)do
insert into employees(name,age,position) values(CONCAT('zhangsan',i),i,'dev');
set i=i+1;
end while;
end;;
delimiter ;
call insert_emp();

数据准备完毕  下面开始分析各种场景下的sql优化。

二、sql优化分析

sql优化主要针对索引的优化,目的是尽可能的使用索引进行查询检索,那么mysql是否走索引查询其实是由mysql优化器决定的,针对一条sql语句mysql优化器会计算各种情况的成本,从而选择如何使用索引甚至全表扫描。这种优化结果是不确定的,也就是说,针对同一条sql语句,可能第一次查询是走索引的,第二次查询就不走索引了。

总的来说mysql是否能够使用索引我们大概是可以预测的,但是预测的结果并不一定准确。

1.全值匹配

针对联合索引需要遵循最左前缀原则以及中间不可断

-- 联合索引使用 联合索引的三个字段都用到了
explain select * from employees where name = 'LiLei' and age = 22 and position='dev';

结果

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值