mysql高级

1、索引

1.1索引概述

  帮助mysql高效获取数据的数据结构。在数据之外,数据库系统还维护满足特定的查找算法的数据结构,这些数据结构一某种方式引用(指向)数据。

  优势:1)类似于书籍的目录索引,提高致据检素的效率,降低教据库的IO成本

     2)通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗

  劣势:1)实际上索引也是一张表,该表中保存了主键与素引字段,并指向实体类的记录,所以索引列也是要占用空间的

     2)虽然素引大大提高了查词效率,同时却也降低更新表的速度,如对表进行INSERT, UPDATE, DELETE,因为更新表时, MysQL不仅要保存数据,还要像存一下索引文件每次更新添加了素引列的字段,都会调整因为更新所带来的键值变化后的素引信息

 1.2索引结构

  索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的,所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的素引类型的. MySQL目前提供了以下4种素引

  1、BTREE素引 (默认索引):最常见的素引类型,大部分素引都支持B树素引。BTREE结构BTeex叫多路平衡搜索树,一颗m叉的BTee特性如下:

    1)树中每个节点最多包含m个孩子

    2)除根节点与叶子节点外,每个节点至少有[ceil(m/2)]个孩子.

    3)若根节点不是叶子节点,则至少有两个孩子

    4)所有的叶子节点都在同一层

    5)每个非叶子节点由n个key与n+1个指针组成,其中(cel(m/2-1 a n < m-1

  BTREE数据结构示意图:

   

  Mysql中B+Tree索引结构示意图:

  

  2、HASH索引:只有Memory引擎支持,使用场景简单。

  3、R-tree索引 (空间索引) :空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间故据类型,通常使用较少,不做特别介绍。

  4、Full-text (全文素引) :全文素引也是MyISAM的9一个特殊素引类型,主要用于全文素引, InoDB从Mysa15.6版本开始支持全文索引。

1.3索引分类

1) 单值索引:即一个索引只包含单个列,一个表可以有多个单列素引。

2) 唯一索引:索引列的值必须唯一,但允许有空。

3) 复合素引:即一个索引包含多个列。

1.3索引语法

主键默认创建主键索引

创建索引:create index 索引名 on 表名(字段);

查看索引:show index from 表名G;

删除索引:dorp 索引名 on 表名;

修改索引:alter  table  表名 add unique 索引名(字段); # 添加唯一索引

     alter  table  表名 add fulltext 索引名(字段); # 添加全文索引

查看当前数据库使用索引的次数:show status like 'Handler_read';

查看全局数据库使用索引的次数:show global status like 'Handler_read';

  1、HandTer-read_first :案引中第一条被读的次数,如果较高,表示服务器正执行大量全家引扫描(这个值越低越好)。

  2、Handler-read_key :如果引正在工作,这个值代表一个行被索引值读的次数,如果值越低,表示宏引得到的性能改善不高,因为引不经常使用(这个值越高越好)。

  3、Handler-read_next :按照健顺序读下一行的请求数。如果你用范围约束或如果执行,引扫描来查询,引列,该值增加。

  4、Hand ler-read-prev :按照键顺序读前一行的请求数。该读方法主要用于优化ORDER BY... DES。

  5、Handler-read.rnd, :根据固定位置读一行的请求数。如果你正执行大量查询并需要对结果进行排序该值较高。你可能使用了大里需要Mysau扫描整个表的查询或你的连接没有正确使用键。这个值较高,意味若运行效本低,应该建立家引来补救。

  6、Handler-read-rnd-next :在数据文件中读下一行的请求数,如果你正进行大量的表扫描,该信较高,通常说明你的表索引不正确或马入的意询没有利用素引。

1.4索引设计

  索引的设计可以薄循一些已有的原则,创建索引的时候请尽是考虑符合这些原则,便于提升索引的使用效率,更高效的使用索引。

1)对查询频次较高,且数据是比较大的表建立索引。·

2)索引字段的选择,最佳候选列应当从where子句的条件中提取,如果where子句中的组合比较多,那么应当挑选最常用、过滤效果最好的列的组合

3)使用唯一索引,区分度越高,使用索引的效率越高。

