一、前提准备
创建一个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';
结果

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

488

被折叠的 条评论
为什么被折叠?



