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對結果排序時會使用臨時表;