4)索引可以有效的提升查词数据的效率,但索引数量不是多多益善,索引越多,维护索引的代价自然也就水涨船高。对于插入、更新、删除等DML操作比较频繁的表来说,索引过多,会引入相当高的维护代价,降低DML操作的效率,增加相应操作的时间消耗。另外索引过多的话, MysQL也会犯选择困难病,虽然最终仍然会找到一个可用的索引,但无疑提高了选择的代价。

5)使用短索引,索引创建之后也是使用硬盘来存储的,因此提升素引访问的I/0效率,也可以提升总体的访问效率。假如构成索引的字段总长度比较短,那么在给定大小的存储块内可以存储更多的素引值,相应的可以有效的提升MysQL访问索引的/O效率。

6)利用最左前缀,N个列组合而成的组合素引,那么相当于是创建了N个索引,如果查询时where子句中使用了组成该索引的前几个字段,那么这条查询SQL可以利用组合素引来提升查询效率。

2、视图

2.1视图概述

  视图(View )是一种虚拟存在的表。视图并不在救据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

视图相对于普通的表的优势主要包括以下几项:

1、简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。

2、安全:使用视图的用户只能访问他们被允许查词的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。

3、数据独立:一旦视图的结构确定了,可以屏敬表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

2.2视图语法

创建视图:create or replace view 视图名 as sql语句;

修改视图:alter view 视图名 as sql语句;

查看视图:select * from 视图名;

删除视图:drop view 视图名;

3、存储过程

3.1概述

  存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。

  存储过程和函数的区别在于函致必须有返回值,而存储过程没有。函数:是一个有返回值的过程;过程:是一个没有返回值的函致;

3.2存储过程增删改查

3.2.1添加存储过程

将$声明为语句结束:delimiter $

create procedure 存储过程名()

begin

  sql语句集合;

end;

3.2.2调用存储过程

call 存储过程名()$

3.2.3查看存储过程

1、selcet name from mysql.proc where db ='demo_01';

2、show procedure status;

3、show create procedure 存储过程名;

3.2.4删除存储过程

 drop procedure 存储过程名;

3.3创建存储过程详细语法

3.3.1声明变量并打印

create procedure 存储过程名()

begin

  declare num int  defalut 10;

  select concat('num的值为:',num);

end;

3.3.2为变量赋值

create procedure 存储过程名()

begin

  declare num int  defalut 10;#定义变量

  set num = num+10 (除set之外,还可以into赋值:select count(*) into num from 表)

  select num;

end;

3.4创建存储过程if判断

create procedure 存储过程名()

