Mysql 高級學習記錄 持續更新~~~

    mysql 修改字符集編碼之後重啓創建的數據庫能夠生效。
    
    mysql 修改字符集編碼之後重啓不能對修改字符集之前的數據庫產生影響(該亂碼還是得亂碼)
    
    
    frm文件:數據庫結構文件
    myd文件:存放的是表數據
    myi文件:存放的是數據索引
    
    
    mysql數據庫的分層:
        第一層:連接層
        第二層:服務層,主要完成的是核心服務功能,如:SQL接口,並完成緩存的查詢,SQL分析和優化及部分內置函數的執行。
        第三層:引擎層,存儲引擎。存儲引擎真正的負責了Mysql中數據的存儲和提取,通過api和存儲引擎進行通信。不同的引擎有不同的特點:常用的是InnoDB和MyIsam
        第四層:存儲層,主要是將數據存儲在運行與裸設備的文件系統之上,並完成與存儲引擎的交互。
        
        
        sql性能下降、執行時間長的原因和處理方式?
          1.sql本身寫的不好
          2.索引失效
          3.關聯查詢太多(join太多)
          4.mysql數據庫的配置:如緩衝、線程數
          
    
    mysql機讀的時候先讀什麼關鍵字?
        join關鍵字 :
            inner join :兩個表的交集
            left join  : 左表的全部 + 右表的交集
            right join :兩個表的交集 + 右表的全部
            
            left join + b.key is null : 左表的全部 - 和右表的交集
            full outer join : 全連接
            
            union : 將兩者的sql結果去重合並
            
            
            -- inner join 交集
            SELECT * FROM t_user u INNER JOIN t_model m on u.`name` = m.userId;

            -- lefet JOIN 左連接:左邊的全部數據 + 右邊和左邊交集key的數據
            SELECT * FROM t_user u LEFT JOIN t_model m on u.`name` = m.userId;

            -- RIGHT JOIN 又連接:右邊的全部數據 + 左邊和右邊交集key的數據
            SELECT * FROM t_user u RIGHT JOIN t_model m ON u.`name` = m.userId;

            -- 左邊的數據除去和右邊有外鍵關聯的數據
            SELECT * FROM t_user u LEFT JOIN  t_model m ON u.`name` = m.userId WHERE m.userId is NULL;

            -- 右邊的數據除去和左邊有外鍵關聯的數據
            SELECT * FROM t_user u RIGHT JOIN t_model m on u.`name` = m.userId where u.id is NULL;
            
            -- 左邊除掉右邊關聯數據 + 右邊除去左邊關聯數據
            SELECT * from t_user u LEFT JOIN t_author a on u.id = a.id where a.id is NULL
            UNION
            SELECT * from t_user u RIGHT JOIN t_author a on u.id = a.id WHERE u.id is null
            
    mysql索引:幫助mysql高效獲取數據的數據結構。提高查找效率,類比於字典。
         索引的本質:索引是數據結構。排好序的快速查找的數據結構。  where  order by
         建立了索引的數據庫最好不要真正的刪除索引。
         涉及到了大量數據的創建和刪除之後可能會需要重建索引。
         
         
         索引的優點:
                1.提高了數據的檢索效率,減少了數據庫的IO成本。
                2.索引對數據進行排序,降低了排序成本,減少了cpu的消耗。
         索引的劣勢:
                1.索引也會佔用空間,大量索引會出現索引消耗資源太多。
                2.插入、刪除、修改數據的時候還需要創建、修改、刪除數據,增加數據庫的壓力。
                
         索引的分類:
                1.單一索引:一個索引只包含一個列,一個表可以有多個單一索引。一個表最多最好建立五個單一索引
                2.複合索引;一個索引包涵多個列,查找的還是遵循索引最左原則
                3.唯一索引:索引列的值必須唯一,但是允許爲null
                
         什麼時候創建索引?
                1.主鍵自動創建唯一索引
                2.頻繁作爲查詢條件的字段應該創建索引
                3.查詢中又外鍵關係的字段應該創建索引
                4.儘量創建複合索引
                5.where、order、group後面的數據需要創建索引
                
         什麼時候不創建索引?
                1.表的數據少
                2.經常進行增刪改查的字段
                3.字段只有幾個值的字段比如:國籍、性別、boolean,這樣創建索引對查詢速度提升不大。
                
        mysql的性能分析?
                1.mysql有自己的最優處理分析器。
                2.CPU\IO
                3.EXPLAIN:分析報告
                        1.explain執行計劃
                        2.id:決定了表的讀取順序(表的讀取順序並不是sql中的書寫順序)
                              值相同的時候從table由上到下執行
                              值不相同時由id最大的table執行到最小的table
                              值相同不同,先執行值最大的,然後順序執行值小的兩張表
                        3.select_type: 讀取數據的操作類型
                               simple:簡單的查詢,不包含子查詢和union
                               primary: 查詢中包涵任何的子查詢
                               subquery:在select或者where條件中包含了子查詢
                               union:
                               union result:
                        4.type : 最好是要都能達到range(範圍)、ref,需要避免all查詢
                                system(只有一條數據) > const(唯一主鍵常量查詢) > eq_ref(聯合查詢,第二張表只有一條記錄) > ref > range > index > all
                                
                        5.key : 實際使用的索引,null表示沒有命中索引,或者說該字段根本就沒有索引
                        
                        6.possible-key : 理論上使用到的索引
                        
                        7.key_len : 索引key的長度。在查詢結果一致的情況下key_len 越短越好
                        
                        8.rows : mysql優化器掃描的行數
                        
                        9.extra :額外信息
                                using filesort :order by後面不能命中索引,索引排序不對,mysql自動重新排序。(索引質量低下,比較危險需要重建索引)
                                using temporary:使用臨時表保存中間結果並分組(非常不友好)
                                
                        
                             
            
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
                
    

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