zoukankan      html  css  js  c++  java
  • 【MySQL】存储引擎和连接查询

    查询引擎命令:show engines

    MyISAM和InnoDB对比

    对比项 MyISAM InnoDB
    主外键 不支持 支持
    事务 不支持 支持
    行表锁 表锁,即使操作一条记录也会锁住整个表,不适合高并发操作 行锁,操作时只锁住一行,不对其他行有影响,适合高并发
    缓存 只缓存索引,不缓存真实数据

    不仅缓存索引,还缓存真实数据,对内存要求高

    而且内存大小对性能有决定性影响。

    表空间
    关注点 性能 事务
    默认安装

    阿里淘宝用的大部分数据库是以Percona为原型修改的。(AliSql+AliRedis)

    Percona为MySQL数据库服务器进行了改进,在功能和性能上较MySQL有很大提升,提高了在高负载下的InnoDB的性能,为DBA提供了一些非常有用的性能诊断工具,有更多的参数和命令来控制服务器行为。

    SQL性能下降、执行时间长、等待时间长可能的原因:

    1. 查询语句写的不好
    2. 索引失效(单值、复合)
    3. 关联查询太多join(设计缺陷或者需求需要)
    4. 服务器调优及各个参数设置(缓冲、线程数等)

    SQL执行顺序

    手写顺序:

    SELECT DISTINCT
             查询的表
    FROM
             左表 连接类型
    JOIN 右表 ON 连接条件
    WHERE
            查询条件
    GROUP BY
            组合的条件
    HAVING
            拥有的条件
    ORDER BY
            排序的条件
    LIMIT 限制的数量

    机读顺序:

    1. FROM 笛卡尔积
    2. ON 主表保留
    3. JOIN 
    4. WHERE 非聚合
    5. GROUP BY 改变对表的引用
    6. HAVING 只作用分组后
    7. SELECT
    8. DISTINCT
    9. ORDER BY
    10. LIMIT

    SQL JOINs

    内连接:A inner join B on A.key = B.key(AB的交集)

    左连接:A left join B on A.key = B.key(A的全集,B只有交集部分)

    右连接:A right join B on A.key = B.key(B的全集,A只有交集部分)

    左连接不要B:A left join B on A.key = B.key where B.key is null(A-B)

    右连接不要A:A right join B on A.key = B.key where A.key is null(B-A)

    全连接:A full outer join B on A.key = B.key (AB的全集)

    (A-B)∪(B-A):A full outer join B on A.key = B.key where A.key is null or B.key is null

     画个饼图一目了然

    mysql不支持 full outer join,可以用UNION写成这样(合并并去重)

      SELECT * FROM t1
      LEFT JOIN t2 ON t1.id = t2.id
      UNION
      SELECT * FROM t1
      RIGHT JOIN t2 ON t1.id = t2.id
      WHERE t1.id IS NULL

    当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION。

  • 相关阅读:
    Space for commit to queue couldn't be acquired
    数据埋点(浅谈埋点方式与上报收集)
    Hashed Indexes Geospatial Index
    线程安全 对StringBuilder抛出ArrayIndexOutOfBoundsException的探究
    [a,s]=[22,3]
    Flume-ng-sdk源码分析
    pstree
    将线上服务器生成的日志信息实时导入kafka,采用agent和collector分层传输,app的数据通过thrift传给agent,agent通过avro sink将数据发给collector,collector将数据汇集后,发送给kafka
    线程池 最大线程数
    es 300G 数据删除 执行计划 curl REST 操作
  • 原文地址:https://www.cnblogs.com/xdcat/p/13067608.html
Copyright © 2011-2022 走看看