begin

  declare num int  defalut 10;

  declare str1 varchar  defalut ' ';

  if num>100 then

    set str1='大于100';

  elseif 10<num<100

    set str1='10与100之间';

  else

    set str1='10以下';

  end if;

    select concat(‘数字',num,'描述',str1) 

end;

3.5创建存储过程传递参数

格式:[in:该参数作为输入参数值,out:该参数作为输出参数值,inout:即可为输入也可以为输出] ,参数名,参数数据类型

create procedure 存储过程名(in num int)

begin

  declare str1 varchar  defalut ' ';

  if num>100 then

    set str1='大于100';

  elseif 10<num<100

    set str1='10与100之间';

  else

    set str1='10以下';

  end if;

  select concat(‘数字',num,'描述',str1) 

end;

调用:call  存储过程名(20);

create procedure 存储过程名(in num int,out str1 varchar(10))

begin

  if num>100 then

    set str1='大于100';

  elseif 10<num<100

    set str1='10与100之间';

  else

    set str1='10以下';

  end if;

end;

调用:call  存储过程名(20,@str1);

seclec @str1;

3.6创建存储过程case结构

create procedure 存储过程名(mon int )

begin

  declare result vachar(10);

  case 

    when mon>=1 and mon<=3 then

      set result ='one';

    when mon>=4 and mon<=6 then

      set result ='two';

   end case;

   select concat(mon,result)

end;    

3.7创建存储过程循环结构

create procedure 存储过程名( ) 

begin

  declare total  int defalut 0;

  declare num  int defalut 1;

  while num <=n do

    set total = total+1;

    set num = num +1;

  end  while;

  select total;

end;

create procedure 存储过程名( ) 

begin

  declare total  int defalut 0;

  repeat

    set total=toatal+n;

    set n=n-1;

    until n=1

  end repeat;

  select total;

end;

create procedure 存储过程名( ) 

begin

  declare total  int defalut 0;

  count:loop # 取别名

    set total=toatal+n;

    set n=n-1;

    if n<=0 then

      leave count;

    end if;

  end loop count;

  select total;

end;

3.8游标(存储查询结果集)

create procedure 存储过程名( ) 

begin

  declare 列1 int(11),

  declare 列2 int(11),

  declare 游标名 cursor  for select * from 表;

  declare data int default 1;

  declare exit handler for not fount set data =0;

  open 游标名;

  repeat 

    fetch  游标名 into 列1,列2;

    select concat (列1=列1,列2=列2);

    until 

  end repeat;

  close 游标名;

end ;

3.8存储函数(有返回值)

create function 函数名(countid int)

returns int 

begin 

  declare num int;

  select count (*)  into num 表名 where id =countid;

  return num; 

end;

调用:select 函数名(1);

删除:drop  function 函数名;

4、触发器

4.1触发器概述

  触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以助应用在效据库端确保数据的完整性,日志记录,数据校验等操作。使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在 发韻还只支持行级触发,不支持语句级触发。

触发器类型:insert触发器,new表示将要新增或者已经新增的数据;update触发器,old表示之前修改的数据,new将要修改或者已经修改的数据;delete触发器,old将要删除或者已经删除的数据。

4.2触发器应用

4.2.1创建触发器

create trigger 触发器名

after insert     # 插入触发器

on 表1名       # 触发器的触发的表

for each row     #行级触发器

begin

  insert into 记录表(xx,log)values(xx,concat(new.表1的列1,new.表1的列2,));

end;

create trigger 触发器名

after update    # 插入触发器

on 表名       # 触发器的触发的表

for each row     #行级触发器

begin

  insert into 记录表(xx,log)values(xx,concat( #修改前 (old.表1的列1,old表1的列2), #修改后 (new.表1的列1,new.表1的列2,));

end;

create trigger 触发器名

after delete     # 删除触发器

on 表1名      # 触发器的触发的表

for each row     #行级触发器

begin

  insert into 记录表(xx,log)values(xx,concat(old.表1的列1,old.表1的列2,));

end;

4.2.2查看触发器

show triggersG;

4.2.3删除触发器

drop trigger 触发器名;

5、存储引擎

5.1存储引擎概述

1、和大多数的数据库不同,MySQL中有一个存储引擎的概念,针对不同的存储需求可以选择最优的存储引擎。

2、存储引擎就是存储敦据,建立索引,更新查词效据等等技术的实现方式,存储引擎是基于表的,而不是基于库的。所以存储引擎也可被称为表类型。

3、Oracle, Salserver等数据库只有一种存儲引擎, MysQL提供了播件式的存储引擎架构。所以MysQL存在多种存储引擎,可以根据需要使用相应引擎,或者编写存储引擎。

4、MySQL5.0支持的存储引擎包含: InnoDB,MyISAM,BDB, MEMORY, MERGE, EXAMPLE, NDB Cluster, ARCHIVE, CSVBLACKHOLE, FEDERATED等,其中innoDB和BDB提供事务安全表,其他存储引擎是非事务安全表。

5、可以通过指定showengines ,来查询当前数据库支持的存储引擎。

5.2存储引擎

1、INNODB(支持外键):create table 表名(xxx)engine = innodb;开启事务:start trasaction;提交事务:commmit;

2、MyISAM不支持事务、也不支持外键,其优势是访问的速度快,对事务的完整性没有要求或者以SELECT、 INSERT为主的应用基本上都可以使用这个引擎来创建表。有以下两个比较重要的特点:

3、Memory存储引擎将表的数据存放在内存中。每个MEMORY表实际对应一个磁盘文件,格式是frm ,该文件中只存储表的结构,而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提i提高整个表的效率, MEMORY类型的表访问非常地快,因为他的数据是存放在内存中的且默认使用HASH引 ,但是服务一旦关闭,表中的数据就会丢失。

4、MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同, MERGE表本身并没有存储数据,对MERGE类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行的。对于MERGE类型表的插入操作,是通过INSERT-METHOD子句定义插入的表,可以有3个不同的值,使用FIRST或LAST值使得插入操作被相应地作用在第一或者最后一个表上,不定义这个子句或者定义为NO,表示不能对这个MERGE表执行插入操作。可以对MERGE表进行DRO删除MERGE表的定义,对内部的表是没有任何

6、sql优化

6.1优化sql步骤

6.1.2sql执行效率

查看当前数据库sql执行频率:show staues like ‘Com_______’;

查看全局数据库sql执行频率:show global staues like ‘Com_______’;

查看全局数据库INNODB存储引擎的sql执行频率:show global staues like ‘innodb_rows_%’;

6.1.2定位低效sql

1、慢日志查询

2、show processlist :慢查询日志在查询结束以后才纪录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前MysQL在进行的线程,包括线程的状态、是否锁表等,可以实时地查看5QL的执行情况。

  1) id列,用户登录mysq1时,系统分配的"connection-id" ,可以使用函数connection-id()查看

  2) user列,显示当前用户,如果不是root,这个命令就只显示用户权限范围的sq1语句

  3) host列,显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题语句的用户

  4) db列,显示这个进程目前连接的是哪个数据库

  5) command列,显示当前连接的执行的命令,一般取值为休眠( sleep) ,查询( query) ,连接(connect )等

  6) time列,显示这个状态持续的时间,单位是秒

  7) state列,显示使用当前连接的sq1语句的状态,很重要的列. state描述的是语句执行中的某一个状态,一个sql语句,以查询为例,可能需要经过copying to tmp table, sorting result, sending data等状态才可以完成

  8) info列,显示这个sq1语句,是判断问题语句的一个重要依据

