mysql复合函数索引_mysql高级

1.1、启动MySQL服务器

service MySQL start#启动服务器

service mysql stop #关闭服务器

1.2、登录mysql

mysql -u root -p #登录root用户 然后输入密码,

cat /root/.mysql_secret#查看随机生成的密码

进入mysql后输入:set password =password("新密码")#设置新的密码

设置远程访问:grant all privileges on *.* to 'root' @'%' identified by 'itcast'

关闭防火墙:service iptables stop

2.1索引结构

BTREE索引:最常见索引类型,大部分索引都支持B树索引

HASH索引:只有memory引擎支持,使用场景简单

R-tree索引:主要用于地理空间数据类型

Full-text(全文索引):主要用于全文

2.2索引分类

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

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

复合索引:即一个索引包含多个列

2.3 索引语法

创建索引:

create index 索引名称 on 表名(某列);

查看索引:

show index from 表名;

删除索引:

drop index 索引名称 on表名;

alter命令;

alter table 表名 add unique 索引名称(某列);#创建唯一索引

3.1创建或者修改视图

create view 视图名称 as(select语句);#创建视图

select * from视图名称;#查看视图

3.2查看视图和删除视图

show tables就可以查看表和视图

drop view if exists 视图名称;

4.1创建存储过程

首先要修改结束语句的符号:delimiter $ #将;换成了$符号

create procedure 存储过程名称()

begin

sql语句;

end $

4.2调用存储过程

call 存储过程名称();

4.3查询存储过程

select name from mysql.proc where db='demo_01';#通过表来查询

show procedure status\G;查看存储过程状态信息

show create procedure test.存储过程名称\G;

4.4 删除存储过程

drop procedure 存储过程名称

4.5.1 存储过程语法-变量

delimiter $

create procedure 存储过程名称()

begin

declare num int default 10;#declare声明变量,default设置默认值

set num =num +10#set 可以赋值给常量

select count(*) into num from city;#select into #可以对变量进行赋值,

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

end $

4.5.2 存储过程语法-if条件判断

delimiter $

create procedure 存储过程名称()

begin

declare num int default 10;

declare content varchar(50) default ' ';

if num>= 10 then

set content='大于10';

end if;

select concat('num值:',num,'大小为',content);

end $

4.5.3 存储过程语法-传递参数

1、输入参数:

delimiter $

create procedure 存储过程名称(in number int)#in表示输入参数

begin

declare num int default 10;

declare content varchar(50) default ' ';

if num>= 10 then

set content='大于10';

end if;

select concat('num值:',num,'大小为',content);

end $

调用时 :call 存储过程名称(num)

2、输出参数:

delimiter $

create procedure 存储过程名称(in number int,out content varchar(50))#in表示输入参数

begin

if num>= 10 then

set content='大于10';

end if;

end $

调用时:call 存储过程名称(num,@content)$#将返回结果存到了@content中

查看select @content$

4.5.4 存储过程语法-case结构

delimiter $

create procedure 存储过程名称(mon int)

begin

declare result varchar(10);

case

when mon >=1 and mon<=4 then

set result = '第一季度';

when mon >=5 and mon<=8 then

set result = '第二季度';

else

set result = 'null';

end case;

end $

4.5.4 存储过程语法-while循环

delimiter $

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

begin

declare total int default 0;

declare number int default 1;

while numer <=num do;#满足条件执行语句

set total =total+number;

set number=number +1;

end while;

end $

4.5.5 存储过程语法-repeat结构

delimiter $

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

begin

declare total int default 0;

repeat

set total =total+num;

set num=num -1;

until num=0;#until 设置条件,repeat 满足条件者退出循环

end repeat ;

end $

4.5.6 存储过程语法-loop语句

delimiter $

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

begin

declare total int default 0;

c:loop #c:为取得别名

set total =total+num;

set num=num -1;

if num<=0 then

leave c;

end loop c ;

end $

4.5.7 存储过程语法-游标

delimiter $

create procedure 存储过程名称()

begin

declare id int(11);

declare name varcher(50);

declare has_data int default 1;

declare 游标名字 sursor for select * from 表名;#创建游标

