mysql总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql总结相关的知识,希望对你有一定的参考价值。

参考技术A bigdecimal(p,d):p表示多少位数,d表示有多少位表示小数
与钱相关,比如工资使用BigDecimal,不用使用float、double避免计算时的精度丢失
参考: https://www.cnblogs.com/owenma/p/7097602.html
float、double在存储为二进制时会出现精度丢失,导致进行二进制计算时出现不数据不准确

varchar记录的是字符的长度
使用char,由于时固定长度,在数据检索时,磁盘IO的次数要比varchar少(每个数据段需要当前数据段的长度和结束)
所以,在长度变化不大的情况下,使用char。
当varchar大于5000,使用text代替,并且另建一张表,避免影响其它字端的检索效率
参考: https://www.jianshu.com/p/a1aa86e17bf7

对于有主键或者唯一键冲突的情况下,replace会使用delete+insert执行。但是在row模式下,binlog记录的是update
因此有这么一种情况:在自增主键并且binlog是row模式,当发生唯一性冲突时,主从库的自增列会产生不一致,导致主从切换时,在新主库新增数据会出现主键冲突(自增列是小于最大id值的)

先来看下面一句sql

上面这一段sql存在的问题:
虽让fr_id有索引,查询时可以用到fr_id索引,但是由于查询了所有字段会导致回表,并且随机读严重,扫面更多的页,最终会使整体sql的执行性能不佳
如何优化呢?
使用延迟关联:第一步先利用覆盖索引查询id,再做关联查询

如何进一步优化?
根据业务场景,如果不需要支持跳页(即只支持翻页,解决深度分页问题),可以考虑用如下进行优化
第一次查询

第二次查询
假设第一次查询的结果的最大fr_id为200,那么第二次查询的如下

使用翻页要考虑的问题时,字段一定要是单调自增的,不然在翻页的过程中会有漏数据
所以整体优化思路为(两种方案二选一):
1、使用延迟关联,解决两个问题(1.使用覆盖索引 2.减少回表次数、避免随机读,提高性能)
2、根据业务场景,是否需要支持跳页查询?

mysql在创建表的时候有如下限制:
1、如果单个字段大小大于65535byte,自动转化成text
2、单行大小不能大于65535byte,否则创建失败,不包括text、blob字段
同时在插入数据有如下限制:
限制单行的大小不能大于单行的字段个数*768byte,否则会出现行裂变(768的含义是:mysql会对存储大字段进行优化,对每个字段的前768byte存储在当前页,其余存储在溢出页中,保证一个数据页至少能存储两行数据)
https://blog.csdn.net/wwd0501/article/details/115384399
https://blog.csdn.net/weixin_39761880/article/details/113336491

https://blog.csdn.net/m0_37695902/article/details/117695623

MySQL使用总结

     MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。下面总结一下MySQL的基础语法与使用技巧。

标准SQL语句类型

1、查询语句:主要由select关键字完成;

2、DML(Data Manipulation Language, 数据操作语言)语句:主要由insert、update和delete三个关键字完成;

3、DDL(Data Definition Language, 数据定义语言)语句:主要create、alter、drop和truncate四个关键字完成;

4、DCL(Data Control Language, 数据控制语言)语句:主要由grant和revoke两个关键字完成;

5、事务控制语句:主要由commit、rollback和savepoint三个关键字完成。

操作MySQL数据库

1、登陆到MySQL

登陆到mysql,要输入以下命令:  

mysql -h 主机名 -u 用户名 –p 密码

-h : 该命令用于指定客户端所要登录的MySQL主机名, 登录当前机器该参数可以省略;

-u : 所要登录的用户名;

-p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。

2、创建、删除、进入、查看数据库

创建新的数据库,则可以使用如下命令:

create database [IF NOT EXISTS] 数据库名

删除指定数据库,则可以使用如下命令:

drop database 数据库名

进入指定数据库,可以使用如下命令:

use 数据库名

查看当前实例下包含的数据库,可以使用如下命令:

show databases

3、查看数据表、表结构

查看当前数据库下所有的数据表,可以使用如下命令:

show tables

查看指定数据表的结构:

desc 表名

4、导入SQL脚本

对于一些较长的语句在命令提示符下可能容易输错, 因此我们可以通过任何文本编辑器将语句输入好后保存为 .sql 的文件中,输入一下命令通过文件重定向执行该脚本:

mysql -u 用户名 -p 数据库名 < 存放位置

DDL语句

     DDL语句是操作数据库对象的语句,包括创建(create)、删除(drop)和修改(alter)数据库对象。

 1、创建数据表

创建数据表的语法如下:

create table 表名(列名 列类型 [约束条件]);

以创建学生信息表Student为例,表中存放学号(sno)、姓名(name)、性别(sex)、年龄(age)这些内容:create table student( sno int primary key, name char(8) not null, sex char(8) not null, age int);

2、修改数据表

在创建表后,想对表进行修改,可以使用alter语句来实现。

  • 添加列

   alter table 表名 add 列名 列数据类型 [after 插入位置]

  • 修改列

   alter table 表名 change 列名称 列新名称 新数据类型

  • 删除列

   alter table 表名 drop 列名称

  • 重命名表

   alter table 表名 rename 新表名

3、删除数据表

删除整张表的语法如下:

drop table 表名

DML语句

     DML主要操作数据表里的数据,使用DML可以实现“插入新数据”、“修改已有数据”、“删除不需要的数据”。

1、插入数据

insert语句可以用来将一行或多行数据插到数据库表中,语法如下:

