1) In和Exists选择
In原理:先执行In里面的子查询,然后拿结果去匹配外面的主查询。
Exists原理:先执行主查询,然后拿结果去匹配Exists里面的子查询。
这就相当于两个for循环,肯定是外面那个循环小的情况查询效率高。
所以,如果子查询结果集更小,那么用In效率高;
如果主查询结果集更小,那么用exists效率高。
2)Not in和Not Exists选择
Not in:子查询和主查询都执行全表扫描
Not Exists:主查询全表扫描,子查询还可以用索引
所以not exists效率比not in 高。
3)In\or\union选择
对于索引列,使用union好,因为in\or会进行全表扫描,而union可以用索引;
对于非索引列,使用In\or好,因为非索引列都是全表扫描,union的全表扫描效率极低。
而in的效率比or要高,in的时间复杂度是O(logN),or的时间复杂度是O(N)。
4)用不用Join
首先,用不用join的问题,如果关联查询能够使用到被Join表的索引的话,也就是说被join表不是全表扫描的话,就可以用join;如果不能用到join表的索引,那最好不要用join,效率极低;
其次,用join哪个放前哪个放后的问题,我们一般把小表放在前面作为驱动表,大表放后面作为被驱动表,这样效率高。
5)其它优化
● 不用select *
● 非空的列尽量定义为not null
● 可为空的列尽量在空的时候,设置为空字符串或者0
● 一个表的索引数最好不要超过6个
● 索引列不能有大量数据重复
● 如果经常用到某列的函数,那么可以把列的函数作为一个索引
● 能用数值类型,就不要用varchar
● 少用left join和right join,多用inner join
● Inner join由于左右表的执行顺序不对导致查询速度慢时,改用straight_join
● 大的事务操作最好拆开来,拆开来可以并发执行,效率高











网友评论