declare exit handler for not found set has_data=0#当游标拿不到数据时会触发,必须在创建游标下一行

open 游标名字;#打开游标

repeat

fetch 游标名字 into id ,name;

select concat ('id=',id,'name=','name')

end repeat;

close 游标名字;#关闭游标

end $

4.6 存储函数

delimiter $

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

returns int

begin

declare cnum int(11);

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

return cnum;

end $

调用:select 存储过程名称(num)

5.1创建触发器

插入(insert)、修改 (update)、删除(delete)

delimiter $

create trigger 触发器名称

after insert#插入

on 表名1

for each row#表示行级触发器

begin

insert into 表名2(列名1,列名2) values()

end $

5.2查看触发器

show trigger\G;#查看全部触发器

5.3删除触发器

drop trigger 触发器名字;

6.1查看存储引擎

进入数据库中后:show engines;#查看数据库支持的存储引擎

7.1定位低效sql语句

可有使用:show processlist;查看

7.2 explain分析执行计划

explain select * from 表名 where 查询条件;#使用explain查看

7.2.1 explain之id

id字段时select查询的序号,是一组数字,表示查询中执行select子句或者是操作表的顺序

id相同表示加载表的顺序从上到下

id不同id值越大,优先级越高,越先执行

id有相同也有不同,同时存在。id相同的认为是一组,从上往下顺序执行;id的值越大,优先级越高,越先执行

7.2.2 explain之select_type

表示select的类型:

simple:简单的select查询,查询中不包含子查询或者umion

primary:查询中若包含任何复杂的子查询,最外层查询标记为该标识

subquery:在select或where列表中包含了子查询

derived:在from列表中包含的子查询,被标记为derived mysql会递归执行这些子查询,把结果放在临时表中

union:若第二select出现在union之后,则标记union;若union包含from子句的子查询中,外层select将被标记为:derived

union result:从union表获取结果select

7.2.3 explain之table

展示这一行数据是关于哪张表的

7.2.4 explain之type

type显示是访问类型,是交为重要的一个指标,可取值为:

null:mysql不访问任何表,索引,直接返回

system:表示只有一行记录,这是const类型的特例,一般不会出现

const:表示通过索引一次就找到了,const用于比较primary key 或者unique索引。

因为只匹配一行数据,所以很快,如果将主键置于where列表中,mysql就将该查询转换为一个常量

const于将主键或唯一索引的所有部分与常量值进行比较

eq_ref:类似ref,区别在使用的是唯一索引,使用主键的关联查询,关联查询的记录只有一条

ref:非唯一索引查询扫描,返回匹配某个单独值的所有行。

range:只检索给定返回的行,使用一个索引来选择行。

index:index与all的区别为index类型只是遍历了索引树,通常比all快,all是遍历数据文件

all:将遍历全表找到匹配的行

7.2.5 explain之key

possible_keys:显示可能应用在这张表的索引,一个或多个

key:实际使用的索引,如果为null ,则没有使用索引

key_len:表示索引中使用的直接数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好

7.2.6 explain之rows

扫描的数量。

7.2.7 explain之extra

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

using temporary:使用了临时表保存中间结果,mysql在对查询结果排序使用临时表。

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

7.3 show profile分析sql

select @@have_profiling#查看是否支持profiling

select @@profiling#查看profiling是否开启

set profiling=1#开启profiling

在操作完一系列指令后使用:show profiling;查看所有指令的操作时间

show profile (CPU) for query 5;#查看第五条指令操作每一个阶段所用的时间,加上CPU可以查看cup耗损时间

7.4 trace分析优化器执行计划

通过trace文件能够进一步了解优化器选择A计划,而不是选择B计划

set optimizer_trace="enabled=on",end_markers_in_json=on;#开启优化器

set optimizer_trace_max_mem_size=1000000;#设置内存

运行sql语句

select * from information_schema.optimizer_trace\G;#查看

8.1避免索引失效

1、全值匹配:对索引中所以列都指定具体值

2、最左前缀法则:指查询从索引的最左前列开始,并且不跳过索引中的列

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

4、不要在索引列上进行运算操作,造成索引失效

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

