实践中如何优化MySQL(建议收藏!)

  • SQL语句的优化:
    • 1、尽量避免使用子查询
    • 3、用IN来替换OR
    • 4、LIKE前缀%号、双百分号、_下划线查询非索引列或*无法使用到索引 , 如果查询的是索引列则可以
    • 5、读取适当的记录LIMIT M,N , 而不要读多余的记录
    • 6、避免数据类型不一致
    • 7、分组统计可以禁止排序sort , 总和查询可以禁止排重用union all
    • 8、避免随机取记录
    • 9、禁止不必要的ORDER BY排序
    • 10、批量INSERT插入
    • 11、不要使用NOT等负向查询条件
    • 12、尽量不用select *
    • 13、**区分in和exists**
  • 索引的优化:
    • 1、Join语句的优化
    • 2、避免索引失效
在开始介绍如何优化sql前 , 先附上mysql内部逻辑图让大家有所了解
实践中如何优化MySQL(建议收藏!)文章插图
① SQL语句及索引的优化SQL语句的优化:1、尽量避免使用子查询
实践中如何优化MySQL(建议收藏!)文章插图
2、避免函数索引
实践中如何优化MySQL(建议收藏!)文章插图
3、用IN来替换OR
实践中如何优化MySQL(建议收藏!)文章插图
另外 , MySQL对于IN做了相应的优化 , 即将IN中的常量全部存储在一个数组里面 , 而且这个数组是排好序的 。 但是如果数值较多 , 产生的消耗也是比较大的 。 再例如:select id from table_name where num in(1,2,3) 对于连续的数值 , 能用 between 就不要用 in 了;再或者使用连接来替换 。
4、LIKE前缀%号、双百分号、_下划线查询非索引列或*无法使用到索引 , 如果查询的是索引列则可以
实践中如何优化MySQL(建议收藏!)文章插图
5、读取适当的记录LIMIT M,N , 而不要读多余的记录select id,name from table_name limit 866613, 20使用上述sql语句做分页的时候 , 可能有人会发现 , 随着表数据量的增加 , 直接使用limit分页查询会越来越慢 。
优化的方法如下:可以取前一页的最大行数的id , 然后根据这个最大的id来限制下一页的起点 。 比如此列中 , 上一页最大的id是866612 。 sql可以采用如下的写法:
select id,name from table_name where id> 866612 limit 206、避免数据类型不一致7、分组统计可以禁止排序sort , 总和查询可以禁止排重用union all
实践中如何优化MySQL(建议收藏!)文章插图
union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作 , 这就会涉及到排序 , 增加大量的CPU运算 , 加大资源消耗及延迟 。 **当然 , union all的前提条件是两个结果集没有重复数据 。 **所以一般是我们明确知道不会出现重复数据的时候才建议使用 union all 提高速度 。
另外 , 如果排序字段没有用到索引 , 就尽量少排序;
8、避免随机取记录
实践中如何优化MySQL(建议收藏!)文章插图
9、禁止不必要的ORDER BY排序
实践中如何优化MySQL(建议收藏!)文章插图
10、批量INSERT插入
实践中如何优化MySQL(建议收藏!)文章插图
11、不要使用NOT等负向查询条件你可以想象一下 , 对于一棵B+树 , 根节点是40 , 如果你的条件是等于20 , 就去左面查 , 你的条件等于50 , 就去右面查 , 但是你的条件是不等于66 , 索引应该咋办?还不是遍历一遍才知道 。