MySQL數據庫優化


一、MySQL會遇到的問題:

  1、高並發的讀寫效率低問題----解決方案:集群,分布式。

  2、海量數據的讀寫效率低問題-----解決方案:分表,分庫。

  3、高可用和高擴展----解決方案:動態擴展服務器、防止單點故障、容災。

 

 

二、關系型數據庫優化:(原則:先單機,后多機。

  2.1 單機優化方案

    1.慢SQL的定義-->分析慢SQL--解決慢SQL。   

    2. 表的設計、索引、引擎的優化。
         3. 分表(垂直分表、水平分表)、分區、分庫 的優化。
         4. 緩存做集群。

    5.SQL語句優化

 

  

  2.2 多機優化方案(分為多個數據庫):

 

    1. 讀寫分離(要保證主從同步):

 

          28原則:如果有10個數據庫,則2個專門做增刪改的數據庫,8個專門做查詢的數據庫。

 

    2. 緩存做集群

 

三、定位慢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%’

 

  1. create drop truncate(重置表) delete

 

    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%’;

 

四、分析慢SQL

  (1) Explain select * from emp where empno=459 :分析這條查詢語句

 

 

 

五、單機優化---表設計和引擎

  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;

六、單機優化---索引

   概念:只是一個數據結構,用於提升查詢性能的,但是刪除,添加,修改就相對慢了。是以空間換時間的策略。
   分類:
     普通索引:允許重復的值出現,可以在任何字段上面添加。

    唯一索引:不能有重復,可以在任何字段上面添加,可以為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=xxxor loc=xx;  //因此索引無效

    4.4.4 如果列類型是字符串,那一定要在條件中將數據使用引號引用起來。否則使用索引無效。

        expain select * from dept where dname=111; //索引有效

        expain select * from dept where dname=qqq;  //會報錯

    4.4.5 如果mysql估計使用全表掃描要比使用索引快,則不使用索引。

 

         如:表里面只有一條記錄

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM