数据库索引的其他优化方法

  作者:记性不好的阁主

(1)exists和in 


 select ..from table where exists (子查询) ;

 select ..from table where 字段 in (子查询) ;

 如果主查询的数据集大,则使用In ,效率高。

 如果子查询的数据集大,则使用exists,效率高。

 exists语法: 将主查询的结果,放到子查需结果中进行条件校验(看子查询是否有数据,如果有数据 则校验成功) ,

      如果 复合校验,则保留数据;


 select tname from teacher where exists (select * from teacher) ; 
 --等价于select tname from teacher

 select tname from teacher where exists (select * from teacher where tid =9999) ;

 in:
 select ..from table where tid in (1,3,5) ;



(2)order by 优化


 using filesort 有两种算法:双路排序、单路排序 (根据IO的次数)

 MySQL4.1之前 默认使用 双路排序;双路:扫描2次磁盘(1:从磁盘读取排序字段 ,对排序字段进行排序(在buffer中进行的排序) 2:扫描其他字段 )

  --IO较消耗性能

 MySQL4.1之后 默认使用 单路排序 : 只读取一次(全部字段),在buffer中进行排序。但种单路排序 会有一定的隐患 (不一定真的是“单路|1次IO”,有可能多次IO)。原因:如果数据量特别大,则无法 将所有字段的数据 一次性读取完毕,因此 会进行“分片读取、多次读取”。

  注意:单路排序 比双路排序 会占用更多的buffer。

   单路排序在使用时,如果数据大,可以考虑调大buffer的容量大小: set max_length_for_sort_data = 1024 单位byte

 如果max_length_for_sort_data值太低,则mysql会自动从 单路->双路 (太低:需要排序的列的总大小超过了max_length_for_sort_data定义的字节数)


 提高order by查询的策略:


 a.选择使用单路、双路 ;调整buffer的容量大小;

 b.避免select * ...

 c.复合索引 不要跨列使用 ,避免using filesort

 d.保证全部的排序字段 排序的一致性(都是升序 或 降序)

相关推荐

评论 抢沙发

表情

分类选择