1、创建索引,避免全表扫描
2、避免隐式转换
假设数据库中user表中字段为id的列是int类型,有如下sql,
select * from user where id = '123';
这样查询的时候会将'123'转换成123,存在隐式转换,会影响到查询时间
3、分页优化
普通写法:
select * from buyer where sellerId = 100 limit 100000, 5000;
普通limit M, N的翻页写法,在越往后翻页的过程中速度会越慢,原因是mysql会读取表中前M+N条数据,M越大,性能就越差!
优化写法:
select t1.* from buyer t1,
(select id from buyer where sellerId = 100 limit 100000, 5000) t2
where t1.id = t2.id;
注意:需要在buyer表的sellerId字段上创建索引,id为表的主键。
4、子查询优化
典型子查询:
select first_name from employees where emp_no IN
(select emp_no from salaries where salary = 5000);
Mysql的处理逻辑是遍历employees表中的每一条记录,带入到子查询中去。
改写的子查询:
select first_name from employees emp,
(select emp_no from salaries where salary = 5000) sal
where emp.emo_no = sal.emp_no;
2、避免隐式转换
假设数据库中user表中字段为id的列是int类型,有如下sql,
select * from user where id = '123';
这样查询的时候会将'123'转换成123,存在隐式转换,会影响到查询时间
3、分页优化
普通写法:
select * from buyer where sellerId = 100 limit 100000, 5000;
普通limit M, N的翻页写法,在越往后翻页的过程中速度会越慢,原因是mysql会读取表中前M+N条数据,M越大,性能就越差!
优化写法:
select t1.* from buyer t1,
(select id from buyer where sellerId = 100 limit 100000, 5000) t2
where t1.id = t2.id;
注意:需要在buyer表的sellerId字段上创建索引,id为表的主键。
4、子查询优化
典型子查询:
select first_name from employees where emp_no IN
(select emp_no from salaries where salary = 5000);
Mysql的处理逻辑是遍历employees表中的每一条记录,带入到子查询中去。
改写的子查询:
select first_name from employees emp,
(select emp_no from salaries where salary = 5000) sal
where emp.emo_no = sal.emp_no;