http://yum.mariadb.org/10.4/centos8-amd64/

1. 下载与安装

1.1 mac电脑

1.1.1 安装流程

  1. 软件傻瓜式点击下一步,中间有一个需要设置密码
  2. 设置环境变量,并且在设置中开启mysql
  3. 打开终端mysql -u root -p然后输入mysql的密码

    1.1.2 设置环境变量

  4. 设置环境变量

    1. 找文件设置
      1. 打开finder(访达),快捷键command+shift+G,输入~/.bash_profile,前往
      2. 双击打开文件.bash_profile,没有的话就新建(该文件为隐藏文件)
      3. 文件内输入export PATH=$PATH:/usr/local/mysql/bin,保存,第一步结束
    2. 终端设置
      1. vim ~/.bash_profile
      2. i编辑,在最后面添加export PATH=$PATH:/usr/local/mysql/bin
  5. 刷新环境变量

    1. 找文件设置
      1. 打开finder(访达),快捷键command+shift+G,输入~/.zshrc
      2. 双击打开该文件(同为隐藏文件),没有就新建。
      3. 文件最后,增加一行: source ~/.bash_profile
      4. 即可实现 source ~/.bash_profile 始终生效
    2. 终端设置
      1. 终端输入source ~/.bash_profile(source:使该文件立即生效)
      2. 之后也是可以识别mysql命令的,但仅仅单次有效,重启终端失效

        1.2.3 MySQL卸载

  6. sudo rm /usr/local/mysql

  7. sudo rm -rf /usr/local/mysql*
  8. sudo rm -rf /Library/StartupItems/MySQLCOM
  9. sudo rm -rf /Library/PreferencePanes/My*
  10. rm -rf ~/Library/PreferencePanes/My*
  11. sudo rm -rf /Library/Receipts/mysql*
  12. sudo rm -rf /Library/Receipts/MySQL*
  13. sudo rm -rf /var/db/receipts/com.mysql.*

    1.2 虚拟机安装

    1.2.1 视频教程

  14. https://class.imooc.com/lesson/1236#mid=29442

  15. https://class.imooc.com/lesson/1236#mid=30704

    1.2.2 文字教程

    ```makefile

    环境

    CentOS 7、MySQL 8

检查当前系统中是否存在MySQL

rpm -qa|grep mysql

依次删除上一个命令查询出来的目录,没有则忽略即可

rpm -r —nodeps xxx…

查询是否还有mysql的文件和库

find / -name mysql

删除上一个命令查询出来的目录,没有则忽略即可

rm -rf xxx

上传下载MySQL Yum存储库

mysql80-community-release-el7-6.noarch.rpm

使用以下命令安装下载的发行包,version-number: 换成和上面的包名称一样

sudo yum install mysql80-community-release-el7-{version-number}.noarch.rpm

通过以下命令安装 MySQL,—nogpgcheck: 禁掉GPG验证检查,具体看bug章节

sudo yum install mysql-community-server —nogpgcheck

启动MySQL

systemctl start mysqld

查看MySQL进程

ps -ef|grep mysqld

命令检查 MySQL 服务器的状态

systemctl status mysqld

查看临时密码,这个密码对应的账户是root账户

sudo grep ‘temporary password’ /var/log/mysqld.log

进入MySQL客户端

mysql -uroot -p

修改临时密码,注意复杂一点

mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘@Aroot1234’;

刷新权限,注意: 自己测试不刷新好像也没问题

mysql> flush privileges

  1. <a name="ykcVL"></a>
  2. ### 1.2.3 文图教程
  3. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/26687455/1654224949565-c82927cc-ad94-455f-9e5c-78c6bb1f4201.png#clientId=u464d533c-7efe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=268&id=cY5mj&margin=%5Bobject%20Object%5D&name=image.png&originHeight=536&originWidth=1714&originalType=binary&ratio=1&rotation=0&showTitle=false&size=85529&status=done&style=none&taskId=u00f11e09-1238-4a3b-a29b-7b34c1b46fb&title=&width=857)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/26687455/1654224969580-e31a6264-a6e6-4d8e-91c4-fdf3b4a5bee1.png#clientId=u464d533c-7efe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=680&id=pxamU&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1360&originWidth=2060&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1199013&status=done&style=none&taskId=ubb02644e-bdd9-4b90-90b6-35fe0b6903e&title=&width=1030)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/26687455/1654224999573-6e7ced78-54bf-42a2-b20b-e4779406e7f8.png#clientId=u464d533c-7efe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=796&id=DbdI0&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1592&originWidth=2164&originalType=binary&ratio=1&rotation=0&showTitle=false&size=450637&status=done&style=none&taskId=u0ae73e74-373b-4f40-8fe3-fd27bf8fc7b&title=&width=1082)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/26687455/1654225026995-52c5cce7-0be2-41a8-8b3f-1504246a7b7f.png#clientId=u464d533c-7efe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=816&id=VE2Kc&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1632&originWidth=2288&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1220284&status=done&style=none&taskId=ue7be5251-bd7d-48f7-a566-72ed859c84d&title=&width=1144)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/26687455/1654225055510-17eaf808-1239-4695-98af-6600cb13858e.png#clientId=u464d533c-7efe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=742&id=vjkv0&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1484&originWidth=2204&originalType=binary&ratio=1&rotation=0&showTitle=false&size=427644&status=done&style=none&taskId=udfe0d545-55e3-42c1-8471-1627c96aa0c&title=&width=1102)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/26687455/1654225103316-39825279-f252-4ad7-abf8-92ef1e3b3e90.png#clientId=u464d533c-7efe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=716&id=JhcY3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1432&originWidth=2840&originalType=binary&ratio=1&rotation=0&showTitle=false&size=586810&status=done&style=none&taskId=ue263ad4e-0d95-455a-9fc2-a211f49914e&title=&width=1420)
  4. <a name="OiwpD"></a>
  5. ### 1.2.4 遇到的一些bug
  6. <a name="VzZlM"></a>
  7. ### 1.2.5 navicat连接MySQL
  8. ```makefile
  9. ## 创建用户"YiHua",由于navicat使用的是老版本的加密方式,所以使用mysql_native_password
  10. mysql> create user 'YiHua'@'%' identified with mysql_native_password by '@Aroot1234';
  11. ## 赋予权限
  12. mysql> grant all on *.* to 'YiHua'@'%'
  13. ## 刷新配置
  14. mysql> flush privileges;
  15. ## 关闭防火墙
  16. systemctl stop firewalld
  17. ## 这里防火墙的设置问题? 后续在学习
  18. 是长久关闭所有端口?
  19. 本次启动关闭所有端口?
  20. 本次启动单独关闭3306端口?
  21. 长久关闭3306端口?

