Mysql常见sql语句优化

一,Order by 优化

如果创建复合索引 test_index(a,b) ,覆盖索引可提升查询速度,排序时要么都是升序,要么都是降序。排序时字段的名字按照索引的名字顺序来

未优化:select a,b from table order by a asc,b desc
优化后:select a,b from table order by a,b desc/asc

二,Group by 优化

group by 底层也是进行了filesort(文件排序)排序的,所以只需要在后面加上order by null,如果效果不理想,则添加索引

未优化: 无索引 select sum(a),b from table group by b order by a;
优化后:无索引 select sum(a),b from table group by b order by null

三,子查询

未优化:select * from table_a where a_id in (select a_id from table_b);
优化后:select * from table_a a,table_b b where a.a_id = b.a_id

四,使用union代替or

如果Or后面的字段没有单列索引,则可以通过Union进行优化
未优化:b列无索引:select a,b from table where a = '' or b = ''
优化后:select a,b from table where a='' union select a,b from table where b = ''

五,Limit分页优化

案例1:表的数据较多,分页查到后面的时候,速度会变得较慢,例如有400W条数据,我们只需要300W后的10条数据(10条为一页)的数据,因为会把前面的排序一遍,然后去掉300W条数据,只保留10条,很显然这有些浪费。(select * from table limit 3000000,10);
解决方案:select * from table a,(select id from table limit 3000000,10) b where a.id=b.id;
案例2:如果表的主键是自增长的,并且没有出现断层。
解决方案:select * from table where id >3000000 limit 10

断层:比如表有10条记录 id是1-10 这时候删除或修改了 5或8 ,这样ID就不是连续的,叫做断层

六,sql优化提示

建议使用索引:select * from table useindex(test_index) where a =''
忽略索引:select * from table ignoreindex(test_index) where a = ''
强制使用索引:select * from table forceindex(test_index) where a =''

你可能感兴趣的:(Mysql常见sql语句优化)