目录python
此数据库系列,是学习工做中的总结,具体章节系列以下图所示。若是您须要扫盲数据库,突击数据库的面试,那就盘他,盘他!所谓初恋,初次见面,下凡数据库基础。请多多关照!mysql
查看近几年的TIOBE发现了,一直在前十,可见是个老且管用的东西。面试
了解几个术语:redis
DDL(Data Definition Language),定义数据库对象。sql
DML:(DATA Manipulation Language),用来操做和数据库相关记录。数据库
DCL:(Data Cnotrol Language)定义访问权限和安全级别。缓存
DQL(Data Query Language)。查询记录。安全
sql大小写规范服务器
表名、表别名、字段名、字段别名等能够小写网络
SQL保留字,函数名,绑定变量大写
SELECT name,age FROM student WHERE id="1";
咱们大部分的系统都会考虑到数据的存储,那么如何更有效地保存好数据,作好数据备份。当咱们拥有了数据,能够进行数据挖掘,大数据分析,舆情预测,天然语言处理等等一系列的操做,可见存储数据是多么的重要。这一篇文章对数据库基础知识的扫盲,下一节将是数据存储,数据备份等。另外我须要知道硬盘的处理速度比cpu,内存,网卡都会慢。
全称 | 功能 | |
---|---|---|
DBMS | DataBase Management System | 可对多个数据库进行管理 |
DB | DataBase | 存储树的集合,理解为多个数据表 |
DBS | DataBase system | 老大哥。包含了数据库管理系统和数据库管理人员DBA |
Nosql的timestamp:
1970:Nosql=we have no sql
1980:Nosql=know sql
2000:Nosql=No SQL
2005:Nosql=not only sql
2013:Nosql=No,SQL
键值数据库
经过key-value方式存储,key为惟一表示,优势,查询快,缺点是没法像关系型数据库同样使用条件过滤,这样可能致使遍历全部的键,消耗大量的计算。因此常常用来做为缓存,好比redis。
文档数据库
管理文档,一个文档至关于一条记录,MongoDB。
搜索引擎
虽然关系型数据库经常经过索引的方式提升检索效率(不必定),可是对于全文检索却比较低。搜索引擎的优点好比Elasticsearch、Splunk和Solr采用全文搜索,核心原理为倒排索引
列式数据库
相对于行式数据库,将数据按照列存储,这样能够大量下降系统的IO(由于相邻的数据类型同样,方便压缩,天然就会下降IO),适合分布式文件系统,好比
图数据库
典型的就是网络中的人与人的关系,节点和边关系。
首先注意,mysql8.0以后已经放弃了这个功能(由于若是数据更新,缓存会状况,若是为动态数据常常更新,这样反而增长SQL查询时间)。缓存一般的理解是一个中间层,若是在中间层存在查询语句就直接返回,若是没有则给解析器处理。
主要进行语法分析和语义分析。
肯定SQL语句的执行路径。是根据全表检索仍是根据索引。
进行权限检查。
那么mysql和oracle二者执行状况有啥不同呢
MySql具备多种存储引擎且能够自定义存储引擎,那么有哪些存储引擎,优势缺点是啥?
描述 | |
---|---|
InnoDB | Mysql5.5之后默认存储引擎,支持事务,行级锁,外键约束 |
MyISAM | Mysql5.5之前为默认存储引擎,不支持事务和外键,最大特色速度快,占资源少 |
Memory存储引擎 | 使用系统内存为存储介质,更快的响应速度。 |
NDB存储引擎 | 用于Mysql Cluster分布式集群环境 |
Archive存储引擎 | 压缩机制的特色便于文件的归档,经常使用来作仓库 |
mysql> select @@profiling;若是为0表明关闭,设置为1表示打开。
mysql> select *from student;
show profiles;查看当前会话的profiles
建立公众号原创做者数据库
CREATE DATABASE WeChat_Official_Account_Author;
建立表 做者名(author_id,author_name且id为递增)
CREATE TABLE authors_name(author_id int(15) NOT NULL AUTO_INCREMENT),
author_name varchar(255) NOT NULL);
ALTER TABLE authors_name ADD(age int(12));
ALTER TABLE authors_name RENAME_COLUME age to author_age;
ALTER TABLE author_names DROP COLUME author_age;
不成规矩,不成方圆
惟一标识一条记录,不重复且不能为空(UNIQUE+NOT NULL)。主键可使是一个字段或者多个字段的组合,一个数据表主键只能有一个
外键确保表与表之间引用的完整性。外键能够重复也能够为空。
字段在表中可使惟一的。
代表字段不该为空,必须有取值。
检查特定字段取值范围的有效性
查询单列
SELECT author_name FROM authors_name;
查询全部列
SELECT * FROM authors_name;
SELECT DISTICT age FROM authors_name;
ASC 递增排序,DESC递减排序
SELECT author_name FROM authors_names ORDER BY age DESC;
返回5条数据 LIMIT须要放在最后
SELECT author_name FROM authors_names ORDER BY age DESC LIMIT 5;
关键字的顺序:SELECT.....FROM...WHERE...GROUP BY
FROM>WHERE>GROUP BY HAVING>SELECT
当WHERE字句中同时出现OR和AND的时候,AND执行优先级会更高。通常来讲()优先级最高,其次是AND,而后是OR。
通配符是对文本类型进行模糊哈讯,可是一般是全表扫描,因此效率很低。只有当LIKE后面没有通配符,并对字段进行索引的时候不会进行全表扫描。匹配一部分特殊字符。"LIKE"操做符。
通配符匹配之任意字符串出现的任意次数(%)
通配符匹配之耽搁字符(_)
提供函数,相似接口,更方便快速的得出想要的结果。
描述 | 例子 | |
---|---|---|
ABS() | 取绝对值 | SELECT ABS(-5)---5 |
MOD() | 取余 | SELECT MOD(101,3)---2 |
ROUND() | 四舍五入为指定的小数位数,若是两个参数,分别为字段名称和小数位数 | SELECT ROUND(38.29,1)--38.3 |
LENGTH() | 计算字段长度。一个汉字三个字符。 | SELECT LENGTH('小蓝')--6 |
UPPER() | 字符转大写 | SELECT LOWER('qwe')--QWE |
LOWER() | 字符转小写 | SELECT LOWER('QWE')--qwe |
REPLACE() | 替换函数 | SELECT REPLACE('QWE123D','QWE',789)--789123D |
SUBSTRING() | 截取字符串 | SELECT SUBSTRING('QWE123',1,3)-- |
CHAR_LENGTH() | 计算机字段的长度,汉字,数字都算一个字符 | SELECT CHAR_LENGTH('小蓝')--2 |
CONCAT() | 链接字符串 | SELECT CONCAT('XIAOLAN',789)---XIAOLAN789 |
DATA() | 返回时间的日期 | SELECT DATA('2020-03-13 11:30:20')--2020-03-13 |
YEAR()/MONTH()/DAY() | 返回时间的年份/月份/天数 | SELECT YEAR(NOW())--2020 |
HOUR() | 返回时间的小时 | SELECT hour('12:13:14')--12 |
MINUTE() | 返回时间的分钟 | SELECT MINUTE('12:13:14')--13 |
SECOND() | 返回时间的秒部 | SELECT SECOND('12:13:14')--14 |
CURRENT_DATE() | 系统当前日期 | SELECT CURRENT_DATE('2020-03-13 11:30:20')--2020-03-13 |
CURRENT_TIME() | 系统当前时间,没有具体日期 | SELECT CURRENT_TIME('2020-03-13 11:30:20')--11:30:20 |
CURRENT_TIMESTAMP() | 日期+时间 | SELECT CURRENT_TIMESTAMP--2020-03-13 11:30:20 |
描述 | 例子 | |
---|---|---|
COUNT() | 总行数,无论某个字段是否为NULL | SELECT COUNT(*) FROM authors_name WHERE age>25 |
MAX() | 最大值 | SELECT MAX(Age) FROM authors_name |
MIN() | 最小值 | SELECT MIN(Age) FROM authors_name |
SUM() | 求和 | SELECT SUM(Age) FROM authors_name |
AVG() | 平均值 | SELECT AVG(Age) FROM authors_name |
使用GROUP BY字句进行数据分组。
WHERE 是用于数据行,而 HAVING 则做用于分组。若是分组完之后须要排序,就在其后增长ORDER BY完成
视图能够理解为一个中间表(结果集),咋们叫虚拟表,它主要把咱们常常查询的结果存放于中,从而提高使用的效率。自己不具备数据。以下图所示。
🍼重用SQL语句
🍼使用表的一部分而不是整个表
🍼更改数据格式和表示。
🍼经过授予表的特定访问权限来保护数据,。。
✌️
要么彻底执行,要么不执行。
咱们知道当在高并发的状况下,这个时候须要较高的吞吐量,那么采起方式之一就是将原来的串行操做变化为并行。这个时候能够经过下降数据库的隔离标准,来换取事务的并发能力。
讲述相关内容以前,咱们先定义一个表以下。
ID | Age | Name |
---|---|---|
1 | 18 | 小蓝 |
2 | 19 | 小林 |
3 | 20 | 小旋 |
小蓝今天想去看看数据库内容,并想把朋友小地增长到数据库中,因而操做以下:
SQL> BEGINT: SQL> INSERT INTO authors value(4,20,"小地");
此时小蓝尚未提交这个事务,小林去访问了这个表(小林去年买了个表,哈哈哈嗝),因而
SQL>SELECT * FROM authors;
而后获得这个结果:
ID | Age | Name |
---|---|---|
1 | 18 | 小蓝 |
2 | 19 | 小林 |
3 | 22 | 小旋 |
4 | 20 | 小地 |
结论:小蓝尚未提交事务,小林访问却看到了增长的小地,这就是脏读。
小蓝据说小地也在表里,而后想看看是为什么人如此牛掰,几岁了?
SQL> SELECT Age FROM authors where Name="小地"
结果以下:
Age |
---|
20 |
个人天,这么年轻?小蓝试图用个事务去修改其年龄
SQL>BEGIN; SQL>UPDATE authors SET Age = 25 where Name='小地'
此时小蓝去查询下修改是否成功
SQL>SELECT Age FROM authors where Name='小地'
结果以下:
Age |
---|
25 |
牛掰,修改为功?那么问题来了,小蓝虽然修改了,可是并无提交呀,这就是不可重复读,两次查询出现了不一样的结果。
今天小旋过来想看看,表里都有哪些小伙伴。
SQL> SELECT *FROM authors;
结果以下:
ID | Age | Name |
---|---|---|
1 | 18 | 小蓝 |
2 | 19 | 小林 |
3 | 22 | 小旋 |
4 | 20 | 小地 |
这个时候小林遇到个小妹妹,发现其文采还不错,开启个事务将其放入表中。
SQL> BEGIN; SQL> INSERT INTO authors values(5,'21','小魏')
小林记性太好了,因而还想看看到底有哪些人,
SQL> SELECT * FROM authors;
结果以下
ID | Age | Name |
---|---|---|
1 | 18 | 小蓝 |
2 | 19 | 小林 |
3 | 22 | 小旋 |
4 | 20 | 小地 |
5 | 21 | 小魏 |
啊!小林惊呆了,怎么多了个妹妹!!!这就是幻读!
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
读未提交 | 容许 | 容许 | 容许 |
读已提交 | 禁止 | 容许 | 容许 |
可重复读 | 禁止 | 禁止 | 容许 |
可串行化 | 禁止 | 禁止 | 禁止 |
总结下:
读未提交:
容许脏读,也就是可能读取到其余会话中未提交事务修改的数据
读已提交
只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
可重复读
可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,可是还存在幻读
串行读:
全串行化的读,每次读都须要得到表级共享锁,读写相互都会阻塞.
为何调优,无非就是但愿响应更快,吞吐量更大,用户体验更好。
那么怎么得到反馈
他们是直接体验者,来的直接。
经过性能工具进行查看,想起一张图送给你们。
这里是性能指标图
通常从哪几个方面着手数据库调优,总之没有最好,只有更合适。
好比须要有事务处理能力,能够选择mysql的InnoDB。若是采用若是考虑大幅度的下降系统IO,那么能够考虑Nosql中的列式数据库,以前说过列式存储方便使用压缩,可是不适合频繁的增删改。
将常用的数据放入缓存中(内存),提高查询效率。
主从架构优化读写策略,具体方法请关注系列篇第二节。
好了,上面的基础部分学习应该差很少了,那么数据库相关的优化,主从架构,读写分离,数据库的分片等都是怎么样的呢?尽请期待后续学习分享,一块儿成长!
参考资料
《mysql必知必会》
《mysql45讲》
https://blog.csdn.net/gengkui9897/article/details/89294936
《高性能mysql》