以下很多內容來自於網絡
用戶、權限
創建用戶
// host 用戶地址,%表示可以遠程,localhost表示本地,也可以指定具體IP
create user ‘username’@‘host’ identified by ‘password’;
然後使用grant語句賦予該用戶權限
grant all privileges on db.table to ‘username’@‘host’;
還可以直接使用grant創建語句加賦予權限
// with grant option 是將‘賦予用戶權限’的權限給該用戶,一般不加,加了的話只可以將自己有權限的表grant。
// 只有root有創建用戶的權限
grant all privileges on db.table to ‘username’@‘host’ identified by ‘password’ [with grant option];
查看用戶權限
show grants for ‘username’@‘host’;
備份
備份主要是使用mysql提供的mysqldump工具,在工作中,我們一般創建一個定時任務,每天備份我們的數據庫。
自動備份腳本
#! /bin/bash
DB_USER=“user”
DB_PWD=“pwd”
DB_NAME=“dbname”
BK_DIR="/home/mysql/backup"
BIN_DIR="/usr/local/mysql/bin"
DB_USER -p$DB_PWD $DB_NAME t_user > {DB_NAME}_$(date +%Y%m%d).sql
之後添加定時任務
crontab -e
執行後打開類似Vim的東西,添加需要執行的任務
45 11 * * * /home/mysql/shell/file_name.sh
分鐘(0-59) 小時(0-23) 幾號(1-31) 月份(1-12) 星期(0-7,0和7都是週日);
*表示任何值;使用“,”隔開多個值;使用"-"表示區間 1-5 表示1,2,3,4,5;
所以上面寫的任務表示:每天的11點45分執行後面的sh文件。
explain
使用explain + SQL,字段解釋如下:
- id,標識,表示語句執行的優先級,數字越大則越早執行,相同數字,則靠上的早執行;
- select_type,
SIMPLE:簡單SELECT(不使用UNION或子查詢)
PRIMARY:最外面的SELECT
UNION:UNION中的第二個或後面的SELECT語句
DEPENDENT UNION:UNION中的第二個或後面的SELECT語句,取決於外面的查詢
UNION RESULT:UNION 的結果
SUBQUERY:子查詢中的第一個SELECT
DEPENDENT SUBQUERY:子查詢中的第一個SELECT,取決於外面的查詢
DERIVED:導出表的SELECT(FROM子句的子查詢) - table,輸出行所用的表,爲了便於追蹤,表的別名最好可以看出來是哪個表。
- type,連接類型,按照最佳到最差排序如下,通常要求最少是range。
ystem:表僅有一行(=系統表)。這是const聯接類型的一個特例。
const:表最多有一個匹配行,它將在查詢開始時被讀取。因爲僅有一行,在這行的列值可被優化器剩餘部分認 爲是常數。const表很快,因爲它們只讀取一次!
eq_ref:對於每個來自於前面的表的行組合,從該表中讀取一行。這可能是最好的聯接類型,除了const類型。
ref:對於每個來自於前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。
ref_or_null:該聯接類型如同ref,但是添加了MySQL可以專門搜索包含NULL值的行。
index_merge:該聯接類型表示使用了索引合併優化方法。
unique_subquery:該類型替換了下面形式的IN子查詢的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一個索引查找函數,可以完全替換子查詢,效率更高。
index_subquery:該聯接類型類似於unique_subquery。可以替換IN子查詢,但只適合下列形式的子查詢中的 非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
range:只檢索給定範圍的行,使用一個索引來選擇行。
index:該聯接類型與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因爲索引文件通常比數據文件小。
ALL:對於每個來自於先前的表的行組合,進行完整的表掃描。 - possible_keys,這個的意思是可能會使用那些索引,只是可能,不是真實使用。
- key,這個才表示運行中真正使用的索引。
- key_len,索引長度
- ref,索引所在列
- rows,顯示mysql認爲要遍歷的行數。
- filtered,顯示了通過條件過濾出的行數的百分比估計值。
- extra,該列包含MySQL解決查詢的詳細信息。
Distinct: MySQL發現第1個匹配行後,停止爲當前的行組合搜索更多的行。
Not exists: MySQL能夠對查詢進行LEFT JOIN優化,發現1個匹配LEFT JOIN標準的行後,不再爲前面的的行組合在該表內檢查更多的行。
range checked for each record (index map: #):MySQL沒有發現好的可以使用的索引,但發現如果來自前面的表的列值已知,可能部分索引可以使用。
Using filesort: MySQL需要額外的一次傳遞,以找出如何按排序順序檢索行。
Using index: 從只使用索引樹中的信息而不需要進一步搜索讀取實際的行來檢索表中的列信息。
Using temporary: 爲了解決查詢,MySQL需要創建一個臨時表來容納結果。
Using where: WHERE 子句用於限制哪一個行匹配下一個表或發送到客戶。
Using sort_union(…), Using union(…), Using intersect(…): 這些函數說明如何爲index_merge聯接類型合併索引掃描。
Using index for group-by: 類似於訪問表的Using index方式,Using index for group-by表示MySQL發現了一個索引,可以用來查GROUP BY或DISTINCT查詢的所有列,而不要額外搜索硬盤訪問實際的表。
mysql調優建議
1、比較運算符儘量用"=",不要用"<>","=“有使用索引的機率
2、明知只有一條查詢結果,就使用"limit 1”
3、字段選擇合適的數據類型,能用smallint就不用int。
4、使用UNION ALL 代替 UNION,如果結果集允許重複的話
5、同樣的查詢結果,儘量保持查詢語句一致,這樣可以使用查詢緩存
6、儘量避免使用select *
7、where、join、order by語句字段儘量被索引
8、將大的DELETE,UPDATE or INSERT 查詢變成多個小查詢
數據庫一直是我的弱項,這段時間找工作體現的就更明顯了。所以~~努力,加油。
這兩篇其實是更像收集的一些筆記,後面會對mysql有比較深入的學習記錄。
~ . ~