mysql常用知识总结

安装方式

1、配置yum仓库安装
①下载yum仓库:yum -y install https://repo.mysql.com/mysql80-community-release-el7-1.noarch.rpm
②安装:yum -y install mysql-community-server

2、下载rpm包安装
①官网下载rmp包:wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.20-1.el7.x86_64.rpm-bundle.tar
②解压:tar -xf mysql-8.0.20-1.el7.x86_64.rpm-bundle.tar
③安装:
(1)rpm -ivh mysql-community-common-8.0.20-1.el7.x86_64.rpm
(2)rpm -ivh mysql-community-libs-8.0.20-1.el7.x86_64.rpm

3、源码编译安装
下载好源码包后执行下面一键mysql安装脚本

 #!/bin/bash
 
 #解决软件的依赖关系
 yum  install cmake ncurses-devel gcc  gcc-c++  vim  lsof bzip2 openssl-devel ncurses-compat-libs -y
 
 #解压mysql二进制安装包
 #tar  xf  mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz
 
 #移动mysql解压后的文件到/usr/local下改名叫mysql
 mv mysql-5.7.37-linux-glibc2.12-x86_64 /usr/local/mysql
 
 #新建组和用户 mysql
 groupadd mysql
 #mysql这个用户的shell 是/bin/false 属于mysql组 
 useradd -r -g mysql -s /bin/false mysql
 
 #关闭firewalld防火墙服务,并且设置开机不要启动
 service firewalld stop
 systemctl  disable  firewalld
 
 #临时关闭selinux
 setenforce 0
 #永久关闭selinux
 sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config
 
 #新建存放数据的目录
 mkdir  /data/mysql -p
 #修改/data/mysql目录的权限归mysql用户和mysql组所有,这样mysql用户可以对这个文件夹进行读写了
 chown mysql:mysql /data/mysql/
 #只是允许mysql这个用户和mysql组可以访问,其他人都不能访问
 chmod 750 /data/mysql/
 
 #进入/usr/local/mysql/bin目录
 cd /usr/local/mysql/bin/
 
 #初始化mysql
 ./mysqld  --initialize --user=mysql --basedir=/usr/local/mysql/  --datadir=/data/mysql  &>passwd.txt
 
 #让mysql支持ssl方式登录的设置
 ./mysql_ssl_rsa_setup --datadir=/data/mysql/
 
 #获得临时密码
 tem_passwd=$(cat passwd.txt |grep "temporary"|awk '{print $NF}')
   #$NF表示最后一个字段
   # abc=$(命令)  优先执行命令,然后将结果赋值给abc 
 
 # 修改PATH变量,加入mysql bin目录的路径
 #临时修改PATH变量的值
 export PATH=/usr/local/mysql/bin/:$PATH
 #重新启动linux系统后也生效,永久修改
 echo  'PATH=/usr/local/mysql/bin:$PATH' >>/root/.bashrc
 
 #复制support-files里的mysql.server文件到/etc/init.d/目录下叫mysqld
 cp  ../support-files/mysql.server   /etc/init.d/mysqld
 
 #修改/etc/init.d/mysqld脚本文件里的datadir目录的值
 sed  -i '70c  datadir=/data/mysql'  /etc/init.d/mysqld
 
 #生成/etc/my.cnf配置文件
 cat  >/etc/my.cnf  <<EOF
 [mysqld_safe]
 
 [client]
 socket=/data/mysql/mysql.sock
 
 [mysqld]
 socket=/data/mysql/mysql.sock
 port = 3306
 open_files_limit = 8192
 innodb_buffer_pool_size = 512M
 character-set-server=utf8
 
 [mysql]
 auto-rehash
 prompt=\\u@\\d \\R:\\m  mysql>
 EOF
 
 #修改内核的open file的数量
 ulimit -n 1000000
 #设置开机启动的时候也配置生效
 echo "ulimit -n 1000000" >>/etc/rc.local
 chmod +x /etc/rc.d/rc.local
 
 
 #启动mysqld进程
 service mysqld start
 
 #将mysqld添加到linux系统里服务管理名单里
 /sbin/chkconfig --add mysqld
 #设置mysqld服务开机启动
 /sbin/chkconfig mysqld on
 
 #初次修改密码需要使用--connect-expired-password 选项
 #-e 后面接的表示是在mysql里需要执行命令  execute 执行
 #set password='Sanchuang123#';  修改root用户的密码为Sanchuang123#
 mysql -uroot -p$tem_passwd --connect-expired-password   -e  "set password='Sanchuang123#';"
 
 
 #检验上一步修改密码是否成功,如果有输出能看到mysql里的数据库,说明成功。
 mysql -uroot -p'Sanchuang123#'  -e "show databases;"
 

常用语句

