MySQL高级知识(一)——基础

MySQL高级知识(一)——基础

  • MySQL高级知识——基础
    • 1. MySQL概述
    • 2. MySQL高手必备
    • 3. MySQL的Linux版本安装(非重点)
      • 3.1. 下载地址
      • 3.2. 拷贝&解压缩
      • 3.3. 检查工作
      • 3.4. 安装
      • 3.5. 查看MySQL安装版本
      • 3.6. MySQL服务的启动+停止+查看状态
      • 3.7. 首次登录
      • 3.8. MySQL安装位置
      • 3.9. 自启动MySQL服务
      • 3.10. 修改字符集问题
    • 4. MySQL配置文件(重点了解一下)
    • 5. MySQL的用户与权限管理
      • 5.1. MySQL的用户管理
      • 5.2. 权限设置
      • 5.3. 查看权限
      • 5.4. 通过工具远程访问
    • 6. MySQL的一些杂项配置
      • 6.1. 大小写问题
      • 6.2. sql_mode
    • 7. MySQL逻辑架构介绍(重点了解一下)
      • 7.1. 连接层
      • 7.2. 服务层
      • 7.3. 引擎层
      • 7.4. 存储层
    • 8. MySQL存储引擎
      • 8.1. 查看命令
      • 8.2. 各个引擎简介
      • 8.3. MyISAM和InnoDB(重点了解)
      • 8.4. 阿里巴巴、淘宝使用
    • 9. SQL执行顺序(重点了解)

MySQL高级知识——基础

前言:MySQL高级知识主要来自于尚硅谷中的MySQL的视频资源。(记录在此,是为了以后自己能够很方面的看到这些知识点。)

1. MySQL概述

  • 前属于Oracle公司。
  • MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
  • Mysql是开源的,所以你不需要支付额外的费用。
  • Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。
  • Mysql支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
  • MySQL使用标准的SQL数据语言形式。
  • Mysql可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
  • MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
  • 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

2. MySQL高手必备

  1. 数据库内部结构和原理
  2. 数据库建模优化
  3. 数据库索引建立
  4. SQL语句优化
  5. SQL编程
  6. mysql服务器的安装配置
  7. 数据库的性能监控分析与系统优化
  8. 各种参数常量设定
  9. 主从复制
  10. 分布式架构搭建、垂直切割和水平切割
  11. 数据迁移
  12. 容灾备份和恢复
  13. shell或者python等脚本语言开发
  14. 对开源数据库进行二次开发

3. MySQL的Linux版本安装(非重点)

3.1. 下载地址

官网下载地址:http://dev.mysql.com/downloads/mysql/

3.2. 拷贝&解压缩

网上搜索linux的ftp传输以及解压缩命令,之后解压缩。

3.3. 检查工作

  • 检查当前系统是否安装过mysql
    执行安装命令前,先执行查询命令
    rpm -qa|grep mysql
    如果存在mysql-libs的旧版本包如下:
    MySQL高级知识(一)——基础_第1张图片
    请先执行卸载命令:rpm -e --nodeps mysql-libs
  • 检查/tmp文件夹权限、
    由于mysql安装过程中,会通过mysql用户在/tmp目录下新建tmp_db文件,所以请给/tmp较大的权限
    执行 :chmod -R 777 /tmp

3.4. 安装

在mysql的安装文件目录下执行:
rpm -ivh MySQL-server-5.5.54-1.linux2.6.x86_64.rpm
rpm -ivh MySQL-client-5.5.54-1.linux2.6.x86_64.rpm

3.5. 查看MySQL安装版本

或者可以执行 mysqladmin --version命令,类似java -version如果打出消息,即为成功。
执行结果
通过vim 查看 mysql组 和mysql组

3.6. MySQL服务的启动+停止+查看状态

  • 启动:systemctl start mysqld
  • 停止:systemctl stop mysqld
  • 状态:systemctl status mysqld

此为centos7以后的linux命令

3.7. 首次登录

查看此博客:https://blog.csdn.net/dh12313012/article/details/87274385

3.8. MySQL安装位置

在linux下查看安装目录
ps -ef | grep mysql

参数 路径 解释 备注
–basedir /usr/bin 相关命令目录 mysqladmin mysqldump等命令
–datadir /var/lib/mysql/ mysql数据库文件的存放路径
–plugin-dir /usr/lib64/mysql/plugin mysql插件存放路径
–log-error /var/lib/mysql/jack.atguigu.err mysql错误日志路径
–pid-file /var/lib/mysql/jack.atguigu.pid 进程pid文件
–socket /var/lib/mysql/mysql.sock 本地连接时用的unix套接字文件
----- /usr/share/mysql 配置文件目录 mysql脚本及配置文件
----- /etc/init.d/mysql 服务启停相关脚本

