7、索引優化分析

SQL性能降低的緣由

  • 查詢語句寫的很差
  • 索引失效
  • 關聯查詢太多
  • 服務器調優及各個參數的的設置(緩衝、線程數等等)

常見的JOIN查詢

一、SQL的執行順序mysql

手寫的順序:算法

真正機器執行的順序:sql

二、七種join查詢數據庫

最後兩種語法mysql不支持,可是咱們能夠用union來聯合其餘的查詢結果來拼湊出最終結果。服務器

索引

一、什麼是索引?數據結構

MySQL官方對索引的定義爲:索引(Index)是幫助MySQL高效獲取數據的數據結構。併發

也能夠簡單理解爲「排好序的快速查找數據結構」高併發

數據自己以外,數據庫還維護着一個知足特定查找算法的數據結構,這些數據結構以某種方式指向數據,這樣就能夠在這些數據結構的基礎上實現高級查找算法,這種數據結構就是索引。性能

通常來講索引自己也很大,不可能所有存儲在內存中,所以因此每每以索引文件的形式存儲在磁盤上。線程

二、索引的優點和劣勢

優點

  • 提升了數據檢索的效率,下降了數據庫的IO成本
  • 下降了數據排序的成本,下降了CPU的消耗

劣勢

  • 實際上索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄,因此索引列也是要佔用空間的
  • 雖然索引大大的提升了查詢速度,但同時也會下降更新表的速度,由於進行更新表時,MySQL不只要保存數據,還要保存一下索引文件每次更新添加了索引列的字段,都會調整由於更新所帶來的鍵值變化後的索引信息

三、索引的分類

  • 單值索引:即一個索引只包含單個列,一個表能夠有多個單值索引
  • 惟一索引:索引列的值必須惟一但容許有空值
  • 複合索引:即一個索引包含多個列

四、基本語法

  • 建立

    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

五、哪些狀況須要建立索引?

  • 主鍵自動創建惟一索引
  • 頻繁做爲查詢條件的字段應該建立索引
  • 查詢中與其餘表關聯的字段,外鍵關係創建索引
  • 頻繁更新的字段不合適建立索引
  • Where條件裏用不到的字段不建立索引
  • 在高併發下傾向建立組合索引
  • 查詢中排序的字段,排序字段若經過索引去訪問將大大提升排序速度
  • 查詢中統計或者分組的字段

六、哪些狀況不須要建立索引?

  • 表記錄太少
  • 常常增刪改的表
  • 若是某個數據列包含許多重複的內容,爲它創建索引就沒有太大的實際效果
相關文章
相關標籤/搜索