一、查询优化之join优化
(一)关联字段加索引
1、alter table t_name add index(id);
2、select count(*) from dept d join emp e on d.id = e.id;
(二)小表驱动大表原则
1、小表驱动大表原则:因为程序链接比较消耗资源并且费时,涉及资源申请和释放,因此,先建立程序链接(使用小表),再进行数据查询(大表),查询速度会比较快。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)
1、select * from A where cc in (select cc from B) ;效率低,先查大表,相当于 :
for select cc from B
for select * from A
2、select * from A where exists(select 1 from B where cc=A.cc) ;// 效率高,先查小表,相当于:
for select * from A
for select cc from B where cc =A.cc
注意:(1)not in 和not exists的区别:如果查询语句使用了not in ,则内外表都进行全表扫描,不会用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
(2) EXISTS 语法理解为:将主查询的数据放在子查询中做条件验证,根据结果TRUE 和 FALSE 来决定主查询中的数据是否需要保留。EXISTS 子查询只返回TRUE 或 FALSE ,因此子查询中的SELECT * 可以是SELECT 1 或者其他,MySql 的官方说在实际执行时会忽略SELECT 清单,因此是没有 什么区别的。