1、用户设置:
远程连接数据库:mysql -h192.168.206.100 -uroot -p12345678;
修改密码:
①root密码为空时,设置root密码:mysqladmin -uroot newpassword;
②使用sqladmin 命令修改密码:mysqladmin -uroot -p123456 password 12345678;
③set passsword命令修改密码:set password for 用户名@localhost = password(‘新密码’);
④alter命令修改密码:alter user ‘lirx’@‘%’ identified by ‘Sanchuang1234#’;
⑤创建用户时设置密码:create user ‘yangsiting’@‘192.168.0.%’ identified by ‘123456’;
grant授权(with grant option包括grant权限):grant all on . to ‘tang3’@‘%’ with grant option;
撤销用户权限:revoke all on . from ‘heyachen’@‘%’;
查看连接的用户列表:show processlist;
查看用户权限:show grants for username
删除用户:drop user

2、库表设置
创建库表:create database zj、create table zj(id int,name varchar(20))
增加表字段:alter table Students add sex char(1) ;
修改字段名:alter table Students change name username varchar(30);
修改表名:alter table 表名 rename to 新的表名
删除列:alter table table_name drop column_name
删除表:drop table table_name
修改数据库的字符集:alter database song default character set utf8mb4;
查看表库结构:desc table_name、show create table table_name和show create database database_name
查看所在库、版本:select database()、select version()
复制表:create table sanchuang.user like mysql.user;(只有表结构)
将查询结果创建表:create table user2 as select user,host from mysql.user;(结构内容都有)

存储引擎

什么是存储引擎?
MySQL 的核心就是存储引擎,存储引擎,负责MySQL中数据的存储和提取。数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。现在许多数据库管理系统都支持多种不同的存储引擎。
原文链接:https://blog.csdn.net/weixin_37714489/article/details/107763503

分类:
MyISAM: 拥有较高的插入,查询速度,但不支持事务、外键、行锁(MyISAM只有表锁)、不支持崩溃后的安全恢复
InnoDB :5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定、支持崩溃后的安全恢复、不支持全文索引
BDB: 源自Berkeley DB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性
Memory :所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失
Merge :将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用
Archive :非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差
Federated: 将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
Cluster/NDB :高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用
CSV: 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。
BlackHole :黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继

如何选择存储引擎?
如果要提供提交、回滚和恢复的事务安全(ACID 兼容)能力,并要求实现并发控制,InnoDB 是一个很好的选择。
如果数据表主要用来插入和查询记录,则 MyISAM 引擎提供较高的处理效率。
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存的 MEMORY 引擎中,
MySQL 中使用该引擎作为临时表,存放查询的中间结果。
如果只有 INSERT 和 SELECT 操作,可以选择Archive 引擎,Archive 存储引擎支持高并发的插入操作,但是本身并
不是事务安全的。Archive 存储引擎非常适合存储归档数据,如记录日志信息可以使用 Archive 引擎。

myisam和innoDB的区别?

  1. 事务支持
    MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。

MyISAM是非事务安全型的,而InnoDB是事务安全型的,默认开启自动提交,宜合并事务,一同提交,减小数据库多次提交导致的开销,大大提高性能。

  1. 存储结构
    MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
    InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

  2. 存储空间
    MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。

总之,MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。一般来说,如果需要事务支持,并且有较高的并发读取频率(MyISAM的表锁的粒度太大,所以当该表写并发量较高时,要等待的查询就会很多了),InnoDB是不错的选择。如果你的数据量很大(MyISAM支持压缩特性可以减少磁盘的空间占用),而且不需要支持事务MyISAM是最好的选择。

静态表:表中的字段都是非变长字段,这样每个记录都是固定长度的,优点存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多(因为存储时会按照列的宽度定义补足空格)ps:在取数据的时候,默认会把字段后面的空格去掉,如果不注意会把数据本身带的空格也会忽略。
动态表:记录不是固定长度的,这样存储的优点是占用的空间相对较少;缺点:频繁的更新、删除数据容易产生碎片,需要定期执行OPTIMIZE TABLE或者myisamchk-r命令来改善性能
压缩表:因为每个记录是被单独压缩的,所以只有非常小的访问开支

关系型和非关系型

关系型数据库是指采用了关系模型来组织数据的数据库。简单来说,关系模式就是二维表格模型。
主要代表:SQL Server,Oracle,Mysql,PostgreSQL。
NoSQL非关系型数据库,主要指那些非关系型的、分布式的,且一般不保证ACID的数据存储系统,主要代表MongoDB,Redis、CouchDB。

区别:
关系型数据库的最大优点就是事务的一致性,这个特性,使得关系型数据库中可以适用于一切要求一致性比较高的系统中。比如:银行系统。
但是在网页应用中,对这种一致性的要求不是那么的严格,允许有一定的时间间隔,所以关系型数据库这个特点不是那么的重要了。相反,关系型数据库为了维护一致性所付出的巨大代价就是读写性能比较差。而像微博、facebook这类应用,对于并发读写能力要求极高,关系型数据库已经无法应付。所以必须用一种新的数据结构存储来替代关系型数据库。所以非关系型数据库应用而生。

1.存储上?
Sql通常以数据库表的形式存储,例如存储用户信息,SQL中增加外部关系的话,需要在原表中增加一个外键,来关联外部数据表。如下:

NoSql采用key-value的形式存储

