Debian10安装MySQL

1、官网下载mysql 官网地址:https://dev.mysql.com/downloads/repo/apt/

2、下载下来之后cd mysql*.deb文件夹中打开终端 sudo dpkg -i *.deb 弹出图形界面选择ok

3、在终端中 sudo apt-get update

4、sudo apt-get install mysql-server

解决MySQL时区问题

1.查询时区

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')); 
或者:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP); 

2.修改时区

set global time_zone = '+8:00';  ##修改mysql全局时区为北京时间,即我们所在的东8区
set time_zone = '+8:00';  ##修改当前会话时区
flush privileges;  #立即生效

3.JDBC连接数据库时

设置SetTimeZone = "Asia/ShangHai"
GMT
jdbc.url = jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8

学习笔记:

SqlMapConfig.xml

1.头标签:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

一级缓存的分析

一级缓存是SqlSession对象的缓存。当SqlSession对象消失时,一级缓存也会消失

一级缓存是Sqlsession 范围的缓存,当调用SqlSession的修改i、添加、删除、commit()、close()、clearCache();方法的时候会清除一级缓存

二级缓存的分析

​ 二级缓存是SqlsessionFactory的对象缓存(存放的是数据),由同一个SqlSessionFactory对象创建对策SqlSession共享其缓存

使用步骤:

​ 第一步:Mybatis框架支持二级缓存(SqlMapConfig.xml)

​ 第二步:让当前因施工和文件支持二级缓存(IUserDao.xml文件中)

​ 第三步:让当前操作支持二级缓存(在Select标签中)

image-20200803224025883

调用结果:

image-20200803223903545

注解开发

在MyBatis中针对CRUD一共有四个注解:@SELECT @INSERT @UPDATE @DELETE

MySQL语句优化

1. 所有表必须使用 Innodb 存储引擎

没有特殊要求(即 Innodb 无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用 Innodb 存储引擎(MySQL5.5 之前默认使用 Myisam,5.6 以后默认的为 Innodb)。

Innodb 支持事务,支持行级锁,更好的恢复性,高并发下性能更好。

2. 数据库和表的字符集统一使用 UTF8

兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效,如果数据库中有存储 emoji 表情的需要,字符集需要采用 utf8mb4 字符集。

3. 所有表和字段都需要添加注释

使用 comment 从句添加表和列的备注,从一开始就进行数据字典的维护

4. 尽量控制单表数据量的大小,建议控制在 500 万以内。

500 万并不是 MySQL 数据库的限制,过大会造成修改表结构,备份,恢复都会有很大的问题。

可以用历史数据归档(应用于日志数据),分库分表(应用于业务数据)等手段来控制数据量大小

5. 谨慎使用 MySQL 分区表

分区表在物理上表现为多个文件,在逻辑上表现为一个表;

谨慎选择分区键,跨分区查询效率可能更低;

建议采用物理分表的方式管理大数据。

6.尽量做到冷热数据分离,减小表的宽度

MySQL 限制每个表最多存储 4096 列,并且每一行数据的大小不能超过 65535 字节。

减少磁盘 IO,保证热数据的内存缓存命中率(表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的 IO);

更有效的利用缓存,避免读入无用的冷数据;

经常一起使用的列放到一个表中(避免更多的关联操作)。

7. 禁止在表中建立预留字段

预留字段的命名很难做到见名识义。

预留字段无法确认存储的数据类型,所以无法选择合适的类型。

对预留字段类型的修改,会对表进行锁定。

8. 禁止在数据库中存储图片,文件等大的二进制数据

通常文件很大,会短时间内造成数据量快速增长,数据库进行数据库读取时,通常会进行大量的随机 IO 操作,文件很大时,IO 操作很耗时。

通常存储于文件服务器,数据库只存储文件地址信息

9. 禁止在线上做数据库压力测试

10. 禁止从开发环境,测试环境直接连接生成环境数据库

Q&A

一条SQL语句执行得很慢的原因有哪些?

​ 分类讨论:

​ 1.大多数情况下正常,偶尔的情况下很慢

​ 2.在数据量不变的情况下,一直执行很慢

针对偶尔很慢的情况(1)

  1. 数据库在刷新脏页(Flush)
当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”

1. **redolog满了:** redo log的容量有限,如果数据库一直处于繁忙,更新也很频繁数据库很快就会被写满;数据库只能暂停其他的操作,用来将数据同步到磁盘当中
2. **内存不够用:** 如果一次查询较多的数据,恰好碰到所查数据页不在内存中时,需要申请内存,若此时内存不够就需要释放一些数据页,干净页直接释放;脏页就需要刷新脏页
3. **MySQL 认为系统“空闲”的时候:**这时系统没什么压力。
4. **MySQL 正常关闭的时候:**这时候,MySQL 会把内存的脏页都 flush 到磁盘上,这样下次 MySQL 启动的时候,就可以直接从磁盘上读数据,启动速度会很快。

2. 拿不到锁

如果所需要执行的表被其他的操作所上锁,只能在其他操作释放锁后再执行;判断是否在等待可以使用 show processlist查看当前的状态

针对一直比较慢的情况(2)

#案例表
mysql> CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `c` int(11) DEFAULT NULL,
  `d` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
  1. 没有用到索引:
 ​	**(1) 字段没有索引**

 ```sql
 select * from t where 100 <c and c < 100000;
 ```

 ​	**(2) 字段有索引,却没有用索引(此时,字段C有索引)**

 ```sql
 select * from t where c - 1 = 1000;
 ```

 ```sql
 #正确的操作
 select * from t where c = 1000 + 1S;
 ```

 ​	**(3) 函数操作导致没有用上索引**

 ​	

 ```sql
 select * from t where pow(c,2) = 1000;
 ```
 
2. 数据库自己选错了索引

 ### 总结

 ![image-20200914145026526](https://raw.githubusercontent.com/WangJiyuanYo/typora-images/main/image-20200914145026526.png)

Q.E.D.


纵我不往,子宁不嗣音?。纵我不往,子宁不来?