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类型 建议:一周、一月运行一次