SQL性能下降的原因 查詢語句寫的不好 索引失效 關聯查詢太多 伺服器調優及各個參數的的設置(緩衝、線程數等等) 常見的JOIN查詢 1、SQL的執行順序 手寫的順序: 真正機器執行的順序: 2、七種join查詢 最後兩種語法mysql不支持,但是我們可以用union來聯合其他的查詢結果來拼湊出最終 ...
SQL性能下降的原因
- 查詢語句寫的不好
- 索引失效
- 關聯查詢太多
- 伺服器調優及各個參數的的設置(緩衝、線程數等等)
常見的JOIN查詢
1、SQL的執行順序
手寫的順序:
真正機器執行的順序:
2、七種join查詢
最後兩種語法mysql不支持,但是我們可以用union來聯合其他的查詢結果來拼湊出最終結果。
索引
1、什麼是索引?
MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取數據的數據結構。
也可以簡單理解為“排好序的快速查找數據結構”
數據本身之外,資料庫還維護著一個滿足特定查找演算法的數據結構,這些數據結構以某種方式指向數據,這樣就可以在這些數據結構的基礎上實現高級查找演算法,這種數據結構就是索引。
一般來說索引本身也很大,不可能全部存儲在記憶體中,因此所以往往以索引文件的形式存儲在磁碟上。
2、索引的優勢和劣勢
優勢
- 提高了數據檢索的效率,降低了資料庫的IO成本
- 降低了數據排序的成本,降低了CPU的消耗
劣勢
- 實際上索引也是一張表,該表保存了主鍵與索引欄位,並指向實體表的記錄,所以索引列也是要占用空間的
- 雖然索引大大的提高了查詢速度,但同時也會降低更新表的速度,因為進行更新表時,MySQL不僅要保存數據,還要保存一下索引文件每次更新添加了索引列的欄位,都會調整因為更新所帶來的鍵值變化後的索引信息
3、索引的分類
- 單值索引:即一個索引只包含單個列,一個表可以有多個單值索引
- 唯一索引:索引列的值必須唯一但允許有空值
- 複合索引:即一個索引包含多個列
4、基本語法
創建
CREATE [UNIQUE] INDEX indexName ON table_name(columnname(length))
ALTER table_name ADD [UNIQUE] INDEX indexName ON (columnname(length))
如果時CHAR、VARCHAR類型,length可以小於欄位實際長度,如果是BLOB和TEXT類型,必須指定length
刪除
DROP INDEX [indexName] ON table_name
查看
SHOW INDEX FROM table_name
5、哪些情況需要創建索引?
- 主鍵自動建立唯一索引
- 頻繁作為查詢條件的欄位應該創建索引
- 查詢中與其他表關聯的欄位,外鍵關係建立索引
- 頻繁更新的欄位不合適創建索引
- Where條件里用不到的欄位不創建索引
- 在高併發下傾向創建組合索引
- 查詢中排序的欄位,排序欄位若通過索引去訪問將大大提高排序速度
- 查詢中統計或者分組的欄位
6、哪些情況不需要創建索引?
- 表記錄太少
- 經常增刪改的表
- 如果某個數據列包含許多重覆的內容,為它建立索引就沒有太大的實際效果