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.將常用信息和不常用信息分表存儲,比如一個商城網站的用戶表,用戶的暱稱,頭像,密碼,賬號這類字段用 戶登錄就會用到,而用戶的興趣愛好了,喜歡的顏色了這種字段就分表存儲,相信大家京東賬號中的個人信息 可能也就在註冊的時候打開過,以後就再沒注意過了吧。