查询结果

3.9. 自启动MySQL服务

  • 自启动命令:systemctl enable mysqld
  • 关闭自启动:systemctl disable mysqld

3.10. 修改字符集问题

尝试插入数据:
MySQL高级知识(一)——基础_第2张图片
原因是字符集的问题。

  1. 查看字符集
    show variables like 'character%'
    show variables like '%char%'
    MySQL高级知识(一)——基础_第3张图片
    默认的是客户端和服务器都使用了latin1,所以会乱码。
  2. 修改my.cnf
    /usr/share/mysql/ 中找到my.cnf的配置文件,
    拷贝其中的my-huge.cnf 到 /etc/ 并命名为my.cnf
    mysql 优先选中 /etc/ 下的配置文件
    然后修改my.cnf:
[client]
default-character-set=utf8
[mysqld]
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci
[mysql]
default-character-set=utf8
  1. 重新启动mysql
    但是原库的设定不会发生变化,参数修改之对新建的数据库生效

  2. 已生成的库表字符集如何变更
    修改数据库的字符集
    mysql> alter database mytest character set 'utf8';
    修改数据表的字符集
    mysql> alter table user convert to character set 'utf8';

     但是原有的数据如果是用非'utf8'编码的话,数据本身不会发生改变。
    

4. MySQL配置文件(重点了解一下)

  1. 二进制日志log-bin该文件主要是主从复制以及备份恢复(了解)
    log-bin 中存放了所有的操作记录(写?),可以用于恢复。相当于 Redis 中的 AOF
    my.cnf中的log-bin配置(默认关闭)
    MySQL高级知识(一)——基础_第4张图片
  2. 错误日志log-error——默认是关闭的,记录严重的警告和错误信息,每次启动和关闭的详细信息等。
  3. 慢查询日志log——默认关闭,记录查询的sql语句,如果开启会降低mysql的整体性能,因为记录日志也是需要小号系统资源的
  4. Myisam存放方式
    • frm文件(framework)——存放表结构
    • myd文件(data)——存放表数据
    • myi文件(index)——存放表索引
  5. innodb存放方式
    • ibdata1——Innodb引擎将所有表的的数据都存在这里面 /usr/share/mysql/ibdata1 而frm文件存放在库同名的包下
    • frm文件——存放表结构
    • 单独存放

单独存放
MySQL高级知识(一)——基础_第5张图片
set innodb_file_per_table=on
create table mmm (id int(20) auto_increment ,name varchar(20),primary key(id));

设在为 on 后 单独以 table名.ibd 的文件名存储
在这里插入图片描述

特别提出MySQL中的重要配置文件:Windows下名为my.ini,Linux下为/etc/my.cnf。对于服务器的调优相关过程都在改配置文件中,需要特别掌握。

5. MySQL的用户与权限管理

5.1. MySQL的用户管理

  1. 创建用户
    create user zhang3 identified by '123123';
    表示创建名称为zhang3的用户,密码设为123123;
  2. 了解user表
    查看用户
    select host,user,password,select_priv,insert_priv,drop_priv from mysql.user;
    select * from user\G;
    将 user 中的数据以行的形式显示出来(针对列很长的表可以采用这个方法 )
    MySQL高级知识(一)——基础_第6张图片
  • host: 表示连接类型
    % 表示所有远程通过 TCP方式的连接
    IP 地址 如 (192.168.1.2,127.0.0.1) 通过制定ip地址进行的TCP方式的连接
    机器名 通过制定i网络中的机器名进行的TCP方式的连接
    ::1 IPv6的本地ip地址 等同于IPv4的 127.0.0.1
    localhost 本地方式通过命令行方式的连接 ,比如mysql -u xxx -p 123xxx 方式的连接。
  • User:表示用户名
    同一用户通过不同方式链接的权限是不一样的。
  • password:密码
    所有密码串通过 password(明文字符串) 生成的密文字符串。加密算法为MYSQLSHA1 ,不可逆 。
    mysql 5.7 的密码保存到 authentication_string 字段中不再使用password 字段。
  • select_priv , insert_priv等
    为该用户所拥有的权限。
  1. 设置密码
    修改当前用户的密码:
    set password =password('123456')
    修改某个用户的密码:
    update mysql.user set password=password('123456') where user='li4';
    flush privileges; #所有通过user表的修改,必须用该命令才能生效。
  2. 修改用户
    update mysql.user set user='li4' where user='wang5';
    flush privileges; ,所有通过user表的修改,必须用该命令才能生效。
  3. 删除用户
    drop user li4;
    此处不要通过delete from user u where user='li4'进行删除,系统会有残留信息保留。

