用戶管理 查詢優化 日誌

用戶管理 查詢優化 日誌

MySQL 用戶管理

用戶賬號: username@hostname
用戶賬號管理:

 CREATE USER   創建用戶
     CREATE USER username@hostname
        [
                    IDENTIFIED BY [PASSWORD]                        'password'
        ]
     主機也可以使用通配符: create user testuser@'172.16.100.1_ _'  IDENTIFIED BY 'password'  # 表示可以使用100.100-100.199

 DROP  USER   刪除用戶
 RENAME USER   修改用戶
          RENAME USER old_user TO new_user
         [, old_user TO new_user] ...
         RENAME USER 'jeff rey'@'localhost' TO 'jeff'@'127.0.0.1';
   SET  PASSWORD  設置密碼

權限管理:

 grant  授權 
 revoke  取消權限

查看用戶能夠使用的權限:show grants for username@’hostname’

Mysql的權限類型:

   庫級別
   表級別
   字段級別
   管理類
   程序類

管理類權限

     create temporary tables 臨時表
     create user
     file 允許用戶讀或者寫某些文件
     lock tables 添加顯式鎖
     process:查看用戶的線程
     reload:相當於執行flush和reset
     replication client 查詢有哪些複製客戶端
     replication slave 賦予用戶複製權限
     show databases 查看所有數據庫
     shutdown   關閉服務
     super    

數據庫訪問權限

     alter 
     alter routine 存儲歷程
     create
     create routine 存儲過程,存儲函數
     create view
     delete
     drop
     execute
     grant option 將自己的權限複製給別的用戶
     index 索引
     show view

數據操作類權限(表級別):

    select
    insert
    update
    delete

字段級別:

   select(col1,....)
   update(col1,....)
   insert(col1,....)

所有權限:
ALL [PRIVILEGES]

GRANT

priv_type [(column_list)]
  [, priv_type [(column_list)]] ...
ON [TABLE | FUNCTION | PROCEDURE] priv_level
TO username@hostname [IDENTIFIED BY 'password'] ...
[REQUIRE ssl] [WITH with_option ...]

#object_type: 類型
        TABLE | FUNCTION | PROCEDURE

 #priv_level:  級別 

            * | *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_name

 #user_specification: 給用戶和密碼的
  user
  [
    IDENTIFIED BY [PASSWORD] 'password'
  | IDENTIFIED WITH auth_plugin [AS 'auth_string']
   ]

    #ssl_option: 設置默認連接方式
            SSL

  #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 [TABLE | FUNCTION | PROCEDURE] priv_level
FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user [, user] ...

REVOKE PROXY ON user
FROM user [, user] ...

*幾個跟用戶授權相關的表:
db:庫級別的權限
host:主機級別權限,已廢棄
tables_priv:表級別權限
colomns_priv:列級別的權限
procs_priv:存儲過程和存儲函數相關的權限
proxies_priv:代理用戶權限·*

練習:

1、授權testuser能夠通過172.16.0.0/16網絡內的任意主機訪問當前mysql服務器的權限

 grant alter on *.* to 'testuser'@'172.16.%.%' identified by 'password'

2、讓此用戶能夠創建和刪除testdb數據庫,及庫中的表

    grant create,drop on testdb.* to 'testuser'@'172.16.%.%';

3、讓此用戶能夠在testdb庫中的t1表中執行查詢、刪除、更新和插入操作

    grant select,update,insert,delect on testdb.t1 to 'testuser'@'172.16.%.%'

4、讓此用戶能夠在testdb庫上創建和刪除索引

       grant index,drop index on testdb to 'testuser'@'172.16.%.%';

5、讓此用戶能夠在testdb.t2表上查詢id和name字段,並允許其將此權限傳授予其他用戶

        grant select(id,name) on testdb.t2 to 'testuser'@'172.16.%.%'
        grant grant option on testdb.t2 to 'testuser'@'172.16.%.%'

MySQL查詢緩存

用於保存MySQL查詢語句返回的完整結果。被命中時,MySQL 會立即返回結果,省去了解析,優化和執行等階段

如何檢查緩存

MySQL保存結果於緩存中:
     把select語句本身做hash計算,計算的結果作爲key,查詢結果作爲value

