【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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章