Linux:Day40(上) 用戶、權限管理及查詢緩存

MySQL用戶和權限管理mysql

  權限類別:sql

    庫級別數據庫

    表級別緩存

    字段級別服務器

    管理類函數

    程序類性能

  管理類:優化

    CREATE TEMPORARY TABLES排序

    CREATE USER索引

    FILE

    SUPER

    SHOW DATABASES

    RELOAD

    SHUTDOWN

    REPLICATION SLAVE

    REPLICATION CLIENT

    LOCK TABLES

    PROCESS

  程序類:

    FUNCTION

    PROCEDURE

    TRIGGER

 

    CREATE,ALTER,DROP,EXCUTE

  庫和表級別:TABLE or DATABASE

    ALTER

    CREATE

    CREATE VIEW

    DROP

    INDEX

    SHOW VIEW

    GRANT OPTION:可以把本身得到的權限贈經其餘用戶一個副本;

  數據操做:

    SELECT

    INSERT

    DELETE

    UPDATE

  字段級別:

    SELECT (col1,col2,...)

    UPDATE (col1,col2,...)

    INSERT (col1,col2,...)

  全部:ALL PRIVILIEGES,ALL

 

  元數據數據庫:mysql

    受權表:

      db,host,user

      columns_priv,tables_priv,procs_priv,proxies_priv

  用戶帳號:

    ‘USERNAME'@'HOST':

      @’HOST':

        主機名:

        IP地址或Network;

        通配符:

          %,_:172.16.%.%

    建立用戶:CREATE USER

      CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password']

      查看用戶得到的受權:SHOW GRANTS FOR

        SHOW GRANTS FOR 'USERNAME'@'HOST'

      刪除用戶:DROP USER 'USERNAME'@'HOST'

      修改密碼:

        (1) SET PASSWORD FOR

        (2) UPDATE mysql.user SET password=PASSWORD('your_password') WHERE clause;

        (3) mysqladmin password

          mysqladmin [OPTIONS] command command...

            -u,-h,-p

      忘記管理員密碼的解決辦法:

        啓動mysql進程時,爲其使用:--skip-grant-tables --skip-networking

        (2) 使用UPDATE命令修改管理員密碼

        (3) 關閉Mysql進程,移除上述兩個選項,重啓Mysql;

    受權:GRANT

      GRANT priv_type[,...] ON [{table|function|procedure}] db.{table|routeine} TO 'USERNAME'@'HOST' [IDENTIFIED BY 'password']

        [REQUIRE SSL] [WITH with_option]

        with_option:
          GRANT OPTION
          | MAX_QUERIES_PER_HOUR count
          | MAX_UPDATES_PER_HOUR count
          | MAX_CONNECTIONS_PER_HOUR count
          | MAX_USER_CONNECTIONS count

      

 

    取消受權:REVOKE

      REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ...

    

    練習:受權test用戶經過任意主機鏈接當前mysqld,但每秒最大查詢次數不得超過5次;此帳戶的同時鏈接次數不得超過3次;

  

查詢緩存:

  如何判斷是否命中:

    經過查詢語句的哈希值判斷:哈希值考慮的因素包括

      查詢自己、要查詢的數據庫、客戶端使用協議版本,...

      查詢語句任何字符上的不一樣,都會致使緩存不能命中;

  哪些查詢可能不會被緩存?

    查詢中包含UDF、存儲函數、用戶自定義變量、臨時表、mysql庫中系統表、或者包含列級權限的表、有着不肯定值的函數(Now());

  查詢緩存相關的服務器變量:show global variables like '%query%';

    query_cache_min_res_unit:查詢緩存中的內存塊的最小分配單位;

      較小值會減小浪費,但會致使更頻繁的內存分配操做;

      較大值會帶來浪費,會致使碎片過多;

    query_cache_limit:可以緩存的最大查詢結果;

      對於有着較大結果的查詢語句,建議在SELECT中使用SQL_NO_CACHE

    query_cache_size:查詢緩存總共可用的內存空間;單位是字節,必須是1024的整數倍;

    query_cache_type:ON,OFF,DEMAND

    query_cache_wlock_invalidate:若是某表被其它的鏈接鎖定,是否仍然能夠從查詢緩存中返回結果;默認值爲OFF,表示能夠在表被其它鏈接淘寶的場景中繼續從緩存返回數據;ON則表示不容許;

  查詢相關的狀態變量

    SHOW GLOBAL STATUS LIKE 'Qcache%';

    緩存命中率評估:Qcache_hits/(Qcache_hits+Com_select)

 

