Mysql優化

簡述: 如何對mysql數據數據庫進行有話進而提高程序代碼的執行速度,執行效率一直是一個比較重要的問題。


一、優化概述.


    存儲層:存儲引擎、字段類型選擇、範式設計


    設計層: 索引、緩存、分區分表


    架構層:多個mysql服務器配置,讀寫分離(主從模式)


    sql語句層:多個sql語句都可以達到目的的情況下,選擇性能搞的,速度快的sql語句




二、存儲引擎


    概念:存儲數據的技術和功能的合併就稱爲"存儲引擎"


    查看mysql中所有的存儲引擎: > show engines;


    InnoDB:


        數據庫的每個數據表的數據設計三方面信息:表結構,數據,索引


        技術特點:支持事務、行級鎖定、外鍵


        數據存儲順序:按照主鍵的順序排列每個寫入的數據,該特點決定了該類型表的寫入操作比較慢


        併發性高:該存儲引擎的鎖表級別是行鎖,只鎖定被操作的當前紀錄


        事務: 把許多(增、刪、改)的sql語句捆綁在一起,要麼全部執行,包麼全部不執行


        特點:原子性


                 一致性


                 持久性


                 隔離性


        語法:commit 和 rollback 只能執行一個


            start transaction;


                   許多sql語句


                    sql語句有問題


                        rollback; // 回滾


            commit; // 提交


    MyISAM:


        該類型的存儲引擎的數據表 表結構(.frm)、表數據(.MYD)、表索引(.MYI)都有各自的存儲文件


        特點: 獨立的文件存儲可以單獨備份和還原


        存儲順序:按照自然順序排列每個寫進的數據,該特點決定了該表類型的寫入速度比較快


        併發性:該類型的併發性較低 - 表鎖定


        壓縮機制: 如果一個數據表的數據非常多,爲了節省存儲空間,需要對該表進行要鎖處理


            複製當前表的數據: insert into order1 select null, order_num from order2;


        問題:


            壓縮的數據表是隻讀表,不能寫信息


         壓縮數據表的特點:


                不能頻繁的寫入操作,只是內容固定的數據表可以做壓縮處理,例如: 存儲全國地區信息的數據表


                如果必須寫入數據,就得先解壓該數據表,寫入數據,再壓縮




    InnoDB存儲引擎:適合做修改,刪除


    MyISAM存儲引擎:適合做查詢,寫入操作



    Archive:


        歸檔存儲引擎,該引擎只有寫入,查詢操作,沒有修改,刪除操作


         適用:存儲『日誌』性質的信息


    Memory:


        內存型存儲引擎,比較適合存儲臨時信息,服務器斷電,給存儲引擎的數據立即丟失



三、字段類型的選擇


    字節佔用: tinyint(1)、 smallint(2)、 mediumint(3)、 int(4)、 bigint(8)


    ① 儘量少的佔用內存空間


           年齡: tinyint 等


           時間類型:


                time():時分秒


                datetime(): 年月日 時分秒


                year(): 年份


                date(): 年月日


                timestamp(): 時間戳   1970-1-1 到現在的秒數


    ② 數據的整合最好固定長度


        char(長度)


            固定長度:運行速度快,255字符限制


            長度不固定:內容表少要進行補位操作,該類型要保留1-2個字節保存當前的數據的長度 ,65535字節限制


    ③ 信息最好存儲爲整型


        時間信息可以存儲爲整型(時間戳)


        推薦使用set和enum類型,內部會通過整型信息參數進行具體計算,運行


        ip地址也可以變爲整型信息進行存儲


         mysql 內部 轉換ip:


                ip轉整型:inet_aton(ip)


                整型轉ip:inet_ntoa(數字)


         php: ip2long(ip)    long2ip(數字)


四、索引index


       索引可以明顯提升查詢sql語句的速度


       索引: 索引本身是一個獨立的存儲單位,在該單位記錄着數據表某個字段和字段對應的物理空間信息


        ① 索引類型


               1. 主鍵索引: primary key


                            auto_increment 必須給主鍵索引設置


                            信息內容要求不能null,唯一


                2.唯一索引:unique key


                             信息內容不能出現重複


                3.普通索引:key


                        沒有具體要求


                4. 全文索引:fulltext index


                5. 複合索引


        ② 執行計劃 explain


                針對查詢語句設置執行計劃,當前數據庫只有查詢語句支持執行計劃, 查詢sql語句真實執行之前所有的資源計劃就是執行計劃


                具體操作:


                    explain 查詢sql語句\G;


                ex: explain select * from emp where empno=123\G


       ③ 索引適合場景


            1. where查詢條件:where 之後設置的查詢條件字段都適合做做索引


            2. 排序查詢:排序字段適合做索引


            3. 索引覆蓋,查詢的字段已經在索引裏邊存在,就直接獲取即可,不用在到數據庫中獲取了,該查詢速度非常快,效率高,該索引也成爲黃金索引


            4. 給數據表的外鍵設置索引,可以提高連表查詢速度。


        注: 索引本身要佔用一定的系統資源


 五、索引原則


    ① 字獨立原則


        select * from emp where empno=12343;  // empno 條件字段獨立


        select * from emp where empno+=123123; // empno 條件字段不獨立


    ② 左原則:查詢條件信息左邊出現,就給使用索引


    ③ 複合索引:


            ename複合索引內部有兩個字段(ename, job)


            ① ename(前者字段)作爲查詢條件可以使用複合索引


            ② job(後者字段)作爲查詢條件不能使用複合索引


    ④ OR原則: OR左右的條件必須都具備了索引纔可以使用索引

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章