6、尽量使用覆盖索引,避免select *

7、用or分割的条件 如果or前条件中的列有索引,而后面的列没有索引,那么涉及的索引都不会被用到

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

9、如果mysql评估使用索引比全表更忙,则不使用索引

10、is null、is not null 有时索引失效

11、in走索引,not in索引失效

12、单列索引和复合索引,尽量使用复合索引而少使用单列索引

8.2查看索引使用情况

show status like‘handler_read%’;

9.1 sql优化-大量插入数据

使用load命令导入数据的时候,适当的设置可以提高导入的效率

1、顺序插入

2、关闭唯一性校验,在导入数据前执行set unique_checks=0,导入后执行set unique_checks=1恢复唯一性校验

3、手动提交事务,在导入数据前执行set autocommit=0,导入后执行set autocommit=1恢复手动提交事务

9.2 优化insert语句

insert into 表名 values(1,"##");

insert into 表名 values(2,"##");

方法一:

insert into 表名 values(1,"##"),(2,"##");

方法二 在事务进行数据插入:

start transaction;

insert into 表名 values(1,"##");

insert into 表名 values(2,"##");

commit

方法三 数据有序插入

9.3 优化order by语句

1、通过对返回数据进行排序,也就是通常说的filesort排序,所有不是通过索引直接返回排序结果的排序叫做filesort排序

2、通过有序索引顺序扫描直接返回有序数据,这种情况即为using index 不需要额外排序,操作效率高

9.4 优化group by 语句

可以使用索引提高效率

select age,count(*) from 表名 group by age order by null;#后面讲不需要的查询语句关闭

9.5 优化嵌套查询

用多表连接(join)查询代替子查询可更高效

9.6 优化or条件

对于包含or的查询子句,如果要利用索引则or之间条件都必须用到索引,而且不能使用复合索引

可有使用union代替or来提高效率,

9.7 优化分页查询

优化方法一:在索引上完成排序分页操作,最后根据主键关联回原表查询所需要的其他列内容

select id from 表名 order by id limt 2000,10;#查询从2000开始的后10位的内容

优化方法二:该方案使用于主键自增长的表,可以把limit查询转换成某个位置的查询

9.8 使用sql提示

sql提示,是优化数据库的一个重要的手段,简单来说,就是在sql语句中加入一些人为的提示来达到优化的效果

1)、use index:在查询语句表名的后面。添加use index来提供希望mysql去参考的索引列表

select * from 表名 use index (索引名)where 查询条件;

2)、ignore index 如果用户单纯的想让mysql忽略一个或多个索引,则可以使用ignore index

select * from 表名 ignore index (索引名)where 查询条件;

3)、force index:为强制mysql使用一个特点的索引,可以查询中使用force index作为hint

select * from 表名 force index (索引名)where 查询条件;

10.1 应用优化-使用连接池

对于访问的数据库来说,建立连接的代价比较昂贵的,因为我们频繁的创建关闭连接,是比较消耗资源的,我们有必须要建立数据库

连接池,以提高访问的性能

10.2 减少对mysql的访问

1)、避免对数据进行重复检索:在编写应用代码时,需要能够理清对数据的访问逻辑。能够一次连接就获取结果

2)、增加ceche层:在应用中,我们可以在应用中增加缓存层来达到减轻数据库负担的目的。

3)、负载均衡:它的机制就是利用某种均衡算法,将固定的负载量分布到不同的服务器上,以此来降低单台服务器的负载,达到优化的效果

11.1 mysql中查询缓存优化

开启mysql的查询缓存,当执行完全相同的sql语句的时候,服务器就会直接从缓存中读取结果,当数据被修改,之前的缓存会失效

修改比较频繁的表不适合做查询缓存。

11.2 查询缓存的配置

1)、查看当前的mysql数据库是否支持查询缓存:

show variables like 'have_query';

2)、查看当前mysql是否开启了查询缓存:

show variables like 'query_cache_type';

3)、查看查询缓存的占用大小;

show variables like 'query_cache_size';

4)、查看查询缓存的状态变量;

show variables like 'Qcache%'

11.3 开启查询缓存