6.1.3explain分析执行计划

explain sql语句;  

  1)id:select查询的序列号,是一组数字,表示的是查询中执行select子句或者是操作表的顺序,id序号越大优先级越高

  2)select type:表示SELECT的类型,常见的取值有SIMPLE (简单表,即不使用表连接或者子查询)、PRIMARY (主查询,即外层的查询)、UNION (UNION中的第二个或者后面的查询语句)、SUBQUERY (子查询中的第一个SELECT )等

  3)table:输出结果集的表

  4)type表示表的连接类型,性能由好到差的连接类型为:

    1、NULL MySQL不访问任何表,索引,直接返回结果

    2、system 表只有一行记录等于系统表),这是const类型的特例,一般不会出现表示通过素引一次就找到了,

    3、const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快。如将主const 键置于where列表中, MySQL就能将该查询转换为一个常亮. const于将"主键”或"唯一"索引的所有部分与常量值进行比较.

    4、eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询,关联查询出的记录只有一条。常见于主键或唯一索引扫描

    5、ref非唯一性素引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,返回所有匹配某个单独值的所有行(多个)

    6、range 只检索给定返回的行,使用一个索引来选择行. where之后出现between , <,>,in等操作。

    7、index index与ALL的区别为index类型只是過历了索引树,通常比ALL快,

    8、ALL是過历数据文件。all将遍历全装以找到匹配的行

  5)possible-keys :表示查询时,可能使用的索引

  6)key:表示实际使用的索引

  7)key_len:索引字段的长度

  8)rows:扫描行的数量

、 9)extra:执行情况的说明和描述

    1、using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,称为"文件排序”

    2、using temporary:使用了临时表保存中间结果, MySQL在对查询结果排序时使用临时表。常见于order by和group by

    3、using index:表示相应的select操作使用了覆盖索引,避免访问表的数据行,效率不错

6.1.3show profile分析sql执行时间

查询系统是否支持profiling:seclect @@have_profiling;

查询profiling状态:select @@profiling:

开启profiling(只针对当前会话):set profiling=1;

查看profiles:show profiles;

查看某条sql语句的执行时间:show profile for query  id号;

  Sending data状态表示MysQL线程 始访问数据行并把结果返回始客户端,而不仅仅是返回个客户端,由于在Sending data状态

查看某条sql语句CPU的执行时间:show profile CPU for query  id号;

6.1.4trace优化器

1、开启trace:set optimizer_trance='enabled=on',end_markers_in_json=on;

2、设置内存大小:set optimizer_trance_max_mem_size=1000000;

3、查看优化器日志:select * from information_schema.optimizer_traceG;

6.2 索引优化使用  

1、需要全值匹配。

2、复合索引具有最左前缀法则。

3、范围查询右边的列不能使用索引。

4、不能在索引上使用运算,否则索引失效。