MySQL中的索引:

  基本法則:索引應該構建在被用做查詢條件的字段上;

  索引類型:

    B+ Tree索引:順序存儲,每個葉子節點到根結點的距離是相同的;左前綴索引,適合查詢範圍類的數據;

    可使用B-Tree索引的查詢類型:全鍵值、鍵值範圍或鍵前綴查找;

      全值匹配:精確某個值,"Jinjiao King"

      匹配最左前綴:只精確匹配起頭部分,"Jin%"

      匹配範圍值;

      精確匹配某一列並範圍匹配另外一列;

      只訪問索引的查詢;

    不適合使用B-Tree索引的場景:

      若是不從最左列開始,索引無效:(Age,Name)

      不能跳過索引中的列:(StuID,Name,Age)

      若是查詢中某個列爲範圍查詢,那麼其右側的列都沒法再使用索引優化查詢:(StuID,Name)

    Hash索引:基於哈希表實現,特別適用於精確匹配索引中的全部列;

      注意:只有Memory存儲引擎支持顯示hash索引;

    適用場景:

      只支持等值比較查詢:包括=,IN(),<=>;

    不適合使用hash索引的場景:

      存儲的非爲值的順序,所以,不適用於順序查詢;

      不支持模糊匹配;

    空間索引(R-Tree):

      MyISAM支持空間索引;

    全文索引(FULLTEXT):

      在文本中查找關鍵詞;

  索引優勢:

    索引能夠下降服務須要掃描的數據量,減小了IO次數;

    索引能夠幫助服務器避免排序和使用臨時表;

    索引能夠幫助將隨機I/O轉爲順序I/O;

  高性能索引策略:

    獨立使用列,儘可能避免其參與運算;

    左前綴索引:索引構建於字段的左側的多少個字符,要經過索引選擇性來評估

      索引選擇性:不重複的索引值和數據表的記錄總數的比值;

    多列索引:

      AND操做時更適合使用多列索引;

    選擇合適的索引列次序:將選擇性最高放左側;

  冗餘和重複索引:

    很差的索引使用策略

 

經過EXPLAIN來分析索引的有效性:

  EXPLAIN SELECT clause

    獲取查詢執行計劃信息,用來查看查詢優化器如何執行查詢;

    輸出:

      id:當前查詢語句中,每一個SELECT語句的編號;

        複雜類型的查詢有三種:

          簡單子查詢;

          用於FROM中的子查詢;

          聯合查詢:UNION;

        注意:UNION查詢的分析結果會出現一個額外匿名臨時表;

      select_type:

        簡單查詢爲SIMPLE

        複雜查詢:

          SUBQUERY:簡單子查詢;

          DERIVED:用於FROM中的子查詢 

          UNION:UNION語句的第一個以後的SELECT語句;

          UNION RESULT:匿名臨時表;

      table:SELECT語句關聯到的表;

      type:關聯類型,或訪問類型,即MYSQL決定的如何去查詢表中的行的方式;

        ALL:全表掃描;

        index:根據索引的次序進行全表掃描;若是在Extra列出現「Using index」表示了使用覆蓋索引,而非全表掃描;

        range:有範圍限制的根據索引實現範圍掃描;掃描位置始於索引中的某一點,結束於另外一點;

        ref:根據索引返回表中匹配某單個值的全部行;

        eq_ref:僅返回一個行,但與須要額外與某個參考值作比較;

        const,system:直接返回單個行;

      possible_keys:查詢可能會用到的索引;

      key:查詢中使用了的索引;

      key_len:在索引使用的字節數;

      ref:在利用key字段所表示的索引完成查詢時全部的列或某常量值;

      rows:MySQL估計爲找全部的目標行而須要讀取的行數;

      Extra:額外信息

        Using index:MySQL將會使用覆蓋索引,以免訪問表;

        Using where:MySQL服務器將在存儲引擎檢索後,再進行一次過濾;

        Using temporary:MySQL對結果排序時會使用臨時表;

相關文章
相關標籤/搜索