数据库开发(一文概括mysql基本知识)
Posted 茅河野人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库开发(一文概括mysql基本知识)相关的知识,希望对你有一定的参考价值。
mysql 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 关系型数据库(Relational Database Management System:关系数据库管理系统)应用软件之一。mysql在问开发中,几乎必不可少,因为其他的可能是要收费的,所以mysql变成了首选。
1、mysql中常见的术语:
- 数据库: 数据库是一些关联表的集合。
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
- 行:一行(元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
- 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
2、mysql基本语法:
创建数据库
CREATE DATABASE 数据库名;
删除数据库
drop database 数据库名;
3、mysql数据类型
4、mysql的SQL基本语法
创建一个表
CREATE TABLE table_name (column_name column_type);
例如:
CREATE TABLE IF NOT EXISTS `maoheyeren`(
`id` INT UNSIGNED AUTO_INCREMENT,
`title` VARCHAR(100) NOT NULL,
`author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
删除一个表
DROP TABLE table_name ;
对一个表插入数据:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
查询一个表数据:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
分组查询语句:
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
更新一个表数据:
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
删除一个表数据:
DELETE FROM table_name [WHERE Clause]
创建视图:
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [
CASCADED | LOCAL ] CHECK OPTION ]
创建存储过程:
CREATE PROCEDURE 存储过程名称 ([ 参数列表 ])
BEGIN
-- SQL语句集合
END ;
调用存储过程:
CALL 存储过程名称 ([ 参数 ]);
如果所要调用的存储过程是无参的,括号() 可省略
删除存储过程
DROP PROCEDURE [ IF EXISTS ] 存储过程名称 ;
5、mysql事务
事务
是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
事务的特性(ACID):
原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
上述就是事务的四大特性。
mysql事务的隔离级别:(其中默认隔离级别是可重复读)
查看事务的隔离级别:
SELECT @@TRANSACTION_ISOLATION;
设置事务的隔离级别语法:
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE
6、mysql索引(默认的索引是B+树数据结构)
索引(index)是帮助MySQL高效获取数据的数据结构 ,相当于课本的目录。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
在无索引情况下,在我们执行查询语句的时候默认会全表扫描。
创建索引的语句:
-- 创建索引
CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (
index_col_name,... ) ;
查看索引:
-- 查看索引
SHOW INDEX FROM table_name ;
删除索引:
-- 查看索引
SHOW INDEX FROM table_name ;
elasticsearch应用知识概括
elasticsearch应用知识概括
mysql数据同步
mysql数据同步方案:
-
logstash
或者beat
做数据同步,但数据量过大时,会出现同步延时的问题。 -
同步双写:
这是一种最为简单的方式,在将数据写到mysql时,同时将数据写到ES。
①优点:业务逻辑简单。
②缺点:
<1>硬编码,有需要写入mysql的地方都需要添加写入ES的代码;
<2>业务强耦合;
<3>存在双写失败丢数据风险;
<4>性能较差:本来mysql的性能不是很高,再加一个ES,系统的性能必然会下降。
③上面说的双写失败风险,包括以下几种:
<1>ES系统不可用;
<2>程序和ES之间的网络故障;
<3>程序重启,导致系统来不及写入ES等。
④针对这种情况,有数据强一致性要求的,就必须双写放到事务中来处理,而一旦用上事务,则性能下降更加明显。 -
异步双写(MQ方式):
针对上面同步的性能和丢数据问题,可以考虑引入MQ,从而形成了上图的方案。由于MQ的性能基本比mysql高出一个数量级,所以性能可以得到显著的提高。
①优点:
<1>性能高;
<2>不存在丢数据问题。
②缺点:
<1>还存在硬编码、业务强耦合等问题;
<2>系统中增加了mq的代码,复杂度增加;
<3>可能存在时延问题,程序的写入性能提高了,但是由于MQ的消费可能由于网络或其它原因导致用户写入的数据不一定可以马上看到。 -
异步双写(Worker方式):
上面2中方案中都存在硬编码问题,也就是有任何对mysq进行增删改查的地方要么植入ES代码,要么替换为MQ代码,代码的侵入性太强,若是实时要求不高的情况下,可以考虑用定时器来处理。
①具体步骤如下:
<1>数据库的相关表中增加一个字段为timestamp的字段,任何crud操作都会导致该字段的时间发生变化;
<2>原来程序中的crud操作不做任何变化;
<3>增加一个定时器程序,让该程序按一定的时间周期扫描指定的表,把该时间段内发生变化的数据提取出来;
<4>逐条写入到ES中。
②优点:
<1>不改变原来代码,没有侵入性、没有硬编码;
<2>没有业务强耦合;
<3>不改变原来程序的性能;
<4>Worker代码编写简单不需要考虑增删改查。
③缺点:
<1>时效性较差,由于定时器工作周期不可能设在秒级,所以实时性没有上面2中好;
<2>对数据库有一定的轮询压力,一种改进方法是将轮询放到压力不大的从库上。 -
Binlog 同步方式:
上面三种方案要不有代码侵入、要不有硬编码、要不有时延,那么有没有一种更好的方法?答案就是利用mysql的binlog!
①具体步骤如下:
<1>读取mysql的binlog日志,获取指定表的日志信息;
<2>将读取的信息转为MQ;
<3>编写一个MQ消费程序;
<4>不断消费MQ,每消费完一条消息,将消息写入到ES中。
②优点:
<1>没有代码侵入、没有硬编码;
<2>原有系统不需要任何变化,没有感知;
<3>性能高;
<4>业务解耦,不需要关注原来系统的业务逻辑。
③缺点:
<1>构建Binlog系统复杂;
<2>也像方案二,存在MQ延时的风险。
canal简介
canal简介:
- canal主要用途是对MySQL数据库增量日志进行解析,提供增量数据的订阅和消费,简单说就是可以对MySQL的增量数据进行实时同步,支持同步到MySQL、Elasticsearch、HBase等数据存储中去。
- canal工作原理:canal会模拟MySQL主库和从库的交互协议,从而伪装成MySQL的从库,然后向MySQL主库发送dump协议,MySQL主库收到dump请求会向canal推送binlog,canal通过解析binlog将数据同步到其他存储中去。
- 链接:MySQL如何实时同步数据到ES?试试这款阿里开源的神器!
logstash 和 canal的区别:
- 在传输上,两者都可以看做传输数据的管道,但logstash可以从数据库读取数据(例:MySql),传输到ES中,而canal能做到的不止这些,它可以把MySql的数据读取出来,配合java代码(貌似只支持java),将读取到的数据存储到任何代码能操作的地方,例如:文件、MySql、Redis、ES等等
- 在时效性上,logstash配置文件是使用定时器去同步数据,而canal是监听MySql的binlog日志,进而做到数据几乎实时同步(PS:实际开发中基本是1秒~2秒内)
- 在数据处理上,logstash可以读取多个表,然后分别存储到对应节点,或者可以在存储前进行联表查询,进而存储成一条数据。但当联表查询一对多时,存储成一条数据就变得不现实了,比如:文章搜索,并且连文章对应的评论一起搜索出来。如果用logstash的话,可能需要存成两张表,先根据条件搜索文章表,然后再循环查到的文章列表,再查询评论表,再拼装成数据,接口返回结果。但如果用canal的话,在数据存储到ES前,可以先把对应的评论查询出来,并且拼装成json字符串,当做文章表的单个字段存储到ES中,这样可以直接查询出来,避免反复地查询ES组装数据。在这一点上,理论上用canal查询会更快,更高效。
- 在对数据库的压力上,logstash的原理是定时扫描变动的表,所以对数据库有一定压力,并且如果有其他程序在进行某条语句更新,锁住了这条行数据,那logstash读取数据时,就会被“卡住”,如果这个时间过长,可能会影响服务器卡死。而canal由于是监听的binlog日志,所以几乎对MySql没有压力,并且binlog已经记录,不会存在数据变动的情况。
- 读取数据上,logstash可以读取数据库、文本文件,而canal读取的是binlog文件(binlog属于二进制文件)。
- 学习成本上,logstash相对简单,canal相对难一点。
以上是关于数据库开发(一文概括mysql基本知识)的主要内容,如果未能解决你的问题,请参考以下文章