# 获取字节数
select length('join') # 为4
select length('张三丰') # 9
show variables like '%char%'
# 可查询到我们使用的是utf8字符集
# utf8一个汉字三个字节
# gbk一个汉字两个字节
# 拼接字符串
select concat(last_name,_,first_name) from employees
#大小写
select upper('john');
select lower('JHON');
#将姓变大写 名变小写 然后拼接
select concat(last_name,'_',first_name) 姓名 from employee;
# 截取字符 注意索引从1开始
# 这个数字是指字符长度而不是字节长度
select substr('rush',2); # ush
select substr('rush',2,3); # us
# 查找位置
select instr('rush','sh'); # 3 如果找不到返回0
# 去掉某字符
select trim(' rush ');
# 去空格 rush
select trim('r' from 'rush');
# ush
# 插入字符 这是向左填充 字符是指插入后总长度 相似的是rpad 数字太小了会截断
select lpad('rush','6','!');
# !!rush
#replace 替换
select replace('rush','sh','a')
# rua
# round 四舍五入
select round(1.45); #1
select round(1.6); #2
select round(-1.6); #-2
select round(1.567,2) #保留两位
#ceil 向上取整
select ceil(1.002); #2
select ceil(1.00); #1
#floor 向下取整
select ceil(1.002); #1
select ceil(1.00); #1
select ceil(-9.99) #-10
#truncate 截断
select truncate(1.6999,1); #1.6
#mod取余
select mod(10,3); #1
select mod(-10,-3); #-1
select mod(10,-3); #1
#now 返回当前系统日期+时间
select now();
#curdate 返回当前系统日期,不包含时间
select curdate();
#curtime 返回当前时间 不包含日期
select curtime();
#可以获取指定的部分 年、月、日、小时、分钟、秒
select year(now()) 年;
select year('1998-1-1') 年;
#转换日期函数
select str_to_date('1998-3-2','%Y-%c-%d');
#根据日期查询
select * from employees where hiredate = str_to_date('4-3 1992','%c-%d %Y');
#将日期转换成字符
select date_format(now(),'%y年%m月%d日')
#起到if-else的效果
select if(10<5,'大','小');
#switch-case
select salary,department_id,
case department_id
when 30 then salary*1.1
when 40 then salary*1.2
else salary
end
from employees;
select salary
case
when salary>20000 then 'A'
when salary>15000 then 'B'
when salary>10000 then 'C'
else 'D'
END
from employees
如果一个包含多个步骤的业务操作,被事务管理,要么同时成功,要么同时失败.(银行转账)
操作:
开启事务:start transaction;
回滚:roll back;
提交:commit;
start transaction;
update account set balance = 1000;
update account set balance =banlance - 500 where name = 'zhangsan';
update account set balance =banlance + 500 where name = 'lisi';
commit;
roll back;
mysql默认自动提交 若语句中运行了start transaction,则必须commit,否则,为临时状态,关闭后数据会回滚.
若已开启事务,增删改一次则自动提交一次.
查看 select @@autocommit; --1自动 0手动
修改: set @@autocommit = 0;
多个事务之间是隔离的,相互独立的,但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题.
read uncommitted:读未提交
会产生的问题:脏读、不可重复读、幻读
read committed:读已提交(oracle默认)
会产生的问题:不可重复读、幻读
repeatable read:可重复读(mysql默认)
会产生的问题:幻读
serializable:串行化
可以解决所有的问题
注意:隔离级别从小到大安全性越来越高,效率越来越低.
查询隔离:select @@tx_isolation;
设置:set global transaction isolation level 级别字符串;(如read uncommitted)
并且,设置后要重新打开sqlyog!!!
视图就是虚拟表、临时表
通过表动态生成的数据,只保存了sql逻辑,不保存查询结果。
创建
create view v1
as
select stuname,majorname
from stuinfo s
inner join major m on s.'majorid'=m.'id';
select * from v1 where stuname like '张%'
修改
create or replace view 视图名
as 。。。。
alter view 视图名
as 。。。。
删除(需要权限)
drop view 视图名
查看视图
desc 视图名
show create view 视图名
mysql日志主要分为
在Mysql数据库中,错误日志功能是默认开启的,并且无法被关闭。错误日志默认存储在mysql数据库的数据文件中。错误日志文件名通常是主机名.err。
错误日志记录:服务器启动关闭信息、运行错误信息、时间调度器运行一个事件时产生的信息、在服务器上启动进程产生的信息。
默认情况下,查询日志是关闭的。如果在高并发的情况下开启会产生大量不必要的数据,会影响mysql的性能。
用来记录执行时间超过指定时间的查询语句。对服务器性能影响很小。还记录由于其他资源被征用造成阻塞等记录。
InnoDB特有,可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其日志拷贝,再把修改行为记录到持久化的硬盘的事务日志中,而不用每次都将修改的数据本身持久到磁盘。如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动回复这部分修改的数据。
也叫变更日志,主要用于记录修改数据或有可能引起数据改变的mysql语句,并记录语句发生时间、执行时间、操作的数据等等。
mysql> show global variables like '%log%';
+-----------------------------------------+--------------------------------+
| Variable_name | Value |
+-----------------------------------------+--------------------------------+
| back_log | 250 |
| binlog_cache_size | 32768 |
| binlog_checksum | CRC32 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_error_action | IGNORE_ERROR |
| binlog_format | STATEMENT |
| binlog_gtid_simple_recovery | OFF |
| binlog_max_flush_queue_time | 0 |
| binlog_order_commits | ON |
| binlog_row_image | FULL |
| binlog_rows_query_log_events | OFF |
| binlog_stmt_cache_size | 32768 |
| binlogging_impossible_mode | IGNORE_ERROR |
| expire_logs_days | 0 |
| general_log | OFF |
| general_log_file | /var/lib/mysql/kafka2.log |
| innodb_api_enable_binlog | OFF |
| innodb_flush_log_at_timeout | 1 |
| innodb_flush_log_at_trx_commit | 2 | ===>【事务日志】详解[1]
| innodb_locks_unsafe_for_binlog | OFF |
| innodb_log_buffer_size | 33554432 |
| innodb_log_compressed_pages | ON |
| innodb_log_file_size | 536870912 |
| innodb_log_files_in_group | 2 | ===>【事务日志】至少2个
| innodb_log_group_home_dir | ./ | ===>【事务日志】定义innodb事务日志组的文件目录
| innodb_mirrored_log_groups | 1 | ===>【事务日志】表示对日志组做镜像
| innodb_online_alter_log_max_size | 134217728 |
| innodb_undo_logs | 128 |
| log_bin | OFF |
| log_bin_basename | |
| log_bin_index | |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| log_error | ./kafka2.err | ===>【错误日志】错误日志输出目录以及错误日志文件名
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| log_throttle_queries_not_using_indexes | 0 |
| log_warnings | 1 | ===>【错误日志】是否把警告信息添加进错误日志中
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| max_relay_log_size | 0 |
| relay_log | |
| relay_log_basename | |
| relay_log_index | |
| relay_log_info_file | relay-log.info |
| relay_log_info_repository | FILE |
| relay_log_purge | ON |
| relay_log_recovery | OFF |
| relay_log_space_limit | 0 |
| simplified_binlog_gtid_recovery | OFF |
| slow_query_log | OFF | ===>【慢日志】查看慢日志是否开启
| slow_query_log_file | /var/lib/mysql/kafka2-slow.log | ===>【慢日志】查看慢日志的文件目录以及文件名
| sql_log_bin | ON |
| sql_log_off | OFF |
| sync_binlog | 0 |
| sync_relay_log | 10000 |
| sync_relay_log_info | 10000 |
+-----------------------------------------+--------------------------------+
61 rows in set (0.00 sec)
查看慢日志
show global variables like 'long%';
查看二进制日志
show global variables like "%log_bin%";
随着系统应用访问量增大,数据库的读写访问压力也随之增大,当达到了一定的瓶颈时,数据库读写效率变得很低。我们通常使用Mysql集群来解决此类问题。
为了减轻主库的压力,应该在系统应用层面做读写分离,写操作使用主库,读操作使用分库。
读写分离及主从同步,分散了数据库的访问压力,提升了整个系统的性能和可用性,降低了大访问量引发数据库宕机的故障率。
复制的结果是集群(Cluster)中的所有数据库服务器的数据理论上都是一样的,都是同一份数据,Mysql默认内建的复制策略是异步的,基于不同的配置,Slave(分库)不一定要一直和Master(主库)保持连接不断的复制或等待复制,我们可以指定复制所有的数据库,一部分数据库,甚至是某个数据库的某部分的表。
Mysql复制支持多种不同的策略。
Master要等待所有Slave应答之后才会提交
Mysql对DB操作的提交通常是先对操作事件进行二进制日志文件写入然后再进行提交
Master只要等待一个Slave就可以提交
Master不需要等待Slave
设置Slave要落后Master的时间
根据binlog日志格式的不同,Mysql复制同时支持多种不同的复制模式
Mysql复制是一种Scale-out方案(水平扩展),将原来的单点负载扩散到多台Slave机器中去,从而提高总体的服务性能。读写分离,使得职能更加专一,一定程度上提高总体的服务性能。
一台Slave挂掉还可以从其他的Slave读取(数据理论上相同),如果配置了主从切换,Master挂掉还可以使用Slave负责写入,使得运维人员不至于绝望。
使用Slave数据分析,Master继续干活,这样不会影响Master性能。