什麼樣的語句不會被緩存

   查詢語句中有一些不確定數據時,不會緩存,列如NOW(),CURRENT_TIME(),一般來說,如果查詢中包含用戶自定義函數,存儲函數,用戶變量,臨時表,mysql庫中系統表,或者任何包含權限的表,一般不會緩存

緩存會帶來額外開銷

    1、每個查詢都會先檢查是否命中
    2、查詢結果要先緩存

  mysql> show global variables like 'query_cache%';
        +------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 16777216 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+

 query_cache_type : 查詢緩存類型:是否開啓緩存個功能,開啓方式有三種{ON|OFF|DEMAND};
            DEMAND: 意味着SELECT語句明確使用SQL_CACHE 選項時纔會緩存

query_cache_size : 緩存時的總空間,單位爲字節,大小必須是1024的整數倍,MySQL啓動時,會一次分配並立即初始化這裏指定大小空間,如果修改此大小,會清空緩存並重新初始化的

query_cache_min_res_unit:存儲緩存的最小內存塊 緩存空間-剩餘空間/緩存個數

query_cache_limit:單個緩存對象的最大值,超出時則不預緩存,手動使用SQL_NO_CACHE可以人爲的避免嘗試緩存返回超出此參數限定值得語句

query_cache_wlock_invalidate:如果某個表被其他用戶連接鎖住了,是否仍然從緩存中返回結果,OFF表示返回   

*如何判斷命令率(次數)

    mysql> show global status like 'Qcache%';
    +-------------------------+----------+
    | Variable_name           | Value    |
    +-------------------------+----------+
    | Qcache_free_blocks(空閒塊數)      | 1        |
    | Qcache_free_memory(空閒空間)      | 16759688 |
    | Qcache_hits(命中次數)             | 0        |
    | Qcache_inserts(向緩存空間中插入的緩存的次數)          | 0        |
    | Qcache_lowmem_prunes(內存太小,修剪內存的次數)    | 0        |
    | Qcache_not_cached(沒被緩存的個數)       | 8        |
    | Qcache_queries_in_cache(緩存中緩存的查詢個數) | 0        |
    | Qcache_total_blocks(總塊數)     | 1        |
    +-------------------------+----------+

碎片整理 flush query_cache
清空緩存 reset query_cache

計算命中率

       show global status where Vaiable_name='Qcache_hits' OR Variable_name='Com_Select';
     Qcache_hits/(Qcache_hits+Com_Select)

     也可以參考另外一個指標,命中和寫入的比率,即Qcache_hits/Qcache_inserts的值,此比值如果能大於3:1.則表明緩存也是有效的,能達到10:1,爲比較理想的情況

緩存優化思路

    1.批量寫入,而非多次單個寫入
    2.緩存空間不宜過大,因爲大量緩存同時失效時會導致服務器假死
    3.必要時,使用sql_CACHE和sql_no_cache手動控制緩存。
    4.對寫密集型的應用場景來說,禁用緩存反而提高性能。

MySQL日誌

查詢日誌

          log:{ON|oFF}:是否記錄所有語句的日誌信息於一般查詢日誌文件(general_log)
          log_output={TABLE|FILE|NONE}
               table和file 可以同時出現,用逗號分隔即可
          general_log:是否啓用查詢日誌

          general_log_file:定義了一般查詢日誌保存的文件

慢查詢日誌:查詢執行時長超過指定時長的查詢

      slow_query_log={ON|OFF}
           是否啓用慢查詢日誌,它的輸出位置也取決
    log_output={table|file|none}
           slow_query_log_file:www-slow.log
             定義慢查詢日誌的文件
           long_query_time : 10.00000 慢查詢的時間
           long_slow_filter: 不記錄慢查記錄

錯誤日誌:

            服務器啓動和關閉過程中的信息;
            服務器運行過程中的錯誤信息
            事件調度器運行一個事件時產生的信息
            在複製架構中的從服務器上啓動從服務器線程時產生的信息
            log_error = /path/to/error_log_file
            log_warnings = {1|0}
        是否記錄警告信息保存至錯誤日誌中

二進制日誌:修改相關的操作,用來實現複製的憑據

           時間點恢復
           複製

中繼日誌:從服務器上的二進制日誌
事務日誌:將隨機I/O轉換爲順序I/O ACID :持久性

日誌文件組:至少要存在兩個,實現輪詢
注意:儘可能使用小事務來替代大事務來提升事務引擎的性能

發佈了43 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章