insert into 表名([列名1,列名2,…]))  values(值1,值2,…)

2、修改数据

update语句用于修改数据表的记录,每次可以修改多条记录,通过使用where子句限定修改哪些记录,语法如下:

update 表名 set 列名称=新值 where 更新条件

3、删除数据

delete语句用于删除表中的数据,语法如下:

delete from 表名称 where 删除条件

Select查询语句

     select语句是SQL语句中功能最丰富的语句,select语句可以执行单表查询、子查询以及多表连接查询等。

1、单表查询

单表查询的select语句的语法格式如下:

select 列1,列2… from 表名称 where 查询条件

2、子查询

子查询就是指在查询语句中嵌套另一个查询,其语法格式如下:

select 列1… from 表名称 where 列名称 [<, in] 子查询

有两张表,student(记录学生的学号、姓名等信息)、grade(记录学生的学号、课程成绩),查询中grade表中学号所对应的学生姓名:

select name from student where sno in (select sno from grade)

3、多表连接查询

很多时候,需要选择的数据并不是来自一个表,而是来自多个数据表,这就需要使用多表连接查询,其语法格式如下:

select 列1,列2… from 表1,表2… where 连接条件

有三张表,student(记录着学生的学号、姓名等信息)、course(记录着课程编号、课程名称)、grade(记录着学号、课程号、课程成绩),查询学生姓名、课程名称以及对于课程的成绩:

select s.name, c.name, g.grade  from student s,course c,grade g where s.sno = g.sno and c.cno = g.cno

4、Order by排序

在MySQL中,可以使用Order by语句来实现按哪个字段哪种方式来进行排序,再返回搜索结果,具体语法如下:

select 列名1… from 表名 order by 列名 [asc,desc]

5、Group by分组

所谓的分组就是将一个数据表划分为若干个小区域,然后针对若干个小区域进行数据处理,具体语法如下:

select 分组字段,聚合函数 from 表名 group by 分组字段 [having 过滤条件]

有一张表grade,记录着考生号、课程编号、课程成绩,根据考生号进行分组,查询每位考生的课程总成绩:

select sno,sum(grade) from grade group by sno order by sum(grade) asc

MySQL事务

     事务是连续的一组数据库操作,即一段sql语句的批处理,这个批处理,不可分割,要么都执行,要么回滚都不执行。

     为什么要使用事务这个技术呢?现在的很多软件都是多用户、多程序、多线程的,对同一个表可能有很多人在用,为保持数据的一致性,所以提出了事务的概念。这样很抽象,举个例子:A要给B转钱,A的账户-1000元,B的账户就要+1000元,这两个update语句并需作为一个整体来执行,不然A扣钱了,B没有加钱这种情况很难处理。

1、事务的特性

事务有以下四个标准属性, 缩写ACID,通常被称为:

原子性(Atomic): 确保工作单元内的所有操作都成功完成,否则事务将被中止在故障点,和以前的操作将回滚到以前的状态;

一致性(Consistent): 确保数据库正确地改变状态后,成功提交的事务;

隔离性(Isolated): 使事务操作彼此独立的和透明的;

持久性(Durable): 确保提交的事务的结果或效果的系统出现故障的情况下仍然存在。

2、事务的使用

MySQL中使用begin、rollback、commit、savepoint来实现事务处理:

begin:开始一个事务

rollback:事务回滚

commit:事务提交

savepoint:在事务中创建一个保存点

以表grade(记录学生学号、课程编号、课程成绩)为例,介绍一个示例来阐述事务的使用:

begin;

insert into grade values(103,01,88.8);

select * from grade;

savepoint first;

insert into grade values(103,02,90);

select * from grade;

rollback to first;

select * from grade;

commit;

MySQL存储过程

     我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

1、存储过程的优点

存储过程通常有以下优点:

  • 存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
  • 存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
  • 存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
  • 存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。
  • 存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

2、创建、删除、使用存储过程

MySQL存储过程创建的格式如下:

create procedure 过程名([过程参数][参数名][参数型别]…) 过程体

删除存储过程的格式如下:

drop procedure 过程名

调用存储过程的命令很简单,格式如下:

call 过程名(参数1,参数2…)

下面用一个简单的示例,介绍下存储过程的创建与使用:

创建存储过程

//使用&&来代替;作为分隔符

delimiter  &&

create procedure test(IN input int)

begin

select input;

set input = 2;

select input;

end;&&

使用存储过程

//将分隔符声明为默认的;

delimiter ;

call test(3); 

MySQL Workbench

     尽管我们可以在命令提示符下通过一行行的输入或者通过重定向文件来执行mysql语句, 但该方式效率较低, 由于没有执行前的语法自动检查, 输入失误造成的一些错误的可能性会大大增加, 这时不妨试试一些可视化的MySQL数据库管理工具, MySQL Workbench 就是 MySQL 官方 为 MySQL 提供的一款可视化管理工具, 你可以在里面通过可视化的方式直接管理数据库中的内容, 并且 MySQL Workbench 的 SQL 脚本编辑器支持语法高亮以及输入时的语法检查, 当然, 它的功能强大, 绝不仅限于这两点。

MySQL Workbench官方介绍: http://www.mysql.com/products/workbench/

MySQL Workbench 下载页: http://dev.mysql.com/downloads/tools/workbench/

以上是关于mysql总结的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结

MySQL使用总结

mysql/mariadb知识点总结 之 事务总结

MySQL 知识点总结(简易版)

mysql总结

MySQL 常用插入语法总结