查詢引擎命令:show engines
MyISAM和InnoDB對比
對比項 | MyISAM | InnoDB |
主外鍵 | 不支持 | 支持 |
事務 | 不支持 | 支持 |
行表鎖 | 表鎖,即使操作一條記錄也會鎖住整個表,不適合高併發操作 | 行鎖,操作時只鎖住一行,不對其他行有影響,適合高併發 |
緩存 | 只緩存索引,不緩存真實數據 |
不僅緩存索引,還緩存真實數據,對內存要求高 而且內存大小對性能有決定性影響。 |
表空間 | 小 | 大 |
關注點 | 性能 | 事務 |
默認安裝 | 是 | 是 |
阿里淘寶用的大部分數據庫是以Percona爲原型修改的。(AliSql+AliRedis)
Percona爲MySQL數據庫服務器進行了改進,在功能和性能上較MySQL有很大提升,提高了在高負載下的InnoDB的性能,爲DBA提供了一些非常有用的性能診斷工具,有更多的參數和命令來控制服務器行爲。
SQL性能下降、執行時間長、等待時間長可能的原因:
- 查詢語句寫的不好
- 索引失效(單值、複合)
- 關聯查詢太多join(設計缺陷或者需求需要)
- 服務器調優及各個參數設置(緩衝、線程數等)
SQL執行順序
手寫順序:
SELECT DISTINCT 查詢的表 FROM 左表 連接類型 JOIN 右表 ON 連接條件 WHERE 查詢條件 GROUP BY 組合的條件 HAVING 擁有的條件 ORDER BY 排序的條件 LIMIT 限制的數量
機讀順序:
- FROM 笛卡爾積
- ON 主表保留
- JOIN
- WHERE 非聚合
- GROUP BY 改變對錶的引用
- HAVING 只作用分組後
- SELECT
- DISTINCT
- ORDER BY
- 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。