環境: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操作,所以主從復制會有延遲的效果,比如你往資料庫中插入一條資料,然后你去查詢卻查不到
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/256210.html
標籤:其他