5.2. 权限设置

  1. 设置权限
  • 格式:grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址 identified by ‘连接口令’;
    该权限如果发现没有该用户,则会直接新建一个用户。
    比如
    • grant select,insert,delete,drop on atguigudb.* to li4@localhost ;
      #给li4用户用本地命令行方式下,授予atguigudb这个库下的所有表的插删改查的权限。
    • grant all privileges on *.* to joe@'%' identified by '123';
      #授予通过网络方式登录的的joe用户 ,对所有库所有表的全部权限,密码设为123.
      就算 all privileges 了所有权限,grant_priv 权限也只有 root 才能拥有。
      给 root 赋连接口令 grant all privileges on *.* to root@'%' ;后新建的连接没有密码,需要设置密码才能远程连接。
    • update user set password=password('root') where user='root' and host='%';
  1. 收回权限
  • 格式:revoke 权限1,权限2,…权限n on 数据库名称.表名称 from 用户名@用户地址 ;
  • REVOKE ALL PRIVILEGES ON mysql.* FROM joe@localhost;
    #若赋的全库的表就 收回全库全表的所有权限
  • REVOKE select,insert,update,delete ON mysql.* FROM joe@localhost;
    #收回mysql库下的所有表的插删改查权限

对比赋予权限的方法。
必须用户重新登录后才能生效

5.3. 查看权限

  • 查看当前用户权限
    show grants;
  • 查看某用户的全局权限
    select * from user ;
  • 查看某用户的某库的权限
    select * from db;
  • 查看某用户的某个表的权限
    select * from tables_priv;

5.4. 通过工具远程访问

  1. 先 ping 一下数据库服务器的ip 地址确认网络畅通。
  2. 关闭数据库服务的防火墙
    service iptables stop
  3. 确认Mysql中已经有可以通过远程登录的账户
    select * from mysql.user where user='li4' and host='%';
    如果没有用户,先执行如下命令:
    grant all privileges on *.* to li4@'%' identified by '123123';
  4. 测试连接:
    MySQL高级知识(一)——基础_第7张图片

6. MySQL的一些杂项配置

6.1. 大小写问题

show variables like '%lower_case_table_names%';
MySQL高级知识(一)——基础_第8张图片
- windows系统默认大小写不敏感,但是linux系统是大小写敏感的
- 默认为0,大小写敏感。
- 设置1,大小写不敏感。创建的表,数据库都是以小写形式存放在磁盘上,对于sql语句都是转换为小写对表和DB进行查找。
- 设置2,创建的表和DB依据语句上格式存放,凡是查找都是转换为小写进行。

设置变量常采用 set lower_case_table_names = 1; 的方式,但此变量是只读权限,所以需要在配置文件中改。
当想设置为大小写不敏感时,要在my.cnf这个配置文件 [mysqld] 中加入 lower_case_table_names = 1 ,然后重启服务器。
但是要在重启数据库实例之前就需要将原来的数据库和表转换为小写,否则更改后将找不到数据库名。
在进行数据库参数设置之前,需要掌握这个参数带来的影响,切不可盲目设置。

6.2. sql_mode

MySQL的sql_mode合理设置
sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。
MySQL高级知识(一)——基础_第9张图片
使用 set sql_mode=ONLY_FULL_GROUP_BY;的方式设置会将之前的设置覆盖掉
同时设置多个限制:set sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO';

sql_mode常用值如下:

  • ONLY_FULL_GROUP_BY
    对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
  • NO_AUTO_VALUE_ON_ZERO
    该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。
  • STRICT_TRANS_TABLES
    在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制
  • NO_ZERO_IN_DATE
    在严格模式下,不允许日期和月份为零
  • NO_ZERO_DATE
    设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。
  • ERROR_FOR_DIVISION_BY_ZERO
    在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL
  • NO_AUTO_CREATE_USER
    禁止GRANT创建密码为空的用户
  • NO_ENGINE_SUBSTITUTION
    如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
  • PIPES_AS_CONCAT
    将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
  • ANSI_QUOTES
    启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符
  • ORACLE
    设置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.