5、字符串不加单引号,索引失效。

6、尽量使用覆盖索引,不使用select *回表查询。

7、用or分割的条件,前面的条件用了索引,后面的没用索引,那么整个不使用索引。

8、以%开头的like模糊查询,索引失效。

9、in可以使用索引,not in索引失效

6.3 语句优化

可以适当提高sort-buffer_size和max_length_for_sort_data系统变是,来增大排序区的大小,提高排序的效率。

查看sort-buffersize:show variables like 'sort-buffersize';

查看max_length_for_sort_data:show variables like 'max_length_for_sort_data';

1、order by优化:select 索引 from 表 order by 字段;(利用索引进行排序;多个字段排序时尽量同时使用升序或者降序;排序字段和复合索引一致)

2、group by优化:select 索引 from 表 group by  列 order by null;

3、优化嵌套查询:少使用子查询,利用连接查询

4、or 优化:or关联的每个字段都需要有索引,不走复合索引,使用union替换or。

5、分页查询优化:select * from 表 limit 10 10;  优化一:select *from 表 t,(select id from 表, order by id limit 200000,10)a where t.id=a.id;  优化二(用于组件自增):select * from 表 where id>200000 limit 10;

6.4应用优化

1、使用数据库连接池。2、减少无效的访问,增加cache层。3、使用负载均衡

6.5查询缓存

1、查看数据库是否支持缓存:SHOW VARIABLES LIKE 'have_query_cache';

2、查看当前MySQL是否开启了查询缓存:SHOW VARIABLES LIKE ‘query_cache_type‘;

3、查看查间缓存的占用大小:SHOW VARIABLES LIKE 'query_cache_size';

4、查看查询缓存的状态变是:SHOW STATUS LIKE 'Qcache%;

5、开启查询缓存:vi /usr/my.cnf  添加:query_ cache_type=1  重启:service mysql restart

6、可以在SELECT语句中指定两个与查询缓存相关的选项:

  SQL-CACHE :如果查询结果是可缓存的,并且query-cathe type系统变量的值为ON或DEMAND ,则缓存查询结果。SELECT SQL-CACHE id, name FROM customer;

  SQLNO-CACHE:服务不使用查询缓存。它既不检查查询缓存,也不检查结果是否已缓存,也不缓存查询结果。 SELECT SQL_NO_CACHE id, name FROM customer;

7、查询缓存失效

  1) SQL语句不一致的情况,要想合中查询缓存,查询的SQL语句必须一致。

  2)当查询语句中有一些不确定的时,则不会缓存。如: now(), current date() , curdate), curtime), rand), uid() , user) , database)。

  3)不使用任何表查询语句。

  4)查询mysgl, information_schema或performance_schema数据库中的表时,不会走查询缓存。

  ;5)在存储的函数,触发箭或事件的主体内执行的查询。

  6)如果表更改,则使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除。这包括使用MERGE映射到已更改表的表的查询。一个表可以被许多类型的语句,如被改变INSERT, UPDATE , DELETE , TRUNCATE TABLE , ALTER TABLE, DROP TABLE,或DROP DATABASE。

6.6内存优化(设置内存参数)

1 、myisam内存优化

key_buffer_size决定myisam索引块缓存区的大小,直接影响到myisam表的存取效率

在/usr/my.cnf中添加:key_buffer_size=512M

read_buffer_size:如果需要经常顺序扫描myisam表,可以增大read_buffer_size的值来改善性能

read_rnd_buffer_size:对于需要做排序的myisam表的查询,如果有order by子句的sql,适当增加read_rnd_buffer_size的值

2、 innoDB内存优化

innoDB用一块内存区做io缓存池,该缓存池不仅用来缓存innoDB的索引块,而且也用来缓存innoDB的数据块

innodb_buffer_pool_size:该变量决定了innoDB存储引擎表数据和索引数据的最大缓存区大小,innodb_buffer_pool_size的值越大,缓存命中率越高,

在/usr/my.cnf中添加设置:innodb_buffer_pool_size=512M

innodb_log_buffer_size:决定了innodb重做日志缓存的大小,

在/usr/my.cnf中添加设置:innodb_log_buffer_size=10M

6.7并发调整(设置并发参数)

max_connections:采用max_connections控制允许连接到mysql数据库的最大值,默认值位151,可以根据系统的性能来调整最大连接数。

