ALTER TABLE <舊錶名> RENAME [TO] <新表名> ALTER TABLE <表名> MODIFY <字段名> <數據類型> ALTER TABLE <表名> MODIFY <字段1> <數據類型> FIRST |AFTER <字段2> ALTER TABLE <表名> CHANGE <舊字段名> <新字段名> <新數據類型> ALTER TABLE <表名> ADD <新字段名> <數據類型> [約束條件] [FIRST |AFTER 已存在的字段名] ALTER TABLE <表名> DROP <字段名> ALTER TABLE <表名> DROP FOREGIN KEY <外鍵約束名> ALTER TABLE <表名> ENGINE=** DROP TABLE <表名>
CREATE TABLE table_name [col_name data_type] [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name](col_name [length]) [ASC|DESC] 惟一索引|全文索引|空間索引 索引名字 ALTER TABLE table_name ADD [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name](col_name [length]) [ASC|DESC] -- alter table t6 add fulltext index infosuoyin(info) ALTER TABLE table_name DROP [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] -- alter table t6 drop fulltext index infosuoyin -- drop fulltext index infosuoyin on t6
show create table -- 查看錶結構 MARIADB 容許不嚴格的語法:任何標點符號均可以用做日期部分之間的間隔符 例如:98-11-31、98.11.31、98/11/11、98@11@31是等價的,均可以正確插入到數據庫
ABS(-33.3) -- 絕對值 PI() -- 3.14159 SQRT(49) -- 算術平方根 MOD(45.5,6) -- 求餘數 CEIL(-3.35) -- 返回不小於x的最小整數值,向下取整 CEILING(-3.35) -- 返回不大於x的最小整數值,向上取整 FLOOR(-3.35) -- 返回最大整數值 RAND() -- 隨機一個值 0~1, 當含有參數不變x,rand(x)屢次依然是同一個結果 ROUND(x) -- 四捨五入 ROUND(x,y) -- 四捨五入到y位小數點 TRUNCATE(x,y) -- 捨棄小數 (1.99,1--->1.9;1.99,0--->1;1.99,-1--->0) SIGN(X) -- 符號函數 負0正分別對應-1,0,1 POW(X,Y) -- 冪函數 x^y POWER(X,Y) -- 冪函數 x^y EXP(X) -- 返回e的x次方 LOG(X) -- 求對數 x是整數,不然返回NULL LOG10(X) -- 求對數 RADIANS(X) -- 角度轉弧度 DEGREES(X) -- 弧度轉角度 SIN(x) -- x是弧度值 ASIN(x) -- 反正弦 x=[-1,1] COS(X) -- x是弧度值 ACOS(X) -- 反餘弦 x=[-1,1] TAN(X) -- x是弧度值 ATAN(X) -- 反正切 x=[-1,1] COT(X) -- x是弧度值
CHARACTER_LENGTH(str) -- 返回字符串長度 # 預編碼方式有關 LENGTH(str) -- 返回字節長度 # 預編碼方式有關 CONCAT(str1,str2,...) -- 字符串拼接,只要有NULL就返回null CONCAT_WS(separator,str1,str2,...) -- 字符串拼接,只要有NULL就返回null,只不過能夠指定以什麼拼接 INSERT(str,pos,len,newstr) -- 字符串替換,pos確實有,不然返回原值 LOWER(str) -- 小寫 LCASE(str) -- 小寫 UPPER(str) -- 大寫 UCASE(str) -- 大寫 LEFT(S,N) -- 返回字符串s開始的最左邊n個字符 RIGHT(S,N) -- 返回字符串s開始的最右邊n個字符 LPAD(str,len,padstr) -- 左填充字符串 '_____aaaa' RPAD(str,len,padstr) -- 右填充字符串 'aaaa_____' LTRIM(str) -- 去除字符串左邊空格 RTRIM(str) -- 去除字符串右邊空格 TRIM( [remstr FROM] ' asdsad ') -- 去除指定字符串 REPEAT(S,N) -- S重複n次 SPACE(N) -- 返回一個有n個空格的字符串 REPLACE(str,from_str,to_str) -- 替換指定字符 STRCMP(expr1,expr2) -- 比較2個字符串大小,返回-1,0,1 SUBSTRING(str pos len) -- pos開始位置;支持負數,len爲長度 MID(str pos len) -- pos開始位置;支持負數,len爲長度;若是len小於1;返回空字符串 LOCATE(substr,str) -- 返回substr在str中開始的位置 POSITION(substr IN str) -- 返回substr在str中開始的位置 INSTR(str,substr) -- 返回substr在str中開始的位置 REVERSE(str) -- 反轉字符串 ELT(N,str1,str2,str3,...) -- 返回字符串strn FIELD(str,str1,str2,str3,...) -- 返回str在參數中第一次出現的位置 FIND_IN_SET(str,strlist) -- str在strlist的位置, strlist每一個子字符串以,分割 MAKE_SET(bits,str1,str2,...) -- 由二進制數指定相應位置的字符串組成的字符串
CURRENT_DATE() -- 當前時間 YYYY-MM-DD 或YYYYMMDD CURDATE() -- 同上 CURRENT_TIMESTAMP() -- 日期和時間 YYYY-MM-DD HH:MM:SS 或YYYYMMDDHHMMSS LOCALTIME() -- 同上 NOW() -- 同上 SYSDATE() -- 同上 UNIX_TIMESTAMP(date) -- 時間戳,能夠指定一個日期字符串 FROM_UNIXTIME() -- 與上相反 UTC_DATE() -- UTC日期 UTC_TIME() -- UTC時間 MONTH(date) -- 從字符串中獲取月份 MONTHNAME(date) -- 從字符串中獲取英文月份 WEEKNAME(date) -- 從字符串中獲取英文周幾 WEEKDAY(date) -- 從字符串中獲取周幾 DAYNAME(date) -- 從字符串中獲取英文周幾 DAY(date) -- 從字符串中獲取天數 YEAR(date) -- 從字符串中獲取年數 QUARTER(date) -- 從字符串中獲取季度值 1-4 MONTHNAME(date) -- 從字符串中獲取英文月份 MONTHNAME(date) -- 從字符串中獲取英文月份 MONTHNAME(date) -- 從字符串中獲取英文月份 MINUTE(time) -- 對應的分鐘數 SECOND(time) -- 對應的秒數 WEEK(D) -- 日期d是一年中的第幾周 WEEKOFYEAR(D) -- 某天位於一年周的第幾周 至關於week(d,3) DAYOFYEAR(D) -- 某天位於一年周的第幾天 DAYOFMONTH(D) -- 某天位於一月周的第幾天 EXTRACT(unit FROM datetime) -- 提取一部分日期 EXTRACT(YEAR_MONTH FROM '2011-07-12 01:02:03') ----->>201107 TIME_TO_SEC(TIME) -- 轉換成秒值 小時*3600+分鐘*60+秒值 SEC_TO_TIME(TIME) -- 相反 -- 日期加操做 DATE_ADD(date,INTERVAL expr unit) -- ADDDATE('2010-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND) ADDDATE(date,INTERVAL expr unit) ADDTIME(expr1,expr2) -- 日期減操做 SUBDATE(date,INTERVAL expr unit) DATE_SUB(date,INTERVAL expr unit) SUBTIME(expr1,expr2) DATEDIFF(expr1,expr2) -- 兩個日期之間的間隔天數 expr1 - expr2 DATE_FORMAT(date,format) -- 根據format指定的格式顯示date值 說明符 說明 %a 工做日的縮寫名稱(Sun..Sat) %b 月份的縮寫名稱(Jan..Dec) %c 月份,數字形式0..12 %D 帶有英語後綴的該月日期 %d 該月日期00..31 %e 該月日期0..31 %f 微秒000000..999999 %H 小時00..23 %h,%I 小時01..12 %i 分鐘00..59 %j 天數001..366 %k 小時0..23 %l 小時0..12 %M 月份名稱January..December %m 月份00..12 %p 上午AM 下午PM %r 時間,12小時制 hh:mm:ss AM/PM %S,%s 秒 00..59 %T 時間,24小時制 hh:mm:ss %U 一年中的第幾周 週日爲第一天 00..53 %u 一年中的第幾周 週一爲第一天 00..53 %W 工做日名稱 週日..週六 %w 一週中的每日 0=週日 %Y 4位數形式年份 %y 2位數年份 %% %字符 GET_FORMAT(val_type,format_type) -- 返回日期時間字符串的顯示形式 -- DATE_FORMAT('2000-10-25 22:23:00',GET_FORMAT({DATE|TIME|DATETIME}, {'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL'})) 一些組合 類型 格式化類型 顯示格式字符串 DATE EUR %d.%m.%Y DATE INTERVAL %Y%m%d DATE ISO %Y-%m-%d DATE JIS %Y-%m-%d DATE USA %m.%d.%Y TIME EUR %H.%i.%s TIME INTERVAL %H%i%s TIME ISO %H:%i:%s TIME JIS %H:%i:%s TIME USA %h:%i:%s %p DATETIME EUR %Y-%m-%d %H.%i.%s DATETIME INTERVAL %Y%m%d %H%i%s DATETIME ISO %Y-%m-%d %H:%i:%s DATETIME JIS %Y-%m-%d %H:%i:%s DATETIME USA %Y-%m-%d %H.%i.%s
IF(expr,v1,v2) -- v2 if(expr) v1 IFNULL(V1,V2) -- v2 if(v1==NULL) v1
VERSION() -- 版本號 CONNECTION_ID() -- 服務器當前鏈接的次數 SHOW PROCESSLIST -- 用戶鏈接信息,和用戶權限有關 已查詢爲例:可能會通過Copying to map table ;Sorting result ;sending data 等狀態才能夠完成 DATABASE(),SCHEMA() -- 返回使用utf8字符集的當前數據庫名 USER() -- 被驗證的用戶名和 主機名組合 CURRENT_USER() SYSTEM_USER() SESSION_USER() CHARSET(str) -- 返回字符串str自變量的字符集 CONVERT(str USING transcoding_name) -- 用什麼字符集編碼 LAST_INSERT_ID() -- 返回最後一個insert或update爲auto_increment列設置的第一個發生的值, --(當一次性操做多個,返回第一個) PASSWORD(str) -- 加密,str不可爲空;不該將它用於我的程序中;加密不可逆; MD5(str) -- 加密,str不可爲空;不該將它用於我的程序中;加密不可逆; 32位16進制 ENCODE(str,pass_str) -- pass_str 至關於鹽,str須要加密的 DECODE(crypt_str,pass_str) -- pass_str 至關於鹽,cryptstr須要解密的 FORMAT(X,D) -- 格式化函數,四捨五入數字用的 CONV(N,from_base,to_base) -- 進制轉換 N 從from_base進制轉化爲to_base進制 INET_ATON('192.168.1.1') -- 將ip對應的字符串轉化爲對應的10進制 INET_NTOA(3232235777) -- 與上邊相反 GET_LOCK(str,timeout) -- 加鎖;成功1;超時0;錯誤null RELEASE_LOCK(str) -- 解鎖; IS_FREE_LOCK(str) -- 判斷是否可用 IS_USED_LOCK(str) -- 是否在被使用 BENCHMARK(count,expr) -- 重複count次執行expr表達式,報告的時間是客戶端通過的時間,問不是服務端的CPU時間, -- 每次報告的時間並不必定是相同的 CAST(expr AS type) -- 將一個類型的值轉換爲另外一個類型的值 CONVERT(expr,type) -- BINARY,CHAR,DATE,TIME,DATETIME,DECIMAL,SIGNED,UNSIGNED
5 select 1 from 2 where =;!=;>;>=;<;<=; x in [] x between a and b; x is NULL (and ;or) x REGEXP '^be' x like '%_*' 3 group by …… with rollup -- 在顯示時候會多添加一行數據(統計了多少行數據) 4 having 6 order by 7 limit [位置偏移量,] 行數 SELECT nid,count(*),GROUP_CONCAT(sid) from test GROUP BY nid ------------子查詢 ALL,SOME -- 關鍵字,在匹配的時候只要知足內層子查詢的任何一個比較條件,就會返回一個結果做爲外層查詢條件 -- where num1 > any (select num2 from tb12) ALL -- 關鍵字,在匹配的時候知足內層子查詢的全部比較條件,就會返回一個結果做爲外層查詢條件 -- where num1 > all (select num2 from tb12) EXISTS -- 關鍵字,在匹配的時候只要內層子查詢查詢到了數據,就繼續外層查詢,不然終止 -- where exists (select num2 from tb12 where id = 107) IN -- 關鍵字,在匹配的時候知足內層子查詢的條件,就會返回一個結果做爲外層查詢條件 -- where num1 IN (select num1 from tb12 where f_id = '123sadasd') = -- 關鍵字,在匹配的時候知足內層子查詢的條件,就會返回一個結果做爲外層查詢條件 -- where num1 = (select num1 from tb12 where f_id = '123sadasd')
insert into persion(id,name,age,info) select id,name,age,info from persion_old; update table set cloumn = xxx where (condition) delete from table where (condition)
索引是一個單獨的、存儲在磁盤上的數據庫結構,它們包含着對數據表裏全部記錄的引用指針。 使用索引用於快速找出某個或多個列中有一特定值的行,全部mariadb列類型均可以被索引,對相關列使用索引是提升查詢操做速度的最佳途徑。 索引分類: 普通索引、惟一索引 單列索引、組合索引 組合索引遵循最左前綴集合 全文索引 char、varchar、text類型建立 只有Myisam引擎支持 空間索引 對空間數據類型的字段創建的索引;GEOMETRY、POINT、LINESTRING、POLYGON, mariadb使用SPATIAL關鍵字進行擴展,使得可以進行建立正規索引相似的語法建立空間索引。建立空間索引的列,必須將其聲明爲Not Null,空間索引只能在存儲引擎爲MyIsam的表中建立 建立索引的原則 1、索引並不是越多越好,一個表中若有大量的索引,不只佔用磁盤空間,並且也會影響insert、delete、update等語句的性能,由於當表中的數據更改的同時,索引也會進行調整和更新 2、避免對常常更新的表進行過多的索引,而且索引中的列儘量少。而對常常用於查詢的字段應該建立索引,但要避免添加沒必要要的字段 3、數據量小的表最好不要使用索引,因爲數據少,查詢花費的時間可能比遍歷索引的時間還要短,索引可能不會產生優化效果 4、在條件表達式中常常用到的不一樣值較多的列上建立索引,在不一樣值不多的列上不要創建索引。好比‘男,女’就無需建立索引 5、當惟一性是某種數據自己的特徵時,指定惟一索引,使用惟一索引需能確保定義的列的數據完整性,以提升查詢速度 6、在頻繁進行排序或分組(group by 或order by)的列上建立索引,若是待排序的列有多個,能夠在這些列上創建組合索引
------ 存儲過程 CREATE PROCEDURE sp_name([[IN|OUT|INOUT] param_name type]) [characteristices ...] rountine_body -- DELIMITER // CREATE PROCEDURE avgf() BEGIN SELECT AVG( DISTINCT nid) AS XX FROM test; END; -- DELIMITER // ------ 存儲函數 -- 若是return 的類型和returns不同將會被強制轉換 -- DELIMITER // CREATE FUNCTION NameByZip() RETURNS CHAR(50) RETURN (SELECT nid FROM test WHERE sid = 1); -- DELIMITER // ------- 如何調用 -- xxxxx(in sid INT,OUT SNA CHAR(50),) call xxxxx(101,@num) select @num show {procedure|function} status like 'C%'\G ------ 在存儲過程當中定義變量 DECLARE var_name[,var_name]... date_type [default value]; SET var_name=expr [,var_name=expr] --------------- declare xxx char(50); select nid into xxx from test where id =1; --------------- ------ 光標的使用 只能在存儲過程和函數使用 查詢語句可能返回多條記錄,若是數據量很大,須要在存儲過程和存儲函數中使用光標來逐條讀取查詢結果集中的記錄 -- 聲明遊標 DECLARE cursor_name CURSOR FOR select_statement; DECLARE cursor_fruit CURSOR FOR SELECT f_name,f_price FROM fruits; -- 打開遊標 OPEN cursor_fruit; -- 使用光標 declare name char(50); declare price int(50); FETCH cursor_fruit into name,price; -- 關閉光標 CLOSE cursor_fruit; ------ 流程控制 if if val is null then select 'val is null' else select 'val is not null' end if case CASE 2 WHEN 1 THEN 'ASD' WHEN 2 THEN "ASD" ELSE 'XZCAFD' END CASE CASE WHEN 1 THEN 'ASD' WHEN 2 THEN "ASD" ELSE 'XZCAFD' END CASE loop -- 重複執行某些語句 DECLARE id int DEFAULT 0; loop_name:loop set id = id +1; INSERT into test VALUE(id,id,id); if id >=1000000 then leave loop_name; end if ; end loop loop_name; leave 常與loop聯用 iterate iterate label 將執行語句順序轉到語句段開頭處; 只能夠出如今loop\repeat\while語句內 iterate:再次循環 label:循環的標誌 repeat -- 重複執行循環過程 DECLARE id int DEFAULT 0; repeat_name:repeat set id = id +1; until id >=10 end repeat repeat_name; while -- 重複執行循環過程 DECLARE id int DEFAULT 0; while id<10 do set id = id +1; end while;
視圖是一個虛擬表 視圖的做用: 簡單化 看到的就是須要的,那些常常被使用的查詢能夠被定義爲視圖,從而使得沒必要爲之後的操做每次指定所有的條件。 安全性 經過視圖用戶只能查看和修改他們所能看到的數據。數據庫中其餘的數據則即看不見也取不到,數據庫受權能夠將檢索權限限制到db上,但不能限制到數據庫特定行和列上,經過視圖,
用戶被限制在數據的不一樣子集上 邏輯數據獨立性 視圖能夠幫助用戶屏蔽真實表結構變化帶來的影響 CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED|MERGE|TEMPTABLE}] VIEW view_name [(column_list)] AS SELECT_STATEMENT [WITH [CASCADED|LOCAL] CHECK OPTION] -- view_name,默認在當前數據庫下建立,如需明確數據庫:db_name.view_name -- column_list 替換查找的列的名字 -- REPLACE 是否替換已經建立的視圖 -- ALGORITHM視圖選擇的算法 -- 自動選擇算法、視圖語句於視圖定義合併起來,使得試圖定義的某一部分取代語句對應的部分、視圖的結果存入臨時表, -- 而後用臨時表來執行語句 -- [WITH [CASCADED|LOCAL] CHECK OPTION] 視圖在更新時保證在視圖的權限範圍以內 -- 默認CASCADE更新視圖時要知足全部相關視圖和表的條件 -- LOCAL更新視圖時知足該視圖自己定義的條件便可 --涉及到的權限 -- 建立視圖的權限 -- select的權限 -- 當有replace時,還要有對視圖drop的權限 DESCRIBE 視圖名 DESC 視圖名 show table status 視圖名 show create view 視圖名 SELECT * FROM information_schema.VIEWS -- 存儲了全部視圖的定義 -------------修改視圖 1、利用建立視圖時的OR REPLACE 參數 2、ALTER語句 ALTER [ALGORITHM = {UNDEFINED|MERGE|TEMPTABLE}] VIEW view_name [(column_list)] AS SELECT_STATEMENT [WITH [CASCADED|LOCAL] CHECK OPTION] -------------更新視圖 UPDATE view_name set field_name = 5; DELETE FROM view_name WHERE price = 5; -- 操做以後對應的原表的數據也會修改 當視圖中包含有以下內容時,視圖的更新操做將不能被執行 視圖中不包含基表中被定義爲非空的列 在定義視圖的select語句後的字段列表中使用了數學表達式 在定義視圖的select語句後的字段列表中使用了聚合函數 在定義視圖的select語句後的字段列表中使用了DISTINCT、UNION、TOP、GROUP BY或HAVING 子句 -------------刪除視圖 DROP VIEW [IF EXISTS] view_name [,view_name]... [RESTRICT|CASCADE] MARIADB 中視圖和表的區別以及聯繫是什麼? 二者的區別: 1、視圖是已經編譯好的sql語句,是基於sql語句的結果集的可視化的表,而表不是。 2、視圖沒有實際的物理記錄,而表有 3、表是內容,視圖是窗口 4、表佔用物理空間而視圖不佔用物理空間,視圖只是邏輯概念的存在,表能夠及時對他進行修改,但視圖只能用建立的語句來修改。 5、視圖是查看數據表的一種方法,能夠查詢數據表某些字段構成的結構,只是一些SQL語句的集合,從安全的角度來講,視圖能夠防止用戶接觸數據表,於是用戶不知道表結構 6、表屬於全局模式中的表,是實表;視圖是屬於局部模式的表,是虛表; 7、視圖的創建和刪除隻影響試圖自己,不影響對應的基本表 二者的聯繫: 視圖是在基本表之上創建的表,它的結構和內容都來自基本表,它依據基本表存在而存在。一個視圖能夠對應一個基本表,也能夠對應多個基本表。視圖是基本表的抽象和在邏輯意義上創建的新關係。
觸發器是個特殊的存儲過程,不一樣的是,執行存儲過程要使用call語句來調用,而觸發器的執行不須要使用call語句來調用,也不須要手工啓動, 只要當一個預約義的事件發生的時候,就會被自動執行。好比對某張表增刪改的時候。 能夠包含複雜的sql語句,能夠查詢其餘表,主要用於知足複雜的的業務規則或要求 應用場景: 根據客戶當前的帳戶狀態,控制是否容許插入新菜單。 -- 建立觸發器 CREATE TRIGGER trigger_name trigger_time trigger_event ON TABLE1 FOR EACH ROW trigger_stmt -- trigger_name 觸發器名稱 -- trigger_time 觸發器時機 after|before -- trigger_event 觸發器事件 insert|delete|update -- trigger_stmt 觸發器程序體 -- 觸發觸發器 實例1: CREATE TABLE account(account_num int,amount decimal(10,2)) CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum =@sum + NEW.amount; set @sum = 0; insert into account value(1,2); select @sum; 實例2: 當程序體比較複雜是使用 DELIMITER // CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW BEGIN ...... END; DELIMITER // -- 查看觸發器 觸發器是指查看數據庫中已存在的觸發器的定義,狀態,信息和語法信息等. 1、SHOW TRIGGERS 2、在triggers表中查看信息 SELECT * FROM information_schema.TRIGGERS ; -- 刪除觸發器 DROP TRIGGER [schema_name.]trigger_name
mysql數據庫下的user表 CREATE TABLE `user` ( -- 用戶列 `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', `User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '', `Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '', -- 權限列 `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Repl_slave_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Repl_client_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Create_user_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Create_tablespace_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Delete_history_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', -- 安全列 `ssl_type` enum('','ANY','X509','SPECIFIED') CHARACTER SET utf8 NOT NULL DEFAULT '', -- 加密 `ssl_cipher` blob NOT NULL, -- 加密 `x509_issuer` blob NOT NULL, -- 標識用戶 `x509_subject` blob NOT NULL, -- 標識用戶 -- 資源控制列:一旦超出,封鎖一小時,也可使用GRANT更新 `max_questions` int(11) unsigned NOT NULL DEFAULT 0, -- 用戶每小時容許的查詢次數 `max_updates` int(11) unsigned NOT NULL DEFAULT 0, -- 用戶每小時容許的更新次數 `max_connections` int(11) unsigned NOT NULL DEFAULT 0, -- 用戶每小時容許的鏈接操做次數 `max_user_connections` int(11) NOT NULL DEFAULT 0, -- 用戶容許同時創建的鏈接次數 -- 安全列 `plugin` char(64) CHARACTER SET latin1 NOT NULL DEFAULT '', -- 驗證用戶身份 `authentication_string` text COLLATE utf8_bin NOT NULL, `password_expired` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `is_role` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `default_role` char(80) COLLATE utf8_bin NOT NULL DEFAULT '', `max_statement_time` decimal(12,6) NOT NULL DEFAULT 0.000000, PRIMARY KEY (`Host`,`User`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges'; mysql數據庫下的db表和host表 db儲存了用戶對某個數據庫的操做權限,決定用戶能從哪一個主機存取哪一個數據庫 host存儲了某個主機對數據庫的操做權限,力度更細 mariadb命令參數 -h 主機名 -u 用戶名 -p 密碼 -P 端口 數據庫名:在命令最後能夠指定數據庫名 -e 能夠執行sql語句 -- create 建立的用戶沒有任何權限,還要用grant授予權限 -- 在user表添加記錄; CREATE USER 'ROOT'@'localhost' IDENTIFIED BY 'PASSWORD' -- 明文 CREATE USER 'ROOT'@'localhost' IDENTIFIED BY PASSWORD '哈希值' -- 也可使用對應的哈希值 內置的password()函數生成 CREATE USER 'ROOT'@'localhost' IDENTIFIED WITH my_auth_plugin; --基於插件登陸的 -- grant: -- 在user表添加記錄; GRANT PRIVILEGES ON db_name.table_name TO user@host [IDENTIFIED BY 'PASSWORD'][,IDENTIFIED BY 'PASSWORD'] [WITH GRANT OPTION] -- PRIVILEGES 用戶的權限類型 -- db_name.table_name 用戶權限所做用的表 -- GRANT 爲新建立的用戶授予GRANT權限 例子:GRANT SELECT,UPDATE,DELETE,ADD ON *.* TO user@host IDENTIFIED BY 'testpwd' User表中的user和host字段區分大小寫,在查詢的時候須要指定正確的用戶名稱或者主機名 -- 直接操做用戶表 use mysql; INSERT INTO mysql.`user`(Host,User,Password,[PRIVILEGES]) VALUES('host','username',PASSWORD('password'),PRIVILEGES_list)); --刪除用戶 drop USER user[,user]; -- user : 'user'@'localhost' delete from mysql.user where host='user'@'localhost' and user = 'xxx'; -- 更改密碼 mysqladmin -u usernmae -h localhost -p password 'new_pwd' update mysql.user set password=password('new_pwd') where User = username and Host = 'xxxx' set password=password('new_pwd') -- root 修改其餘用戶的密碼 set password for 'root'@'localhost' = password('new_pwd') update mysql.user set password=password('new_pwd') where User = username and Host = 'xxxx' GRANT USAGE ON *.* TO ''@'' IDENTIFIED BY 'new_pwd' 修改完密碼後:FLUSH PRIVILEGES 從新加載用戶權限 -- root用戶丟失密碼 -- 使用--skip-grant-tables win: 切換到安裝目錄 mysqld --skip-grant-tables mysqld-nt --skip-grant-tables linux: mysqld_safe --skip-grant-tables user=mysql /etc/init.d/mysql start-mysqld --skip-grant-tables -------權限 GRANT ALL ON *.* REVOKE ALL ON *.* GRANT ALL ON db_name.* REVOKE ALL ON db_name.* GRANT ALL ON db_name.table_name REVOKE ALL ON db_name.table_name SHOW GRANT FOR ''@'' --訪問控制 1、鏈接覈實階段 基於mysql.USER (Host,User,Password)三個字段驗證用戶信息 2、請求覈實階段 判斷有沒有對應的權限
-- 一個數據庫 mysqldump -u user -h host -ppassword dbname[table_name,] >filename.sql # shell/cmd管理員運行 mysqldump -u root -h localhost -p1234 mysql >filename.sql -- 多個數據庫 mysqldump -u user -h host -ppassword --databses [dbname,] >filename.sql -- 全部數據庫 mysqldump -u user -h host -ppassword --all-databses >filename.sql mysql -u root -p --html --execute="select * from account;" sad >123.html -- 直接複製目錄 中止Mariadb服務 win: C:\Program Files\MariaDB 10.3\data linux: /var/lib/mysql 對InnoDB存儲引擎的表不適用 -------------------------------------------------------數據還原-------------------------------------------------------- 1、mysql -u user -p [dbname] <filename.sql 2、登陸以後選擇好要回復的數據庫 source .....\123.sql -------------------------------------------------------數據遷移-------------------------------------------------------- mysqldump -h 193.112.27.149 -u root -ppassword dbname | mysql -h 192.168.1.2 -u root -ppassword mysqldump -h 193.112.27.149 -u root -ppassword --all-databases | mysql -h 192.168.1.2 -u root -ppassword -------------------------------------------------------表的導入導出-------------------------------------------------------- SELECT ... INTO OUTFILE [OPTIONS] -- OPTIONS FIELDS TERMINATED BY ',' -- 字段之間的分割符,默認\t [OPTIONALLY] ENCLOSED BY ',' -- 字段的包圍字符只能爲單個字符;若是設置OPTIONALLY,只有char/varchar被包括 ESCAPED BY '\"' -- 寫入和讀取特殊字符,及設置轉義字符 默認\ LINES STARTING BY '\'' -- 每行數據的開頭的字符 TERMINATED BY '\r\n' -- 每行數據的結束的字符 用mysqldump導出文本文件 mysqldump -T path -u root -p dbname [tables] [options] -- options --field-terminated-by=value -- 字段之間的分割符,默認\t --field-enclosed-by=value -- 字段的包圍字符 --field-optionally-enclosed-by=value -- 字段的包圍字符只能爲單個字符;若是設置OPTIONALLY,只有char/varchar被包括 --lines-escaped-by=value -- 寫入和讀取特殊字符,及設置轉義字符 默認\ --lines-terminated-by=value -- 每行數據的結束的字符
錯誤日誌:記錄服務的啓動、運行、中止時出現的問題 查詢日誌:記錄創建的客戶端鏈接和執行的語句 -- 開啓,消耗性能 二進制日誌:記錄全部更改數據的語句,能夠用於數據複製 慢查詢日誌:記錄全部執行時間超過long_query_time的全部查詢或不使用索引的查詢 -- 開啓,消耗性能 -- C:\Program Files\MariaDB 10.3\data [mysqld] log-bin [='path/[filename]'] expire_logs_days=10 -- 清楚過時日誌的事件 max_binlog_size=100M -- 單個文件的大小限制 -- 查詢日誌設置 SHOW VARIABLES LIKE 'log_%' --查看二進制文件列表 SHOW BINARY LOGS; --查看二進制文件 mysqlbinlog C:\Program Files\MariaDB 10.3\data\logs.000001 -- 刪除全部二進制文件 RESET MASTER -- 刪除指定日誌文件 PURGE {MASTER|BINARY} LOGS TO 'log_name' PURGE {MASTER|BINARY} LOGS BEFORE 'date' -- 利用二進制數據還原數據 mysqlbinlog [option] filename |mysql -uuser -ppass --start-date --stop-date --start-position --stop-position 例子: mysqlbinlog --stop-date='2014-03-30 15:27:48' C:\Program Files\MariaDB 10.3\data\logs.000001 |mysql --uuser -ppass SET sql_log_bin = {0|1} -- 暫停|開啓二進制記錄 -- 錯誤日誌 log-error [=path / [file_name]] SHOW VARIABLES LIKE 'log_error' -- 刪除和重建錯誤日誌 mysqladmin -u root -p flush-logs 或者登陸客戶端之後:flush logs; -- 查詢日誌 log[ =path/[filename]] -- 刪除和重建查詢日誌 mysqladmin -u root -p flush-logs -- 慢日誌 log-slow-queries[=path/[filename]] long_query_time=3 -- 超過3秒
1、找出系統的瓶頸,提升數據總體的性能 2、須要合理的結構設計和參數調整,以提升用戶操做響應的速度;同時還要儘量節省系統資源,以便系統能夠提供更大負載的服務 方案: 減少系統瓶頸 減小資源的佔用 增長系統的反應速度 提升負載能力 優化表結構,索引,查詢語句等 SHOW STATUS; Connections -- 鏈接服務器的次數 Uptime -- 服務器的上線時間 Slow_queries -- 慢查詢的次數 Com_select -- 查詢操做的次數 Com_insert -- 插入操做的次數 Com_update -- 更新操做的次數 Com_delete -- 刪除操做的次數 --- 查看語句的性能 EXPLAIN [EXTENDED] SELECT * FROM test WHERE id > 22; mysql> EXPLAIN extended SELECT * FROM test where id > 222; +----+-------------+-------+------+---------------+------+---------+------+-------+----------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------+---------------+------+---------+------+-------+----------+-------------+ | 1 | SIMPLE | test | ALL | NULL | NULL | NULL | NULL | 39809 | 100 | Using where | +----+-------------+-------+------+---------------+------+---------+------+-------+----------+-------------+ 1 row in set id -- select識別符 select_type -- 語句的類型 -- SIMPLE :簡單查詢;不包括鏈接查詢和子查詢 -- PRIMARY :主查詢;或者最外層的語句查詢 -- UNION :鏈接查詢的第二個或後面的查詢語句 -- DEPENDENT UNION -- UNION RESULT -- SUBQUERY -- DEPENDENT SUBQUERY -- DERIVED :導出表的select key_len -- 索引字段長度按字節計算的長度 rows -- 檢索的行數 type: -- 鏈接類型 好到差 1、system 僅有一行的系統表,const的特殊類型 2、const 經常使用於比較PRIMARY KEY 或 UNIQUE 3、eq_ref 外鍵關聯 4、ref 5、ref_or_null 同ref,單添加了專門搜索null值的行 6、index_merge 表示使用了索引合併 7、unique_subquery IN子查詢 8、index_subquery IN子查詢,只適合非惟一索引 9、range 根據索引檢索範圍的行 10、index 與ALL相同,除了只掃描索引樹 11、ALL 進行完整的掃描 索引注意 like 'x%' -- %不能在開頭 組合索引 -- 要遵循最左前綴集合 OR -- 只有先後都是索引列,纔會使用索引 join代替子查詢 優化表結構 1、字段多 --> 分表 2、增長中間表: 對於常常聯合查詢的表,能夠創建第三張表以提升查詢效率,經過中間表,把須要常常聯合查詢的數據插入中間表中, 而後將原來的聯合查詢改成對第三張表的查詢,以此來提升查詢效率 3、增長冗餘字段 表設計應儘可能遵循範式理論的規約,儘可能減小冗餘字段,讓表設計看起來精緻優雅; 但合理地加入冗餘字段能夠提升查詢速度。 表的規範化程度越高,標語表之間的關係就越多,須要鏈表查詢的狀況也就越多。 例子:A須要B表裏的C字段,能夠直接在A表也添加一個C字段。 缺點,數據同步,要修改兩個字段 優化插入速度 影響因素:(索引、惟一性校驗、一次性插入) --MyISAM引擎的表 1、禁用索引 對於非空表 插入記錄時,會根據標的索引對插入的記錄創建索引。若是插入大量數據,創建索引會下降插入記錄的速度。 方法:插入前禁用索引,插入之後在開啓索引 ALTER TABLE table_name DISABLE KEYS; ALTER TABLE table_name ENABLE KEYS; 空表:不須要 2、禁用惟一性檢查 插入數據時,會先對插入的數據進行惟一性校驗。 SET UNIQUE_CHECKS = 0; -- 關閉 SET UNIQUE_CHECKS = 1; -- 開啓 3、使用批量插入 代替多條單個插入 4、使用LOAD DATA INFILE 批量導入 他比insert快 --InnoDB引擎的表 1、禁用惟一性檢查 2、禁用外鍵檢查 SET foreign_key_checks=0 SET foreign_key_checks=1 -- 插入了不知足條件的數據也刪不了 3、禁用自動提交 set autocommit = 0; set autocommit = 1; 分析表、檢查表、優化表 -- 分析關鍵字的分佈(InnoDB\BDB\MyISAM) ANALYZE [LOCAL|NO_WAITE_TO_BINLOG] TABLE table_name[,table_name] -- LOCAL是NO_WAITE_TO_BINLOG的別名, 都是不寫入二進制日誌 -- 分析過程當中只能讀,不能更新或插入 mysql> ANALYZE TABLE asd,asdf; +--------+---------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------+---------+----------+----------+ | a.asd | analyze | status | OK | | a.asdf | analyze | status | OK | +--------+---------+----------+----------+ 2 rows in set --Op;表示執行的操做,analyze表示進行分析操做 --Msg_type;信息類型,tatus\info\note\warning\error -- 檢查表是否存在錯誤 CHECK TABLE table_name[,table_name] ... [OPTION]... OPTION = {QUICK|FAST|MEDIUM|EXTENDED|CHANGED} -- QUICK 不檢查行,不檢查錯誤的鏈接 -- FAST 只檢查沒有被正常關閉的表 -- MEDIUM 只檢查上次檢查後被更改的表和沒有被正確關閉的表 -- EXTENDED 掃描行 -- CHANGED 全面查找,能夠保證表100%一致,時間較長 OPTION 只對MyISAM有效, 過程當中只能讀,不能更新或插入 -- 消除刪除或者更新形成的空間浪費 OPTIMIZE [LOCAL|NO_WAITE_TO_BINLOG] TABLE table_name[,table_name] 對InnoDB、MyISAM都有效, 針對的是VARCHAR\BLOG\TEXT類型 建議:一週、一月運行一次