7. MySQL逻辑架构介绍(重点了解一下)

MySQL高级知识(一)——基础_第10张图片
和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,
插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。

7.1. 连接层

最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

7.2. 服务层

  1. Management Serveices & Utilities: 系统管理和控制工具
  2. SQL Interface: SQL接口
    接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
  3. Parser: 解析器
    SQL命令传递到解析器的时候会被解析器验证和解析。
  4. Optimizer: 查询优化器。
    SQL语句在查询之前会使用查询优化器对查询进行优化。
    用一个例子就可以理解: select uid,name from user where gender= 1;
    优化器来决定先投影还是先过滤。
  5. Cache和Buffer: 查询缓存。
    如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
    这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
    缓存是负责读,缓冲负责写。

7.3. 引擎层

存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。后面介绍MyISAM和InnoDB

7.4. 存储层

数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。

8. MySQL存储引擎

8.1. 查看命令

  1. 查看mysql现在已经提供什么样的存储引擎:

mysql> show engines;
MySQL高级知识(一)——基础_第11张图片

  1. 查看mysqll当前默认的存储引擎:
    mysql> show variables like '%storage_engine%';
    MySQL高级知识(一)——基础_第12张图片

8.2. 各个引擎简介

  1. InnoDB存储引擎
    InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。行级锁,适合高并发情况

  2. MyISAM存储引擎
    MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁(myisam改表时会将整个表全锁住),有一个毫无疑问的缺陷就是崩溃后无法安全恢复。

  3. Archive引擎
    Archive存储引擎只支持INSERT和SELECT操作,在MySQL5.1之前不支持索引。
    Archive表适合日志和数据采集类应用。适合低访问量大数据等情况。
    根据英文的测试结论来看,Archive表比MyISAM表要小大约75%,比支持事务处理的InnoDB表小大约83%。

  4. Blackhole引擎
    Blackhole引擎没有实现任何存储机制,它会丢弃所有插入的数据,不做任何保存。但服务器会记录Blackhole表的日志,所以可以用于复制数据到备库,或者简单地记录到日志。但这种应用方式会碰到很多问题,因此并不推荐。

  5. CSV引擎
    CSV引擎可以将普通的CSV文件作为MySQL的表来处理,但不支持索引。
    CSV引擎可以作为一种数据交换的机制,非常有用。
    CSV存储的数据直接可以在操作系统里,用文本编辑器,或者excel读取。

  6. Memory引擎
    如果需要快速地访问数据,并且这些数据不会被修改,重启以后丢失也没有关系,那么使用Memory表是非常有用。Memory表至少比MyISAM表要快一个数量级。(使用专业的内存数据库更快,如redis)

  7. Federated引擎
    Federated引擎是访问其他MySQL服务器的一个代理,尽管该引擎看起来提供了一种很好的跨服务器的灵活性,但也经常带来问题,因此默认是禁用的。

8.3. MyISAM和InnoDB(重点了解)

对比项 MyISAM InnoDB
主外键 不支持 支持
事务 不支持 支持
行表锁 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作 行锁,操作时只锁某一行,不对其它行有影响,适合高并发的操作
缓存 只缓存索引,不缓存真实数据 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响
表空间
关注点 性能 事务
默认安装 Y Y
用户表默认使用 N Y
自带系统表使用 Y N

注:MyISAM主要关注性能,因为其查询速度快。
innodb 索引 使用 B+TREE myisam 索引使用 b-tree
innodb 主键为聚簇索引,基于聚簇索引的增删改查效率非常高。

8.4. 阿里巴巴、淘宝使用

MySQL高级知识(一)——基础_第13张图片

  • Percona 为 MySQL 数据库服务器进行了改进,在功能和性能上较 MySQL 有着很显著的提升。该版本提升了在高负载情况下的 InnoDB 的性能、为 DBA 提供一些非常有用的性能诊断工具;另外有更多的参数和命令来控制服务器行为。

  • 该公司新建了一款存储引擎叫xtradb完全可以替代innodb,并且在性能和并发上做得更好,

阿里巴巴大部分mysql数据库其实使用的percona的原型加以修改。AliSql+AliRedis

9. SQL执行顺序(重点了解)

sql语句的执行顺序可通过下图了解,注意sql是从from开始执行的。MySQL高级知识(一)——基础_第14张图片

你可能感兴趣的:(MySQL,MySQL基础)