Mysql函数
字符函数
# 获取字节数select length(\'join\') # 为4select length(\'张三丰\') # 9show 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); # ushselect substr(\'rush\',2,3); # us# 查找位置select instr(\'rush\',\'sh\'); # 3 如果找不到返回0# 去掉某字符select trim(\' rush \');# 去空格 rushselect trim(\'r\' from \'rush\');# ush# 插入字符 这是向左填充 字符是指插入后总长度 相似的是rpad 数字太小了会截断select lpad(\'rush\',\'6\',\'!\');# !!rush#replace 替换select replace(\'rush\',\'sh\',\'a\')# rua
数学函数
# round 四舍五入select round(1.45); #1select round(1.6); #2select round(-1.6); #-2select round(1.567,2) #保留两位#ceil 向上取整select ceil(1.002); #2select ceil(1.00); #1#floor 向下取整select ceil(1.002); #1select ceil(1.00); #1select ceil(-9.99) #-10#truncate 截断select truncate(1.6999,1); #1.6#mod取余select mod(10,3); #1select mod(-10,-3); #-1select 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-caseselect salary,department_id,case department_idwhen 30 then salary*1.1when 40 then salary*1.2else salaryendfrom employees;select salarycasewhen salary>20000 then \'A\'when salary>15000 then \'B\'when salary>10000 then \'C\'else \'D\'ENDfrom 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;
事务的四大特征
- 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败.
- 持久性:回滚后或提交后数据会一直驻留.
- 隔离性:多个事务之间,相互独立.
- 一致性:事务操作前后,数据总量不变.
事务的隔离级别
多个事务之间是隔离的,相互独立的,但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题.
- 1.脏读:一个事务,读取到另一个事物没有提交的数据.(两个窗口)
- 2.不可重复读:在一个事务中,两次读取到的数据不一样.
- 3.幻读:指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。
隔离级别
read uncommitted:读未提交
会产生的问题:脏读、不可重复读、幻读
read committed:读已提交(oracle默认)
会产生的问题:不可重复读、幻读
repeatable read:可重复读(mysql默认)
会产生的问题:幻读
serializable:串行化
可以解决所有的问题
注意:隔离级别从小到大安全性越来越高,效率越来越低.
查询隔离:select @@tx_isolation;
设置:set global transaction isolation level 级别字符串;(如read uncommitted)
并且,设置后要重新打开sqlyog!!!
Mysql视图
视图就是虚拟表、临时表
通过表动态生成的数据,只保存了sql逻辑,不保存查询结果。
创建
create view v1asselect stuname,majornamefrom stuinfo sinner 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数据库中,错误日志功能是默认开启的,并且无法被关闭。错误日志默认存储在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主从复制
随着系统应用访问量增大,数据库的读写访问压力也随之增大,当达到了一定的瓶颈时,数据库读写效率变得很低。我们通常使用Mysql集群来解决此类问题。
什么是主从复制
为了减轻主库的压力,应该在系统应用层面做读写分离,写操作使用主库,读操作使用分库。
读写分离及主从同步,分散了数据库的访问压力,提升了整个系统的性能和可用性,降低了大访问量引发数据库宕机的故障率。
复制的结果是集群(Cluster)中的所有数据库服务器的数据理论上都是一样的,都是同一份数据,Mysql默认内建的复制策略是异步的,基于不同的配置,Slave(分库)不一定要一直和Master(主库)保持连接不断的复制或等待复制,我们可以指定复制所有的数据库,一部分数据库,甚至是某个数据库的某部分的表。
复制策略
Mysql复制支持多种不同的策略。
- 同步策略
Master要等待所有Slave应答之后才会提交
Mysql对DB操作的提交通常是先对操作事件进行二进制日志文件写入然后再进行提交
- 半同步策略
Master只要等待一个Slave就可以提交
- 异步策略
Master不需要等待Slave
- 延迟策略
设置Slave要落后Master的时间
复制模式
根据binlog日志格式的不同,Mysql复制同时支持多种不同的复制模式
- 基于语句的复制,即Statement Based Replication(SBR),记录每一条更改数据的sql优点:binlog文件较小,节约I/O,性能较高。
- 缺点:不是所有的数据更改都写入binlog,一些特殊函数和不确定的语句操作,会导致主从数据无法复制的问题。
- 优点:全面而详细,记录每一行的细节
主从复制的优点
性能
Mysql复制是一种Scale-out方案(水平扩展),将原来的单点负载扩散到多台Slave机器中去,从而提高总体的服务性能。读写分离,使得职能更加专一,一定程度上提高总体的服务性能。
故障恢复
一台Slave挂掉还可以从其他的Slave读取(数据理论上相同),如果配置了主从切换,Master挂掉还可以使用Slave负责写入,使得运维人员不至于绝望。
数据分析
使用Slave数据分析,Master继续干活,这样不会影响Master性能。