zoukankan      html  css  js  c++  java
  • SQL语句常见优化十大案例

    1、慢SQL消耗了70%~90%的数据库CPU资源;

    2、SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低;
    3、SQL语句可以有不同的写法;


    1.不使用子查询

    SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang');

    子查询在MySQL5.5版本里,内部执行计划器是这样执行的:先查外表再匹配内表,而不是先查内表t2,当外表的数据很大时,查询速度会非常慢。
    在MariaDB10/MySQL5.6版本里,采用join关联方式对其进行了优化,这条SQL会自动转换为

    SELECT t1.* FROM t1 JOIN t2 ON t1.id = t2.id;

    但请注意的是:优化只针对SELECT有效,对UPDATE/DELETE子查询无效,固生产环境应避免使用子查询

    2.避免函数索引

    例:

    SELECT * FROM t WHERE YEAR(d) >= 2016;

    由于MySQL不像Oracle那样支持函数索引,即使d字段有索引,也会直接全表扫描。
    应改为----->

    SELECT * FROM t WHERE d >= '2016-01-01';

    3.用IN来替换OR

    低效查询

    SELECT * FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;

    ----->
    高效查询

    SELECT * FROM t WHERE LOC_IN IN (10,20,30);

    4.LIKE双百分号无法使用到索引

    SELECT * FROM t WHERE name LIKE '%de%';

    ----->

    SELECT * FROM t WHERE name LIKE 'de%';

    5、读取适当的记录LIMIT M,N

    SELECT * FROM t WHERE 1;

    ----->

    SELECT * FROM t WHERE 1 LIMIT 10;

    6、避免数据类型不一致

    SELECT * FROM t WHERE id = '19';

    ----->

    SELECT * FROM t WHERE id = 19;
     

    7、分组统计可以禁止排序

    SELECT goods_id,count(*) FROM t GROUP BY goods_id;

    默认情况下,MySQL对所有GROUP BY col1,col2...的字段进行排序。如果查询包括GROUP BY,想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序。
    ----->

    SELECT goods_id,count(*) FROM t GROUP BY goods_id ORDER BY NULL;

    9、禁止不必要的ORDER BY排序

    SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id WHERE 1 = 1 ORDER BY u.create_time DESC;

    ----->

    SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id;

















  • 相关阅读:
    i18n在4种常见环境下使用的方式
    vue-style里面设置变量
    扫码登录功能如何实现?一文搞懂主流的扫码登录技术原理
    Gradle编译Spring源码
    Spring学习总结(7)-AOP
    Docker安装Redis
    Jvm相关文章
    上传项目到Github
    Win10系统安装MySQL Workbench 8
    [转]HashMap 和 currentHashMap 总结
  • 原文地址:https://www.cnblogs.com/flzs/p/9974704.html
Copyright © 2011-2022 走看看