mysql數據庫的優化和創建索引

mysql數據庫的優化和創建索引

1、瞭解爲什麼要優化數據庫

數據庫優化的目的

  • 避免出現頁面訪問錯誤

    • 由於數據庫連接timeout產生頁面5xx錯誤
    • 由於慢查詢造成頁面無法加載
    • 由於阻塞造成數據無法提交
  • 增加數據庫的穩定性

    • 很多數據庫問題都是由於低效的查詢引起的
  • 優化用戶體驗

    • 流暢頁面的訪問速度
    • 良好的網站功能體驗

2、瞭解數據庫優化的幾種方式

在這裏插入圖片描述

3、熟練掌握使用索引和優化數據表結構來優化數據庫查詢

1、如何查看sql的查詢效率

  • 在日常工作中,我們會有時會開慢查詢做記錄一些執行時間比較久的sql語句,找出這些sql語句並不意味着完事了,此時我們常常用到explain這個命令來查看一個這些sql語句的執行計劃,查看該sql語句有沒有使用上了索引,有沒有做全表掃描,這都可以通過explain命令來查看. 所以我們深入瞭解MySql的基於開銷的優化器,還可以獲得很多可能被優化器考慮到的訪問策略的細節,以及當運行sql語句時哪種策略預計會被優化器採用

  • –實際SQL,查找用戶名爲msfh的用戶

    • select * from user where name = 'msfh'
      
  • –查看SQL是否使用索引,前面加上explain即可

    • explain select * from user where name = 'msfh'
      

2、explain解讀

在這裏插入圖片描述

explain出來的信息有10列,分別是id,select_type,tabl,type,possible_keys,key,key_len,ref,rows,Extra

概要描述:

id:選擇標識符

select_type:表示查詢的類型

table:輸出結果集的表

partitions:匹配的表

type:表示表的連接類型

possible_keys:表示查詢時,可能使用的索引

key:

表示實際使用的索引

key_len:索引字段的長度

ref:索引字段的長度

ref:列與索引的比較

rows:掃描出的行數(估算的行數)

filtered:按表條件過濾的行百分比

Extra:執行情況的描述和說明

對錶訪問方式,表示MySQL在表中找到所需行的方式,又稱"訪問類型"

常用的類型有:ALL、index、range、ref、eq_ref、const、system、NULL(從左到右,性能從差到好)

ALL:FUll Table Scan,MySQL將便利全表以找到匹配的行

index: Full Index Scan , index與ALL區別爲index類型只便利索引樹

range: 只檢索給定範圍的行 , 使用一個索引引來選擇行

ref: 表示上述表的連接匹配條件 , 即哪些列或常量被用於查找索引列上的值

3、索引創建原則

1、ORDER BY +LIMIT組合的索引優化 , 如果一個SQL語句如:

SELECT [column1],[column2],. FROM [TABLE] ORDER BY [sort] LIMIT [offset],[LIMIT];

這個SQL語句優化比較簡單,在[sort]這個欄位上建立索引即可

2、WHERE + ORDER BY + LIMIT組合的索引優化

如果一個SQL語句如:

SELECT [column1],[column2],. FROM [TABLE] WHERE [columnX] = [VALUE] ORDER BY [sort] LIMIT [offset],[LIMIT];

這個語句,如果你仍然採用第一個例子中建立索引的方法,雖然可以用到索引,但是效率不高.

更高效的方法是建立一個聯合索引(columnX,sort)

3、怎麼加快查詢速度,優化查詢效率,主要原則就是應儘量避免全表掃描,英愛考慮在where及order by 設計的列上建立索引.

建立索引不是建的越多越好,原則是:

  • 一個表的索引不是越多越好,也沒有一個具體的數字,根據以往的經驗,一個表的索引最多不能超過6個,欣慰索引越多,對update和insert操作也會有性能的影響,設計到索引的新建和重建操作.
  • 建立索引的方法論位:
    • 多數查詢經常使用的列;
    • 很少進行修改操作的列;
    • 索引需要建立在數據差異大的列上

4、四種索引的使用場景

​ PRIMARY , INDEX , UNIQUE 這三種是一類

​ PRIMARY主鍵 . 就是 唯一不能爲空

​ INDEX 索引, 普通的

​ UNIQUE 唯一索引. 不予許有重複.

​ FULLTEXT是全文索引 , 用於在一篇文章中 , 檢索文本信息的 .

​ 舉個例子來說 , 比如你在爲某商場做一個會員卡的系統

​ 這個系統有一個會員表

​ 有下列字段

在這裏插入圖片描述

5、SQL查詢注意部分

1. 任何地方都不要使用 select * from t ,用具體的字段列表代替“*”,不要返回用不到的任何字段。 
 2.  應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。
 3.  應儘量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如: 
     select id from t where num/2=100 
     應改爲: 
     select id from t where num=100*2 
 4.  應儘量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
     select id from t where num=10 or num=20
     應改爲:
     select id from t where num=10 union all select id from t where num=20

6、表結構方面優化

1. 選擇最合適的字段屬性,使用可以存在數據的最小的數據類型,例如郵政編碼,手機號碼這類定長的數字可	以用char(6),char(11);性別或者是否這種判斷性文字可以用tinyint;字段屬性儘量爲not null這樣不用判斷是否	爲空,減少一個步驟(用其他方式表達你想表達的NULL,比如 -1);如果一定要用text這種類型,最好是採用	分表存儲;
 2.將常用信息和不常用信息分表存儲,比如一個商城網站的用戶表,用戶的暱稱,頭像,密碼,賬號這類字段用	戶登錄就會用到,而用戶的興趣愛好了,喜歡的顏色了這種字段就分表存儲,相信大家京東賬號中的個人信息	可能也就在註冊的時候打開過,以後就再沒注意過了吧。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章