環境: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操作,所以主從複製會有延遲的效果,比如你往數據庫中插入一條數據,然後你去查詢卻查不到