一、優(yōu)化分類
二、測試數(shù)據(jù)樣例
參考mysql官方的sakina數(shù)據(jù)庫。
三、使用mysql慢查詢?nèi)罩緦τ行蕟栴}的sql進行監(jiān)控

***個,開啟慢查詢?nèi)罩?。第二個,慢查詢?nèi)罩敬鎯ξ恢?。第三個,沒有使用索引的也會記錄到慢查詢?nèi)罩局?。第四個,超過1秒之后的查詢記錄到慢查詢?nèi)罩局校ㄍǔTO置100ms)。
3.1、分析慢查詢?nèi)罩疚募?/strong>
3.1.1 tail命令
tail -50 /home/mysql/sql_log/mysql_slow.log,輸入文件中的尾部內(nèi)容,即末尾50行數(shù)據(jù).
我們抽出其中一條,查看,如下圖所示。


query_time,查詢耗時(單位秒);lock_time,鎖表時間。rows_sent,發(fā)送請求的行數(shù);rows_examined,查詢數(shù)據(jù)導致掃描表用到的行數(shù)。
3.1.2 官方mysqldumpslow工具
mysqldumpslow ,默認隨mysql安裝。
mysqldumpslow -h,可查詢工具支持的命令。

mysqldumpslow -s r -t 10 /var/lib/mysql/localhost-slow.log | more ,返回結(jié)果如下圖所示。

3.1.3 pt-query-digest工具
比mysqldumpslow反饋的信息多。

pg-query-digest --help 查看幫助,查看使用命令。
pg-query-digest /var/lib/mysql/localhost-slow.log,查詢結(jié)果如下。

***部分

第二部分

第三部分
四、如何通過慢查日志發(fā)現(xiàn)有問題的sql

五、通過explain查詢和分析sql的執(zhí)行計劃

const常數(shù)查找,一般來說,針對主鍵和唯一索引;eq_reg,一般主鍵或是唯一索引范圍查找;ref,常見于連接查詢中;range,對于索引的范圍查找;
index,對于索引的掃描;all,表掃描。

六、count()和max()的優(yōu)化

1、max()優(yōu)化
在payment_date上建立索引

建索引后的查詢結(jié)果
可以看出,直接通過索引結(jié)構(gòu),就能查詢出***日期。覆蓋索引,是指完全可以通過索引獲得查詢結(jié)果。
2、count()優(yōu)化
count(*)包含null值,count(id)不包含
錯誤寫法:

正確寫法:

七、子查詢的優(yōu)化
一對多的子查詢,注意dinstinct

八、group by的優(yōu)化

優(yōu)化前

優(yōu)化前

優(yōu)化后

優(yōu)化后

優(yōu)化后,減少io,提高效率,節(jié)省服務器資源
靈活使用子查詢和連接查詢
九、limit查詢的優(yōu)化


缺點:分頁limit越往后,掃描行數(shù)越多,io操作越大

缺點:id連續(xù)。主鍵連續(xù)增長,分頁查詢更快
十、如何選擇合適的列建立索引

如果是覆蓋索引,可直接從索引結(jié)構(gòu)中獲取數(shù)據(jù),這樣最快;索引字段越小,數(shù)據(jù)庫數(shù)據(jù)存儲以頁為單位,每次io所獲取的數(shù)據(jù)量就大。
通過select count(dinstinct customer_id)查看離散度。離散度大的列,可選擇性越高。
十一、索引優(yōu)化SQL的方法
索引提高查詢,但是會影響inset,update,delete。



4、數(shù)據(jù)庫表結(jié)構(gòu)優(yōu)化
4.1 選擇合適的數(shù)據(jù)類型

時間類型上,時間戳和int占用字節(jié)相同;not null需要額外字段存儲,


bigint8個字節(jié),varchar15個字節(jié)
4.2 數(shù)據(jù)庫的范式化優(yōu)化


4.4表的垂直拆分

例如,將新聞表的內(nèi)容拆分到單獨一個表
4.5 表的水平拆分


前臺用拆分后的表,后臺用匯總表