MySQL高级(三)

时间:2026-10-28 16:42:29 来源:幸福记忆 作者:远方 阅读:67

一、慢查询

mysql默认没有开启慢查询功能。mysql开启慢查询后,会将查询语句执行时长超过10s的语句记录到指定的日志文件,有助于sql的优化。  

1、开启慢查询

  • 临时开启

#--开启慢查询
set global slow_query_log='ON';
#--设置慢查询日志的位置
set global slow_query_log_file='log file directory';
  • 永久开启

vim: /etc/my.cnf   注意:修改完配置后需要重启mysql服务器

#开启慢查询
slow_query_log = ON
#log-slow-queries:代表MYSQL慢查询的日志存储目录,此目录文件一定要有写权限;
log-slow-queries="/usr/mysql/mysql-slow.log"
#最长执行时间 (查询的最长时间,超过了这个时间则记录到日志中) .
long_query_time = 1
#没有使用到索引的查询也将被记录在日志中
log-queries-not-using-indexes = ON

二、mysql中的事件调度

1、简介

自MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。更值得一提的是MYSQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。  

2、开启事件调度

临时开启:

#查询
SHOW VARIABLES LIKE 'event_%';
#开启事件调度
SET GLOBAL event_scheduler = 1;

永久开启:

[mysqld]
event_scheduler = 1

3、事件调度基本语法

基本语法:

CREATE EVENT [IF NOT EXISTS] event_name     
ON SCHEDULE schedule    
[ON COMPLETION [NOT] PRESERVE]     //执行完成一次后是否保留
[ENABLE | DISABLE]     //设置该事件创建后状态是开启或关闭,默认为ENABLE。
[COMMENT 'comment']      //对当前事件设置描述
[DO sql_statement]
-----------------------------------------------
 schedule:  
   AT TIMESTAMP [+ INTERVAL INTERVAL]  执行一次
   EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP] 周期执行

 INTERVAL:
 quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK
 | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

案例:每2秒插入一条记录到student_msg.test

create event test_evn
on schedule every 2 second
do insert into student_msg.test value (null, now());

4、修改事件调度

基本语法:

ALTER EVENT event_name     [ON SCHEDULE schedule]     
[RENAME TO new_event_name]    
[ON COMPLETION [NOT] PRESERVE]    
[COMMENT 'comment']     [ENABLE | DISABLE]    
[DO sql_statement]

案例:
1、临时关闭事件
ALTER EVENT env_name DISABLE;
2、开启事件
ALTER EVENT env_name ENABLE;
3、重命名事件并加上注释
alter event test.env_name rename to e_test comment 'e_test_cm';

删除事件:

DROP EVENT [IF EXISTS] event_name;

简要列出所有的event:

SHOW EVENTS;

查看event的创建信息:

SHOW CREATE EVENT event_name;

三、数据库设计三大范式

  • 第一范式:要求所有列不能再分割

  • 第二范式:所有列都应该依赖与主键列(直接依赖,间接依赖)

  • 第三范式:所有列都应该直接依赖于主键列

四、JDBC

提供java的sql编程规范,其实现由各个数据库厂商提供(驱动Driver)

1、远程仓库(国内镜像)

https://maven.aliyun.com/

maven依赖:  

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.8</version>
</dependency>

五、主从复制

mysql5.6+版本中的一些细节

1、配置文件

-----my.ini  

主库:

[mysqld]
# 设置3306端口
port=3306
# 主库ID,主从不能相同
server-id=1
# 设置要同步的数据库
binlog-do-db=student_management
# 二进制日志名称
log-bin=mysql-bin

从库:

[mysqld]
# 设置3307端口
port=3307
# 从库ID
server-id=2
# 从库要同步的主库数据库名
replicate-do-db=student_management
log-bin=mysql-bin

------data\auto.cnf  

#主从服务器的不能相同
[auto]
server-uuid=xxx

2、相关操作

主库   1、登录主库   2、为从库创建一个用户并且赋予它复制二进制日志的权限及数据库操作权限:  

create user 'yf'@'127.0.0.1' identified by '123456';
GRANT REPLICATION SLAVE ON *.* TO 'yf'@'127.0.0.1';

3、在主数据库里面运行show master status;记下file和position字段对应的参数  

从库   1、登录从库并设置同步信息

change master to master_host='127.0.0.1',master_port=3306,
master_user='yf',master_password='123456',
master_log_file='mysql-bin.000001',master_log_pos=342;

2、启动slave

start slave;

3、检查状态  

show slave status\G
说明:如下两项同为yes,表示操作成功
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
 ...