linux中打开my.cnf 文件:vi /usr/my.cnf

在最后一行添加:query_cache_type = 1

然后重启mysql:service mysql restart

11.4 查询缓存select选项

sql_cache:如果查询结果是可缓存的,并且query_cache_type系统变量的值为no或者demand,则缓存查询结果

sql_no_cache:服务器不使用查询缓存,它既不检查查询缓存,也不检查结果是否已缓存,也不缓存查询结果

11.4 查询缓存失效的情况

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

2)、当查询语句中有一些不确定的时,则不会缓存。如:now(),current_date(),curdate()

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

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

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

6)、如果表更改,着该表的所有高速缓存查询都将变为无效并从高速缓存中删除。

12.1 内存优化的原则

1)、将尽量多的内存分配给mysql做缓存,但要给操作系统和其他程序预留足够的内存

2)、myisam存储引擎的数据文件读取依赖于操作系统自身的io缓存

3)、排序区、连接区等缓存是分配给每个数据库专用的。

12.2 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的值

12.3 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

13.1 mysql并发参数调整

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 '##'

14.1 mysql 锁的问题

锁是计算机协调多个进程或线程并发访问某一资源的机制。(避免资源的争抢)

从数据操作的粒度分为表锁和行锁

表锁:操作时,会锁定整个表

行锁:操作时,会锁定当前操作行

从对数据操作的类型分为读锁和写锁

读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响

写锁(排它锁):当前操作没有完成之前,它会阻断其他写锁和读锁

14.2 mysql锁

表级锁:偏向myisam存储引擎,开销小,加锁块;不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低

行级锁:偏向innodb存储引擎,开销大,加锁慢;会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高

页面锁:开销和加锁时间界于表锁和行锁之间,会出现死锁,锁定粒度界于表锁和行锁之间,并发一般

14.3 myisam表锁

myisam存储引擎只支持表锁,这也是mysql开始几个版本唯一支持的锁类型

14.3.1 如何加表锁

在执行语句时系统会自动添加写锁和读锁

显示加表锁语法:

加读锁:lock table 表名 read;

加写锁:lock table 表名 write;

对于myisam表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求

对于myisam表的写操作,则会阻塞其他用户对同一表的读和写操作;

14.3.2 查看锁的争用情况

查看命令:show open tables;

in_user:表当前被查询使用的次数。

name_locked:表名称是否被锁定。

查看表的锁定情况命令:show status like 'tale_locks%';

tale_locks_immediate:指的是能够立即获得表级锁的次数

tale_locks_waited:指的是不能立即获取表级锁而需要等待的次数,没等待一次,该值加1

14.4 innodb行锁

行锁特点:偏向innodb存储引擎,开销大,加锁慢;会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高

innodb于myisam的最大不同有两点:一是支持事务;二是采用了行级锁

14.4.1innodb行锁模式

要展示行锁模式先要关闭数据库的自动提交:set autocommit = 0

再执行select语句

14.4.2 无索引行锁升级为表锁

查看当前表的索引:show index from test_innodb_lock

14.4.3 间隙锁的危害

当我们用范围条件,而不是使用条件检索数据,并请求共享或排他锁时,innodb会给复合条件的数据进行加锁。

14.4.4 innodb行锁争用情况

查看指令:show status like ' innodb_row_lock%'

15.1 sql执行顺序

编写顺序:

select distinct

from

join

where

group by

having

order by

limiy

执行顺序:

from

not

join

where

group by

having

select distinct

order by

limit

15.2 正则表达式使用

^:在字符串开始处进行匹配

$:在字符串末尾处进行匹配

.:匹配任意单个字符,包括换行符

[...]:匹配出括号内的任意字符

[^...]:匹配不出括号内的任意字符

a*:匹配零个或者多个a(包括空串)

a+:匹配-一个或者多个a(不包括空串)

a?:匹配零个或者一-个a

a1|a2:匹配a1或a2

a(m):匹配m个a

a(m,):至少匹配m个a

a(m,n) :匹配m个a到n个a

a(,n):匹配0到n个a

(...):将模式元素组成单一元素

15.3 mysql常用的函数