2.事务
SQL中如果多张表需要同批次被更新,即如果其中一张表跟新失败的话,其他表也不会更新成功。这种场景可以通过事务来控制,可以在所有命令完成之后,再统一提交事务。在Nosql中没有事务这个概念,每一个数据集都是原子级别的。

3.数据表 VS 数据集
关系型是表格型的,存储在数据表的行和列中。彼此关联,容易提取。而非关系型是大块存储在一起。

4.预定义结构 VS 动态结构
在sql中,必须定义好地段和表结构之后,才能够添加数据,例如定义表的主键、索引、外键等。表结构可以在定义之后更新,但是如果有比较大的结构变更,就会变的比较复杂。
在Nosql数据库中,数据可以在任何时候任何地方添加。不需要预先定义。

5.存储规范 VS 存储代码
关系型数据库为了规范性,把数据分配成为最小的逻辑表来存储避免重复,获得精简的空间利用。但是多个表之间的关系限制,多表管理就有点复杂。
当然精简的存储可以节约宝贵的数据存储,但是现在随着社会的发展,磁盘上付出的代价是微不足知道的。
非关系型是平面数据集合中,数据经常可以重复,单个数据库很少被分开,而是存储成为一个整体,这种整块读取数据效率更高。

6.纵向拓展 VS 横向拓展
为了支持更多的并发量,SQL数据采用纵向扩展,提高处理能力,通过提高计算机性能来提高处理能力。
NoSql通过横向拓展,非关系型数据库天然是分布式的,所以可以通过集群来实现负载均衡。

7.其他方面
比如:关系型是结构化查询语言,NoSql是采用更简单而且精确的数据访问方式;SQl数据库大多比较昂贵,而NoSql大多是开源的。

五、选择?

目前许多大型互联网都会选用MySql+NoSql的组合方案,因为SQL和NoSql都有各自的优缺点。
关系型数据库适合存储结构化数据,比如:用户的账号、地址:

(1)这些数据通常需要做结构化查询,比如说Join,这个时候,关系型数据库就要胜出一筹。

(2)这些数据的规模、增长的速度通常是可以预期的。

(3)事务性、一致性,适合存储比较复杂的数据。

NoSql适合存储非结构化数据,比如:文章、评论:

(1)这些数据通常用于模糊处理,例如全文搜索、机器学习,适合存储较为简单的数据。

(2)这些数据是海量的,并且增长的速度是难以预期的。

(3)按照key获取数据效率很高,但是对于join或其他结构化查询的支持就比较差。

总结:

SQL数据库依然强大,可以可靠的处理事务并且保持事务的完整性,只有你的数据非常大,操作扩展需要更加分布式的系统时,才考虑NoSql数据库。

shell操作数据库

示例:(还可以使用-e选项执行sql语句,后面可以接管道符和shell命令)
在这里插入图片描述

事务

什么是事务?
transaction 一个数据库事务由一条或者多条sql语句构成,它们形成一个逻辑的工作单元。这些sql语句要么全部执行成功,要么全部执行失败

ACID四个特性:
原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节,而且事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样;

一致性(Consistency):数据库的完整性不会因为事务的执行而受到破坏,比如表中有一个字段为姓名,它有唯一约束,也就是表中姓名不能重复,如果一个事务对姓名字段进行了修改,但是在事务提交后,表中的姓名变得非唯一性了,这就破坏了事务的一致性要求,这时数据库就要撤销该事务,返回初始化的状态。

隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

innoDB引擎通过什么技术来保证事务的这四个特性?
原子性和持久性是通过 redo log (重做日志)来保证的;

一致性是通过 undo log(回滚日志) 来保证的;

隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;

并发事务会引发什么问题?
脏读:读到其他事务未提交的数据;
不可重复读:前后读取的数据不一致;
幻读:前后读取的记录数量不一致。
丢失更新

事务的隔离级别有哪些?(解决并发事务)
读未提交(read uncommitted),指一个事务还没提交时,它做的变更就能被其他事务看到;

读提交(read committed),指一个事务提交之后,它做的变更才能被其他事务看到;

可重复读(repeatable read默认),指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MySQL InnoDB 引擎的默认隔离级别;

串行化(serializable );会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;

不过,要解决幻读现象不建议将隔离级别升级到「串行化」,因为这样会导致数据库在并发事务时性能很差。InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它通过next-key lock 锁(行锁和间隙锁的组合)来锁住记录之间的“间隙”和记录本身,防止其他事务在这个记录之间插入新的记录,这样就避免了幻读现象。

哪些操作会产生事务?
start transaction 后去操作表的时候,加的是表锁
DDL和DCL不受autocommit这个变量的影响
MySQL会自动执行commit操作
不受操作者的控制,自动完成
DML受操作人员的控制

日志
mysql很多有类型的日志,按照组件划分的话,可以分为 服务层日志 和 存储引擎层日志 :

  • 服务层日志:二进制日志、慢查日志、通用日志
  • 存储引擎层日志:innodb(重做日志、回滚日志)

python操作数据库

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值