mysql進階學習一之知識點總結

環境:centos7+mysql5.7

1 mysql5.7的安裝

  這裏使用yum安裝,參考這個老哥的博客  ,反正我安裝的時候一言難盡,重裝了好幾次,哎,平常自己玩的都是用的docker...

  裝好了記得根據上面的博客去初始化密碼哦!

 

2 mysql的邏輯架構

  mysql底層就是經過下面這幾部分,我們要知道,執行引擎纔是真正幹活的;

  可以發現這裏運行了緩存,首先在緩存中取數據,緩存中能命中就直接從緩存中去,緩存中存數據是sql語句爲鍵,實際的數據爲值

  例如:select name from stu where id = 1;  和select name from stu where id <2 and id>0  ,雖然兩條sql在我們看來是一樣的,但是不會命中緩存,因爲sql不一樣

 

  在上圖中第5步中的優化器Optimizer,會對我們執行的sql進行優化,例如我們寫的sql格式如下:

 

  然後在優化器中可能就變成了下面這種(每次的優化都有可能不一樣)

 

  可以看看mysql中有幾種執行引擎:show engines;

  默認的就是Innodb,從下面可以看到這個引擎支持事務,行鎖和外鍵,一般還會說MyISAM的特點,就是不支持事務,不支持行鎖(只支持表鎖),不支持外鍵;

  兩個引擎還有一個不同就是,MyISAM只緩存索引,而InnoDb緩存索引和實際的數據;

  那什麼時候會使用MyISAM引擎呢?其實就是mysql自帶的一些表會用這個引擎,因爲不需要高併發嘛,一般也是管理員去修改一下,所以鎖住整張表也無所謂;

 

3.性能

  項目中mysql使用時間長了之後, 性能會下降,sql的執行時間變長,一般有幾個原因

  (1)sql中關聯的表太多:比如有太多的join,我們需要對sql進行優化

    (2)沒有充分的利用索引: 看情況去建立索引

  (3)數據量太多:sql的優化已經到了極致,數據量太多就需要進行分庫分表

  (4)mysql服務器參數調優:這個一般也不會去修改,主要是調整my.cnf文件

 

    對sql進行優化,一般就是添加索引,我們一些情況需要添加索引:

  (1)頻繁的作爲查詢條件的字段

  (2)與其他表作爲關聯的字段

  (3)建立組合索引優於單鍵索引

    (4)  排序語句中的字段加索引,因爲索引是已經排序好了的,可以極大的提高排序速度

  (5)分組的字段,因爲group by是先做的order by,然後再進行的分組

  

  不應該創建索引的字段:

  (1)表的記錄太少了

  (2)經常進行增刪改的字段,因爲也需要對索引進行相應的操作

  (3)where條件中用不到的字段

  (4)區分度不高的字段,比如性別

 

 4 explain查看執行計劃

  在mysql的邏輯架構圖中的第5步會調用優化器Optimizer會生成執行計劃,然後執行引擎就是根據這個執行計劃去執行sql的;

  explain命令就是查看這個執行計劃的,用法就是sxplain+sql語句,示例: explain select * from stu where id = 0

  我們可以根據執行計劃看到:

  (1)表的讀取順序

  (2) 操作表的操作類型

  (3)索引的使用情況

  (4)表之間的引用

  (5)每張表有多少行數據被查詢

  ...

  下面中框框中是比較重要的字段,要明白其中的含義才能更好的分析,想知道每個字段詳細意思的,看看這個老哥的博客 

  

5  索引失效

  有的時候一些不規範的sql寫法會導致明明新建了sql,但是沒有走索引,常見的有這麼幾種情況:

  (1)沒有遵循最左匹配原則,比如索引是(a,b,c),但是你只使用了b,或者(b,c)

  (2)對索引列使用了!=進行判斷,xxx where age != 10 

  (3)使用了is not null   ,xxx where age is not null 

  (4)like模糊查詢時百分號在前面,  xxx where age like '%8'

  (5)字符串不加引號,比如xxx where name = 1  ,name建立了索引,而且那麼是varchar類型的,此時索引會失效

  (6)對索引列使用函數計算了 ,例如xxx where max(age) > 10 

 

6 關聯查詢優化

  (1)a left join b  : a是驅動表,a會全部掃描,b是被驅動表,b可以走索引

  所以做連表查詢的時候,數據少的做驅動表,數據多的建立索引,作爲被驅動表,簡稱小表驅動大表

  (2)a inner join b: mysql自己會將結果集小的作爲驅動表,大的作爲被驅動表

  (3)子查詢不要作爲驅動表,可能用不到索引

  (4)能關聯的就直接關聯查詢,不要用子查詢

 

7. 子查詢優化

  不要使用not in 或者not exists,使用改寫sql寫法,改成xxx a left join  b on xxx is null,這樣會走索引

 

8 排序分組優化

  (1)(a,b)是索引,xxx where a = 1 order by b會走索引

  (2)儘量使用索引字段進行排序,必須要有limit關鍵字纔會走索引

  (3)order by a desc,b asc  :   一個降序,一個升序不會走索引

  (4)order by a desc,desc : 走索引

 

9. 覆蓋索引

  select a,b from xxx

  剛好(a,b)是索引,所以這個sql就會走索引查詢數據直接返回,不會進行回表

 

10 mysql主從複製

  原理如下:

 

  分三步:

  1.主節點master將增刪改的sql記錄到二進制日誌文件(binary log)中

  2.從節點slave的io線程將主節點的二進制日誌文件拷貝到自己的中繼日誌文件(Replay log)中

  3. 從節點又啓動一個sql線程去讀取中繼日誌,執行sql

  一般主從節點是在不同的服務器中,可以知道主從節點經過了多次io操作,所以主從複製會有延遲的效果,比如你往數據庫中插入一條數據,然後你去查詢卻查不到

 

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