Mysql SQL优化

2019-06-25  本文已影响0人  我是一名搬运工

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

        ● 大的事务操作最好拆开来,拆开来可以并发执行,效率高

上一篇 下一篇

猜你喜欢

热点阅读