1、MySQL會遇到的問題:mysql
一、高併發的讀寫效率低問題----解決方案:集羣,分佈式。sql
二、海量數據的讀寫效率低問題-----解決方案:分表,分庫。數據庫
三、高可用和高擴展----解決方案:動態擴展服務器、防止單點故障、容災。緩存
2、關係型數據庫優化:(原則:先單機,後多機。)安全
2.1 單機優化方案:服務器
1.慢SQL的定義-->分析慢SQL--解決慢SQL。 session
2. 表的設計、索引、引擎的優化。
3. 分表(垂直分表、水平分表)、分區、分庫 的優化。
4. 緩存作集羣。數據結構
5.SQL語句優化併發
2.2 多機優化方案(分爲多個數據庫):分佈式
1. 讀寫分離(要保證主從同步):
28原則:若是有10個數據庫,則2個專門作增刪改的數據庫,8個專門作查詢的數據庫。
2. 緩存作集羣
3、定位慢SQL
3.1 查看數據庫狀態:
3.1.1 查看運行時間:show status like ‘uptime’;
3.1.2 CRUD執行次數:
Show status like ‘Com_%’;
Show status like ‘Com_update%’
Show status like ‘Com_delete%’
Show status like ‘Com_insert%’
Show status like ‘Com_select%’
GLOBAL(全局)、SESSION(當前會話)
show global status like ‘Com_select%’;
show session status like ‘Com_select%’;
3.1.3 查看全部鏈接數:
Show status like ‘connections’;
Show status like ‘Max_used_connections’;
3.2 查看慢查詢
3.2.1 查看慢查詢的條數
Show status like ‘slow_queries’;
Select * from dept;
Select * from emp where ....;
3.2.2 告訴MySQL什麼是慢,設置慢查詢閥值。
Show variables like ‘long_query_time’;
Set long_query_time=0.5
Show VARIABLES like ‘%slow%’;
4、分析慢SQL
(1) Explain select * from emp where empno=459 :分析這條查詢語句
5、單機優化---表設計和引擎
5.1 表結構設計---3NF和反3NF
1NF:表的列:具備原子性,不可再分解。
2NF:主鍵惟一性。
3NF:表中無冗餘數據。
反3NF:適當增長字段,容許冗餘-----可提升查詢效率。
5.2 MySQL存儲引擎
注意:在建表的時候能夠指定存儲引擎,不指定則爲默認,該默認是在my.ini文件裏配置。
MySQL引擎分類:myisam、innodb、memory。
5.2.1 MyISAM 和 INNODB的區別(主要區別)
1. 事務安全:MyISAM不支持事務,INNODB支持。
2. 查詢和添加速度:MyISAM速度快,INNODB速度慢。
3. 支持全文索引:MyIsam支持,innodb不支持。
4. 鎖機制: MyIsam表鎖 innodb行鎖。
5. 外鍵:MyISAM 不支持外鍵, INNODB支持外鍵. (一般不設置外鍵,一般是在程序中保證數據的一致)。
5.2.2 引擎使用場景
MyISAM存儲引擎:
若是表對事務要求不高,同時是以查詢和添加爲主的,咱們考慮使用myisam存儲引擎. 好比 bbs 中的 發帖表,回覆表.
INNODB存儲引擎:
對事務要求高,保存的數據都是重要數據,咱們建議使用INNODB,好比訂單表,帳號表.
5.2.3 添加、修改引擎
1、建立表時指定存儲引擎:
Create table 表名(字段列表) engine 存儲引擎名稱;
2、修改存儲引擎:
alter table table_name engine=innodb;
6、單機優化---索引
概念:只是一個數據結構,用於提高查詢性能的,可是刪除,添加,修改就相對慢了。是以空間換時間的策略。
分類:
普通索引:容許重複的值出現,能夠在任何字段上面添加。
惟一索引:不能有重複,能夠在任何字段上面添加,能夠爲null,而且能夠有多個null。
主鍵索引:惟一且沒有null值。
全文索引:es操做代替了數據的查詢。
6.1 Mysql經常使用引擎容許的索引類型:
hash:就像Map,經過一個key直接就能找到value。
B-tree:使用二叉樹保存索引。
6.2 索引的使用
添加索引:
方法一:create index index_emp_empno on emp(empno);
方法二:alter table emp add index index_emp_empno(empno);
查詢索引:show index from emp;
刪除索引:alter table emp drop index index_emp_empno;
修改索引:刪了再加。
6.3 適合建立索引的條件:
1. 確定在where條件常用,或常常排序,order by後面的字段。
2. 該字段的內容不能平頻繁變化。
3. 該字段的內容不是惟一的幾個值(如:sex)。
6.4 建立索引的小技巧:
根據索引列的多少區分:
普通索引(單列索引):該索引只在一個列上面建立。
複合索引(多列索引):該索引只在多個列上面建立。
6.4.1 對於建立的複合索引,若是第一個索引沒有用到(dname),這個索引就沒有用。
alter table dept add index my_indx (dname,loc); // dname 是左邊的列,loc就是右邊的列
explain select * from dept where dname='aaa' // 索引有效
explain select * from dept where loc='aaa' // 索引無效(沒有用到dname)
6.4.2 對於使用like的查詢,'%aaa’:使用索引無效,‘aaa%’:使用索引有效,‘%aaa%’:使用索引無效。
explain select * from dept where dname like '%aaa' //索引無效
explain select * from dept where dname like 'aaa%' //索引有效
explain select * from dept where dname like '%aaa%' //索引無效
6.4.3 在有or的Sql語句中,只要有一個條件不能使用索引,則這條語句的索引無效;換言之,就是要求使用的全部字段,都必須單獨使用時能使用索引。
explain select * from dept where dname = 'aaa'; //索引有效
explain select * from dept where loc = 'aaa'; //索引無效
select * from dept where dname=’xxx’ or loc=’xx’; //所以索引無效
4.4.4 若是列類型是字符串,那必定要在條件中將數據使用引號引用起來。不然使用索引無效。
expain select * from dept where dname=‘111’; //索引有效
expain select * from dept where dname=qqq; //會報錯
4.4.5 若是mysql估計使用全表掃描要比使用索引快,則不使用索引。
如:表裏面只有一條記錄