主要有四类函数:数字函数,字符串函数,日期函数和复合函数

数字函数:

ABS:求绝对值

SQRT:求二次方根

MOD:求余数

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

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

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

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

SIGN:返回参数的符号

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

SIN:求正弦值

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

COS:求余弦值

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

TAN:求正切值

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

COT:求余切值

字符串函数:

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

CONCAT:

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

INSERT:替换字符串函数

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

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

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

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

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

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

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

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

日期函数:

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:两个函数功能相同,都是向日期减去指定的时间间隔

复合函数:

MAX:查询指定列的最大值

MIN:查询指定列的最小值

COUNT:统计查询结果的行数

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

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

16.1 mysql中常用工具-mysql

该mysql不是指mysql服务,而是指mysql的客户端工具

1)、连接

mysql -h 127.0.0.1-P3306 -u root -p

-u:用户

-p:密码

-h:服务器IP

-P:端口号

2)、执行选项

-e:执行sql语句并退出

16.2 mysqlladmin

mysqladmin是-个执行管理操作的客户端程序。可以用它来检查服务器的配和当前状态、创建并删除数据库等。

可以通过: mysqladmin -help指令查看帮助文档

mysqladmin -u root -p123123 create '数据库名称'

16.3 mysqllbinlog

由于服务器生成的二进制日志文件以二进制格式保存,所以如果想要检查这些文本的文本格式,就会使用到mysqlbinlog日志管理工具。

-d:指定数据库名称,

-o:忽略掉日志的前n行命令

-r:将输出的文本格式日志输出到指定文件

-s:显示简单格式,省略掉一下信息

16.4 mysqldump

mysqldump客户端工具用来备份数据库或在不同数据库之间进行数据迁移。备份内容包含创建表,及插入表的SQL语句。

连接选项:

-u:用户

-p:密码

-h:服务器IP

-P:端口号

输出选项:

-- add- dr op- dat abase:在每个数据库创建语句前加上Drop database 语句

--add-drop-table:在每个表创建语句前加上Drop table语句,默认开启;不开启(--skip- add- dr op-tab1e)

-n,--no-create-db :不包含数据库的创建语句

一t,--no-cr eate-info:不包含数据表的创建语句

-d --no-data:不包含数据:

-T,--t ab=name:自动生成两个文件: -个.sq1文件,创建表结构的语句;一个.txt文件,数据文件,相当于select into outfile

16.5 mysqlimport/source

mysqlimport是客户端数据导入工具,

mysqlimport -uroot -p123123 text /tmp/book.txt

然后导入sql文件:

source sql文件位置

16.6 mysqlshow

mysqlshow客户端对象查找工具,用来很快地查找存在哪些数据库、数据库中的表、表中的列或者索引。

- -count:显示数据库及表的统计信息(数据库,表均可以不指定)

-i:显示指定数据库或者指定表的状态信息

mysqlshow -uroot -p123123 --count

17.1 mysql日志

在任何一种数据库中,都会有各种各样的日志,记录着数据库工作的方方面面,以帮助数据库管理员追踪数据库曾经发生过的各种事件。MySQL 也

不例外,在MySQL中,有4种不同的日志,分别是错误日志、= 进制日志( BINLOG日志)、查询日志和慢查询日志,这些日志记录着数据库在不同方面的踪迹。

17.2 错误日志

错误日志是MySQL中最重要的日志之- - ,它记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库

出现任何故障导致无法正常使用时,可以首先查看此日志。

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

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

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

17.3 二进制日志

二进制日志( 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

17.4 查询日志

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

配置:

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

genera1_1og=1

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

genera1_1og. filelfile. .name

17.5慢查询日志

慢查询日志记录了所有执行时间超过参数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

18.1 mysql复制

复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做) , 从而使得从库和主

库的数据保持同步。

MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。

18.2 mysql复制原理

复制分成三步:

Master 主库在事务提交时,会把数据变更作为时间Events记录在二进制日志文件Binlog中。

主库推送二进制日志文件Binlog中的日志事件到从库的中继日志Relay Log。

slave重做中继日志中的事件,将改变反映它自己的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值