back_log:back_log参数控制mysql监听TCP端口时设置的积压请求栈大小,如果mysql的连接数达到max_connections时,新的请求将会被存在堆栈中,以等待某一连接释放资源。如果需要数据库在较短时间内处理大量连接请求,可以考虑将back_log的值增大。

table_open_cache:该参数用于控制所有sql语句执行线程可打开表缓存的数量,而在执行sql语句时,每一个sql执行线程至少要打开一个表缓存。该参数的值应该根据设置最大连接数来设定

thread_cache_size:为了加快连接数据库的速度,mysql会缓存一定数量的客户服务线程以备重用,通过参数thread_cache_size可控制mysql缓存客户服务线程的数量

innodb_lock_wait_timeout:该参数是用来设置innodb事务等待行锁的时间,默认值是50ms,可以根据需要的进行动态设置查看上述参数:show variable like '##'

7、锁

1、myisam

加读锁:lock  table 表名 read;

加写锁:lock  table 表名 write;

解锁:unlock tables;

查看锁的争用情况:show open tables;

查看表锁的情况:show status like ‘Table_locks%’;

2、 innodb

查看数据库默认的事务隔离级别:show variables like  ‘tx_isolation’;

关闭事务的自动提交:set  autocommit=0;

查看锁的争用情况:show status like ‘innodb_row_locks%’;

  Innodb-ow_lock_current-waits:当前正在等待锁定的数量

  Innodb-row_lock-time:从系统启动到现在锁定总时间长度

  Innodb-row_lock-time-avg:每次等待所花平均时长

  Innodb-row_lock-time-max:从系统启动到现在等待最长的一次所花的时间

  Innodb-row_lock-waits:系统启动后到现在总共等待的次数

优化建议:

  尽可能让所有数据检索都能通过索引来完成,避免无索引行锁升级为表锁。

  合理设计索引,尽显缩小锁的范围

  尽可能减少索引条件,及索引范围,避免间隙锁

  尽虽控制事多大小,减少锁定资源星和时间长度

  尽可使用低级别事务隔离(但是需要业务层面满足需求)

8、 mysql常用的函数

1、数字函数:

ABS:求绝对值

SQRT:求二次方根

MOD:求余数

CEIL和CEILING:两个函数功能相同,都是返回不小于参数的最小整数,即向上取整

FLOOR:向下取整,返回值转化为- -个BIGINT

RAND:生成-一个0~1之间的随机数,传入整数参数是,用来产生重复序列

ROUND:对所传参数进行四舍五入

SIGN:返回参数的符号

POW和POWER:两个函数的功能相同,都是所传参数的次方的结果值

SIN:求正弦值

ASIN:求反正弦值,与函数SIN互为反函数

COS:求余弦值

ACOS:求反余弦值,与函数CoS互为反函数

TAN:求正切值

ATAN:求反正切值,与函数TAN互为反函数

COT:求余切值

2、字符串函数:

LENGTH:计算字符串长度函数,返回字符串的字节长度

CONCAT:合并字符串函数,返回结果为连接参数产生的字符串,参数可以使一一个或多个

INSERT:替换字符串函数

LOWER:将字符串中的字母转换为小写

UPPER:将字符串中的字母转换为大写

LEFT:从左侧字截取符串,返回字符串左边的若干个字符

RIGHT:从右侧字截取符串,返回字符串右边的若干个字符

TRIM:删除字符串左右两侧的空格

REPLACE):字符串替换函数,返回替换后的新字符串

SUBSTRING:截取字符串,返回从指定位置开始的指定长度的字符换

REVERSE:字符串反转(逆序)函数,返回与原始字符串顺序相反的字符串

3、日期函数:

CURDATE和CURRENT, DATE:两个函数作用相同,返回当前系统的日期值

CURTIME和CURRENT_TIME:两个函数作用相同,返回当前系统的时间值

NOW和SYSDATE:两个函数作用相同,返回当前系统的日期和时间值

MONTH:获取指定日期中的月份

MONTHNAME:获取指定日期中的月份英文名称

DAYNAME:获取指定日期对应的星期几的英文名称

DAYOFWEEK:获取指定日期对应的一周的索引位置值

WEEK:获取指定日期是一年中的第几周,返回值的范围是否为0~52或1~53