1. 数据类型

1.1 VARCHAR (50) 中的 50 到底是能存 50 个字还是 50 个字节?

VARCHAR的括号中的数字代表的是字符。如果存的是字节,由于中文、英文和emojiutf-8中的字节数都不一样,势必会给编程造成一定的困扰。

1.2 CHAR (50) 和 VARCHAR (50) 有什么区别?

  1. 存储方式上存在着差异
    1. CHAR 是定长字符,MySQL 数据库会根据建表时定义的长度给它分配相应的存储空间,不足的部分用空格填充
    2. 而 VARCHAR 是可变长度字符的数据类型,在存储时只使用必要的空间。
  2. CHAR 数据类型的这个特性,在将数据写入表中时,如果字符串尾部存在空格,会被自动删除,而 VARCHAR 数据类型会保留这个空格,在一些特殊场景中要注意这个问题。所以推荐你使用 CHAR 数据类型存储一些固定长度的字符串,比如身份证号、手机号、性别等
  3. CHAR 和 VARCHAR 的存储长度不同

    1. CHAR 数据类型可定义的最大长度是 255 个字符
    2. VARCHAR 根据所使用的字符集不同,最大可以使用 65535 个字节

      1.3 VARCHAR能使用的最大长度是多少?

  4. InnoDB的数据页默认是16K,每个页中至少存放2行数据,因此建议VARCHAR字段的总长度不要超过8K

  5. 由于存储的是字符,utf-8字符集中一个汉字占用3个字节,因此我们能创建的最大长度理论上应该是 21845(65535/3=21845),但是为什么 varchar(21845) 仍然报错,而使用varchar(21844) 却创建成功
  6. 虽然MySQL官方定义了最大行长度是65535个字节,但是因为还有别的开销,我们能使用的最大行长度只有65532(理解:就想向以前的SD卡一样,64G内存永远小于64
  7. MySQL的最大行长度限制不只是1VARCHAR列,而是所有列的长度总和

    1.4 常见的几个数据类型的长度

  8. tinyint:1字节,2^7 - 1

  9. int:4字节,2^15 - 1
  10. bigint:8字节,2^63 - 1

    2. 事务、隔离级别

    2.1 事务的四大特性

    2.2 事务的隔离级别

    3. 锁

    3.1 InnoDB行锁

    3.2 mysql的乐观锁和悲观锁

    3.3 共享锁和排它锁

    4. 索引

    5. sql优化

6. 主从同步

6.1 概念解析

  1. 解决数据库读写压力的方案
  2. 读写分离 = 主从配置
  3. 主库用来写操作,读库用来查询操作
  4. 主从同步的原理

    1. 主库已经存在的大量数据通过文件一次性同步
    2. 后续增量数据,从库订阅主库的bin-log的位置同步数据

      6.2 案例环境说明

  5. 教程来源架构师-分库分表章节

    1. https://class.imooc.com/lesson/1236#mid=30703
    2. https://class.imooc.com/lesson/1236#mid=29447
  6. 案例配置的是1主1从模式
  7. 主数据库:192.168.73.131
  8. 从数据库:192.168.73.130
  9. 案例模拟的是:主库已经存在相当的数据,后续升级为主从配置

    6.3 修改配置文件

    6.3.1 文件的属性说明

  10. my.confMySQL的主要配置文件,大概率在/etc/my.conf

  11. log-binbin-log文件的名称
  12. server-idMySQL实例中全局唯一,默认为1,且必须大于0,既然全局唯一主从配置不能一样

    6.3.2 实际的配置

  13. 主数据库配置:编辑主库的my.conf

    1. log-bin=imooc_mysql
    2. server-id=1
  14. 从数据库配置:编辑从库的my.conf
    1. server-id=2
  15. 配置完成后重启数据库:service mysqld restart,注意配置完my.conf之后就重启

    6.4 在主库上创建用于备份账号

  16. mysql> create user 'repl'@'%' identified by 'password';

  17. mysql> grant replication save on *.* TO 'repl'@'%';
  18. mysql> flush privileges;(刷新权限)

    6.5 将主库现有数据同步到从库

  19. 给主库加锁,阻止所有的写入操作

    1. mysql> flush tables with read lock;
  20. 查看主库上bin-log文件的位置
    1. mysql > show master status;
    2. image.png
  21. 从主库上dump所有的数据,注意下面的命令不能在MySQL的命令行执行
    1. 导出数据:mysqldump --all-databases --master-data > dbdump.db -uroot -p
    2. 上面的数据就导出到/root目录下面了
    3. 复制到从库,进入130/root目录:scp root@192.168.73.131:~/dbdump.db .
  22. 给主库解锁
    1. mysql> unlock tables;
  23. 在从库上导入主库的数据

    1. mysql < dbdump.db -uroot -p

      6.6 在从库上配置主从连接信息

  24. 从库订阅主库的bin-log位置

    1. mysql> change master to
    2. master_host='192.168.73.131',:主库的地址
    3. master_root='repl',:要是有备份账号的信息
    4. master_passpord='passpord',:和上一条一样
    5. master_log_file='imooc_mysql.000001',:主库的bin-log的名称
    6. master_log_pos='854';:主库的bin-log的位置
  25. 开启主从同步
    1. mysql> start slave;
  26. 查看从库的状态
    1. show slave status;

面试题

海量数据分页问题

问题的一个背景:使用limit分页查询,查询第一页和查询第10000页的性能区别
https://wenku.baidu.com/view/afb1934224d3240c844769eae009581b6bd9bdbd.html
https://www.zhihu.com/question/483374102