Mysql數據庫的優化(入門)

三個表進行比較(同樣的數據)

在這裏插入圖片描述
每表存4000w條數據
導入千萬條數據方法:
https://blog.csdn.net/weixin_45736927/article/details/104492684

注意:本章查詢多次用*是爲了比較數據查詢的時間更準確,也是比較方便

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

不創建索引和聯合索引和單個索引進行比較:

usertb表:不創建索引在這裏插入圖片描述
usertb2表:聯合索引
在這裏插入圖片描述
usertb3:單個索引
在這裏插入圖片描述

數據庫優化的目的:

在這裏插入圖片描述

優化的方式

在這裏插入圖片描述

如何查看sql的查詢效率

在日常工作中,我們會有時會開慢查詢去記錄一些執行時間比較久的SQL語句,找出這些SQL語句並不意味着完事了,些時我們常常用到explain這個命令來查看一個這些SQL語句的執行計劃,查看該SQL語句有沒有使用上了索引,有沒有做全表掃描,這都可以通過explain命令來查看。所以我們深入瞭解MySQL的基於開銷的優化器,還可以獲得很多可能被優化器考慮到的訪問策略的細節,以及當運行SQL語句時哪種策略預計會被優化器採用。
– 實際SQL,查找用戶名爲Jefabc的員工
select * from usertb where uname= ‘用戶1’;
查看SQL是否使用索引,前面加上explain即可
explain select * from usertb where uname= ‘用戶1’;
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

索引創建原則

a. ORDER BY + LIMIT組合的索引優化
如果一個SQL語句形如:
SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort] LIMIT [offset],[LIMIT];
這個SQL語句優化比較簡單,在[sort]這個欄位上建立索引即可。

通過這個sql語句
條件:同等數據量

SELECT * FROM usertb  ORDER BY ucreatetime DESC
//表名需要改

usertb:用時=======
在這裏插入圖片描述
usertb2:用時=======
在這裏插入圖片描述

usertb3:用時=======
在這裏插入圖片描述
b. WHERE + ORDER BY + LIMIT組合的索引優化

如果一個SQL語句形如:
SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [VALUE] ORDER BY [sort] LIMIT [offset],[LIMIT];

這個語句,如果你仍然採用第一個例子中建立索引的方法,雖然可以用到索引,但是效率不高。更高效的方法是建立一個聯合索引(columnX,sort)

通過這個sql語句
條件:同等數據量

SELECT * FROM usertb WHERE uname='用戶1' ORDER BY ucreatetime DESC
//注意表格需要改變

usertb:用時=======
在這裏插入圖片描述
usertb2:用時=======
在這裏插入圖片描述
usertb3:用時=======
在這裏插入圖片描述
並不是加了索引查詢就快,可根據上面2個sql語句進行對比,添加索引的時候要根據索引創建原則添加,不同sql語句添加的索引字段不同

總結

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

一個表的索引不是越多越好,也沒有一個具體的數字,根據以往的經驗,一個表的索引最多不能超過6個,因爲索引越多,對update和insert操作也會有性能的影響,涉及到索引的新建和重建操作

第二:

建立索引的方法論爲:
多數查詢經常使用的列;
很少進行修改操作的列;
索引需要建立在數據差異化大的列上

四種索引應用場景:

在這裏插入圖片描述

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
表結構方面優化
  1. 選擇最合適的字段屬性,使用可以存在數據的最小的數據類型,例如郵政編碼,手機號碼這類定長的數字可以用char(6),char(11);性別或者是否這種判斷性文字可以用tinyint;字段屬性儘量爲not null這樣不用判斷是否爲空,減少一個步驟(用其他方式表達你想表達的NULL,比如 -1);如果一定要用text這種類型,最好是採用分表存儲;
    2.將常用信息和不常用信息分表存儲,比如一個商城網站的用戶表,用戶的暱稱,頭像,密碼,賬號這類字段用戶登錄就會用到,而用戶的興趣愛好了,喜歡的顏色了這種字段就分表存儲,相信大家京東賬號中的個人信息可能也就在註冊的時候打開過,以後就再沒注意過了吧。

例子
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章