DAYOFYEAR:获取指定日期是一年中的第几天 ,返回值范围是1 -366

DAYOFMONTH:获取指定日期是一一个月中是第几天,返回值范围是1~31

YEAR:获取年份,返回值范围是1970- 2069

TIME_ TO SEC:将时间参数转换为秒数

SEC. .TO. _TIME:将秒数转换为时间,与TIME. .TO. SEC互为反函数

DATE_ ADD和ADDDATE:两个函数功能相同,都是向日期添加指定的时间间隔

DATE. SUB和SUBDATE:两个函数功能相同,都是向日期减去指定的时间间隔

4、复合函数:

MAX:查询指定列的最大值

MIN:查询指定列的最小值

COUNT:统计查询结果的行数

SUM !:求和,返回指定列的总和

AVG:求平均值,返回指定列数据的平均值

9、mysql日志

在任何一种数据库中,都会有各种各样的日志,记录着数据库工作的方方面面,以帮助数据库管理员追踪数据库曾经发生过的各种事件。MySQL 也不例外,在MySQL中,有4种不同的日志,分别是错误日志、= 进制日志( BINLOG日志)、查询日志和慢查询日志,这些日志记录着数据库在不同方面的踪迹。


1、 错误日志错误日志是MySQL中最重要的日志之- - ,它记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。

该日志是默认开启的,默认存放目录为mysql的数据目录( var1/ib/mysql ) ,默认的日志文件名为hostname.err ( hostname是主机名)。

查看日志命令:show variables like 'log_error%'

查看日志内容:tail -f  ab/mysql/xaxh-sever.err

2、二进制日志

二进制日志( BINLOG )记录了所有的DDL (数据定义语言)语句和DML (数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复起着极其重要的作用, MySQL的主从复制,就是通过该binlog实现的。

二进制日志,默认情况下是没有开启的,需要到MySQL的配文件中开启,并配IMySQL日志的格式。

配置文件位置: /usr/my.cnf日志存放位置:配置时,给定了文件名但是没有指定路径,日志默认写入Mysql的数据目录。

日志格式:

STATEMENT该日志格式在日志文件中记录的都是SQL语句( statement) , 每一条对数据进行修改的SQL都会记录在日志文件中,通过Mysq|提供的mysqbinlog工具,可以清晰的查看到每条语句的文本。主从复制的时候,从库( slave )会将日志解析为原文本,并在从库重新执行一-次。

ROW该日志格式在日志文件中记录的是每一-行的数据变更,而不是记录SQL语句。比如,执行SQL语句: update tb. ,book set status='1',如果是STATEMENT日志格式,在日志中会记录一行SQL文件 ;如果是ROW ,由于是对全表进行更新,也就是每一-行记录都会发生变更 , ROW格式的日志中会记录每一行的数据变更。

MIXED这是目前MySQL默认的日志格式,即混合了STATEMENT和ROW两种格式。默认情况下采用STATEMENT ,但是在一一些特殊情况下采用ROW来进行记录。MIXED 格式能尽量利用两种模式的优点,而避开他们的缺点。

二进制日志读取:mysqlbinlog log-file;

查看row格式日志:mysqlbinlog -w mysqlbin.000001

日志的删除:reset master

3、查询日志

查询日志中记录了客户端的所有操作语句,而二进制日志不包含数据的sql语句

#该选项用来开启查询日志,可选值 : 0或者1 : 0代表关闭,1代表开启 

genera1_1og=1

#设置日志的文件名,如果没有指定 ,默认的文件名为host_ name. 1og

genera1_1og. filelfile. .name

4、慢查询日志

慢查询日志记录了所有执行时间超过参数long. query, _time设置值并且扫描记录数不小于min, examined. row. Jimit的所有的SQL语句的日志。long, _query. time默认为10秒,最小为0,精度可以到微秒。

#该参数用来控制慢查询日志是香开启, 可取值: 1和0,1代表开启,0代表关闭

slow_ query_1og=1

#该参数用来指定慢查询日志的文件名

s1ow_ query_1og. file=s low. query.1og

#该选项用来配置查询的时间限制,超过这个时间将认为值慢查询, 将需要进行日志记录,默认10s

long_query_time=10

原文地址:https://www.cnblogs.com/wu-wu/p/13132389.html