• Mysql优化笔记


    Mysql 索引详细讲解:

    https://blog.csdn.net/qq_24313635/article/details/102924190

    语法顺序:

    SELECT
    DISTINCT
    FROM
    JOIN
    ON
    WHERE
    GROUP BY
    HAVING
    ORDER BY
    LIMIT

    执行顺序:

    FROM<表名> # 选取表,将多个表数据通过笛卡尔积变成一个表。

    ON<筛选条件> # 对笛卡尔积的虚表进行筛选

    JOIN

    # 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中

    WHERE # 对上述虚表进行筛选

    GROUP BY<分组条件> # 分组

    聚合函数> # 用于having子句进行判断,在书写上这类聚合函数是写在having判断里面的

    HAVING<分组筛选> # 对分组后的结果进行聚合筛选

    SELECT<返回数据列表> # 返回的单列必须在group by子句中,聚合函数除外

    DISTINCT数据除重

    ORDER BY<排序条件> # 排序

    LIMIT<行数限制>

    多表关联查询时,小表在前,大表在后。

    调整Where字句中的连接顺序

    MySQL采用从左往右,自上而下的顺序解析where子句。根据这个原理,应将过滤数据多的条件往前放,最快速度缩小结果集。
    
    • 1

    尽量避免使用in 和not in,会导致引擎走全表扫描。如下:

    SELECT * FROM t WHERE id IN (2,3)
    
    • 1

    优化方式:如果是连续数值,可以用between代替。如下:

    SELECT * FROM t WHERE id BETWEEN 2 AND 3
    
    • 1

    如果是子查询,可以用exists代替。详情见《MySql中如何用exists代替in》如下:

    -- 不走索引
    select * from A where A.id in (select id from B);
    -- 走索引
    select * from A where exists (select * from B where B.id = A.id);
    
    • 1
    • 2
    • 3
    • 4

    尽量避免使用 or,会导致数据库引擎放弃索引进行全表扫描。如下:如果是子查询,可以用exists代替。详情见《MySql中如何用exists代替in》如下:

    SELECT * FROM t WHERE id = 1 OR id = 3
    
    • 1

    优化方式:可以用union代替or。如下:

    SELECT * FROM t WHERE id = 1
       UNION
    SELECT * FROM t WHERE id = 3
    
    • 1
    • 2
    • 3

    order by 条件要与where中条件一致,否则order by不会利用索引进行排序

    -- 不走age索引
    SELECT * FROM t order by age;
     
    -- 走age索引
    SELECT * FROM t where age > 0 order by age;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    优化group by语句

    默认情况下,MySQL 会对GROUP BY分组的所有值进行排序,如 “GROUP BY col1,col2,…;” 查询的方法如同在查询中指定 “ORDER BY col1,col2,…;” 如果显式包括一个包含相同的列的 ORDER BY子句,MySQL 可以毫不减速地对它进行优化,尽管仍然进行排序。

    因此,如果查询包括 GROUP BY 但你并不想对分组的值进行排序,你可以指定 ORDER BY NULL禁止排序。例如:

    SELECT col1, col2, COUNT(*) FROM table GROUP BY col1, col2 ORDER BY NULL ;
    
    • 1

    优化join语句

    MySQL中可以通过子查询来使用 SELECT 语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的 SQL 操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,有些情况下,子查询可以被更有效率的连接(JOIN)…替代。

    例子:假设要将所有没有订单记录的用户取出来,可以用下面这个查询完成:

    SELECT col1 FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
    
    • 1

    如果使用连接(JOIN)… 来完成这个查询工作,速度将会有所提升。尤其是当 salesinfo表中对 CustomerID 建有索引的话,性能将会更好,查询如下:

    SELECT col1 FROM customerinfo 
       LEFT JOIN salesinfo ON customerinfo.CustomerID=salesinfo.CustomerID 
          WHERE salesinfo.CustomerID IS NULL
    
    • 1
    • 2
    • 3

    连接(JOIN)… 之所以更有效率一些,是因为 MySQL 不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。

    优化union查询

    MySQL通过创建并填充临时表的方式来执行union查询。除非确实要消除重复的行,否则建议使用union all。原因在于如果没有all这个关键词,MySQL会给临时表加上distinct选项,这会导致对整个临时表的数据做唯一性校验,这样做的消耗相当高。

  • 相关阅读:
    2022-01-28-JQuery
    .Net6使用WebSocket与前端进行通信
    JavaScript Web APIs第六天笔记
    计算机毕业设计(附源码)python医院药品进销存系统
    用go实现一个循环队列
    (免费分享)基于springboot博客系统
    Java切面中各个方法对象、参数对象、反射以及注解的分析
    复习 --- QT服务器客户端
    vscode中如何将cmd设置为默认终端
    二,几何相交-5,BO算法实现--(3)事件和操作
  • 原文地址:https://blog.csdn.net/qq_45246098/article/details/126523812