-
由于互联网时代到来,用文本EXCEL存储数据,要取出来,有条件的取出来太复杂了
-
树状的数据库解决不了 一对多的问题,所以出现了网状数据库(描述实体之间的关系,在行中表达关系)
-
变成一张网,数据量大了就不可控了
-
关系型数据库叫RDBMS
-
Oracle成为继微软之后第二大软件公司
-
Monty公司担心被Oracle收购,5.5版本之后分支MariaDB
-
MySQL的引擎是插件化的,MyISASM不支持事务,但插入查询速度快
-
InnoDB,支持事务,行级锁,5.5起的默认引擎
-
阿里提出去IOE(IBM,Oracle,EMC存储设备),淘宝网诞生之后,使用的架构 ,用java写业务放Tomcat里,用Oracle的数据库,放普通服务器上不行了,放小型机上。发现运维成本太高了。
-
开源不等于免费,java天生开源,用免费的一些服务器 集群,虽然不如大型机好,但是便宜啊
-
从一个非常好的数据中心变成廉价的服务器集群,但是重构之后都是大坑,自己踩过之后总结出来的经验开源!阿里是一家伟大的公司。
-
为开源界做了很多贡献,贡献给Apache基金会
-
但是运维成本很高,廉价的服务器用的开源的产品,对运维的成本太高了,以前用的是付费的东西,花钱请过来给修就完了。现在微服务,对运维的要求更高了
-
运维人才,自动化测试人才,学校是不会讲的,大规模集群需要用自动化测试的人才(python是最主流的人才)自动化的程度要越来越高!
-
未来是AIOps叫智能运维,类比工业的自动化生产到智能制造,引入AI的力量
-
廉价服务器一定是不稳定的,不过云计算提供了简单的解决方案,2019年8月份的新闻,A站全面上云,运维成本降低30%,腾讯的QQ,微信都跑在云上,由专业的运维人员集中运维阿里的服务器,华为的服务器,腾讯的服务器。分工更加的明细,专业。
-
NoSQL:新浪微博大量使用redis,跟其业务特点有关,虽然后端都是PHP没有很强的关系,要求实时性,不用保证每个人看到都一样(强一致性),分布式。
-
互联网公司,大数据公司必须会用(NoSQL也是百花齐放)
-
两者结合是最好的,纯粹用NoSQL也不太合适
-
Elasticsearch(分布式搜索引擎,太重要了)
-
Cassandra和HBase(列存数据库)大数据的数据库最主流
-
solr(单机用的搜索引擎)应用于一线互联网公司solr查询本地数据库,不是分布式的,大型用Elasticsearch
-
Hive:Hadoop生态圈就是个动物园(蜂窝)叫数据仓库,可以存储海量数据,可以导入进去进行分析,不是用来增删改查的,用来数据分析
-
自动化运维,自动化测试
-
运维是会部署,开发必须要懂原理
-
SQL语言很重要,学多深都可以
-
DDL:数据定义语言(授权和撤销)
-
DML:数据操作语言
-
DCL:数据控制语言
-
TCL:事务控制语言
-
大小写不敏感,分号结束
-
将sql文件导入导出数据库https://blog.csdn.net/jisuanjiguoba/article/details/79359439
-
utf8mb4是utf8的扩展
-
navicat激活https://github.com/DoubleLabyrinth/navicat-keygen/blob/windows/README.zh-CN.md
-
数据库表的设计,多了抛异常
-
密码用单项散列加密(不是18个28个就够用了)
-
登录时要加入辅助字段,登录名不允许重复
索引:
- 以空间换时间,只能提高查询效率,但会带来插入,修改,删除效率的低下问题(有副作用的)
- 主键可以快速的定位到唯一的记录
- 主键索引,唯一索引(如果读多写少,怎么用索引都没事,如果是写多读少,不好)
约束
- UNIQUE约束(唯一键约束)
- 定义了唯一键索引就成了唯一键约束
- 外键约束
- 主键约束(加一个字段,不允许重复)
- 表B的某以列关联表A的主键,叫外键约束
- 存的是A主键的值,但是在外面就叫外键
- 如果外键还做了约束(在B表中插入记录,在A表的主键中必须存在)
- 修改B的外键值看在A表中的主键中有没有,没有就报错
- 当表A删除一条记录,表B的也删了,没人引用的才能删
- 如果A表中修改主键值,只要不冲突 就可以,但B表中就不认识了,B表记录全部删除
- 只要有外键关联就不能随心所欲了
- 外键的约束保证数据的完整性,表和表几乎都有关系
- 外键约束保证数据的完整性和一致性
视图
- 虚表,看起来像表,由sql语句查询,可以对视图进行CRUD的操作,建议查询视图
- 查的慢用缓存
数据类型
-
int:42亿数据记录
-
建议单独的主键
MySQL100问
- 1.什么是索引?
索引是一种数据结构,可以帮助我们快熟进行查找的数据结构
- 2.索引是什么数据结构
索引的数据结构和存储引擎有关,在MySQL中使用较多的 索引有Hash索引,B+树索引等,InnoDB存储的默认引擎为B+树索引
- 3.Hash索引和B+树有什么区别或者说优势呢?
hash索引底层是hash表进行查找,调用一次hash函数就可以获取到相应额键值O(1),之后进行回表查询获得实际数据。
B+tree底层实现是多路平衡查找树,对于每一次查询都是从根节点出发,查找到叶子节点可以获得查询的键值,然后根据查询判断需要是否回表操作。
hash索引进行等值查询更快,但是无法进行范围查询,因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保证一致,不能支持范围查询。而B+tree的所有节点都是左节点小于父节点,右节点大于父节点,多叉树也类似,天然支持范围查询。
hash索引不支持使用索引进行排序
hash索引不支持模糊查询以及多列索引的最左前缀匹配
hash索引避免不了回表操作,在B+tree在符合条件(聚簇索引,覆盖索引等)可以只通过索引完成查询
hash索引虽然在等值查询较快,但是不稳定,性能不可预测,当某个值大量存在重复时会存在hash碰撞,B+tree就比较稳定,而且树的高度低
- 4.什么是聚簇索引?
聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。在innodb中只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键jianli 聚簇索引,如果没有唯一的键,则隐世生成一个键来建立聚簇索引。
so当查询使用聚簇索引时在对应的叶子节点可以获取到整行数据,不用进行回表查询
https://blog.csdn.net/alexdamiao/article/details/51934917
- 5.非聚簇索引一定会回表查询吗?
不一定,涉及到查询语句要求的字段是否全部命中了索引,如果全部命中了索引就不用进行回表操作
- 6.在建立索引的时候,都需要考虑哪些因素?
建立索引的时候一般需要考虑到字段的使用频率,经常作为条件进行查询的字段比较合适。如果需要建立联合索引的话,还需要考虑联合索引中的顺序。还需要考虑其他方面,比如防止过多的索引对表的压力。
- 7.什么是联合索引?为什么需要注意联合索引的顺序
MySQL可以使用多个字段同时建立一个索引(不建议)。在联合索引中,如果想要命中索引,需要按照建立索引时的字段挨个使用,否则无法命中索引
- 8.创建索引有没有被使用到?怎么才能知道这条语句运行很慢的原因
MySQL提供了explain命令来查看语句执行计划,MySQL在执行某个语句之前,会将该语句过一遍查询优化器,之后会拿到对语句的分析,也就是执行计划,其中包含了许多信息,可以通过其中和索引有关的信息来分析是否命中了索引,例如possible,key,key_len等字段,分别说明了此语句可能会使用的索引。
- 9.哪些情况下会发生针对该创建了索引但是在查询的时候并没有使用呢?
使用不等于查询 列参与了数学运算或者函数 在字符串like时左边是通配符 当mysql分析全表扫描比索引快时不使用索引 当使用联合索引,前面一个条件为范围查询,后面的即使符合最左前缀原则,也无法使用索引
- 10.什么是事务?
最经典的例子就是转账,要么全成功,要么全失败
- 11.什么是ACID,详细解释?
A=ATOMICTY 原子性,要么全部成功,要么全部失败,不可能只执行一部分操作
C=CONSISTENCY 一致性,系统(数据库)总是从一个状态转移到另一个状态,没有中间状态
I=ISOLATION 隔离性,在一个事务提交完全之前,对其他事务是不可见的(通常来说)
D=DURABILITY,持久性 事务一旦提交就永远是那个样子了。
- 12.同时有多个事务在进行会怎样?
脏读 不可重复度 幻读
- 13.怎么解决这些问题?mysql的事务隔离级别?
未提交读 已提交读 可重复度 可串行化
-
14.innodb默认是可重复读
-
15.mysql的锁了解吗?
共享锁,排它锁
共享锁:读锁,共享锁可以加多个
排它锁:写锁,排它锁只能加一个,和其他锁都互斥
innodb实现了行级锁,并发能力大
- 16.为什么要尽量设定一个主键?
主键是数据库确保数据行在整张表的唯一性的保障,即使业务上本张表没有主键,也建议添加一个自增ID作为主键,设定了主键之后,在后续的增删改查的时候可能更加快速以及确保操作数据范围安全。
- 17.主键使用自增ID还是UUID?
推荐使用自增ID,不要使用UUID。
在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,
主键索引的B+tree叶子节点上存储了主键索引的全部数据(按照顺序),如果主键索引是自增ID,只需要不断的向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入,然后产生数据移动,然后导致产生很多内存碎片,进而造成插入性能下降。
-
18.三范式
-
19.横向分表,纵向分表
-
20.关系型数据库用记录描述了关系
-
21.可以用多个字段(列)组成联合主键
-
22.desc查看列的信息(用可视化工具代替)
-
23.视图直接拖拽就可以,不建议对视图进行增删改
-
24.UML统一建模语言
-
25.重要的三个概念:选择,投影,链接(选择:横向,投影:纵向,连接:表和表之间的链接)
-
26:DML:增删改查 insert into 表名(col列名) value (列的字段)
-
27.insert into 表名 select ;(要求select 查到的数据和表名的数据一一对应)
-
28.update 表名 set 字段=“值” where 判断语句;
-
29.select语句 limit n offset n(偏移几个); 分页用
-
30.where语句 <>不等于
-
31.select * from employees where emp_no in (10001,10002,10003);
-
32.select employee.*,salary.salary from
-
33.内连接 join on
-
34.交叉连接:笛卡尔乘积
-
35.等值连接:只选某些field相等的元素(行),使用on进行关联操作
-
36.自然连接:会去除重复的列。用的比较少
外连接
outer join(也可以用join)
-
左连接,右连接(都是外连接)
-
左连接 左表的内容都要显示出来 从左往右看
-
自连接:自己连自己8
-
分布式的一致性 就需要隔离性
-
全局变量 多个线程操作结果不确定,不能存在这种问题 要加锁
-
多个事务操作
-
隔离性并发情况下带来的后果
-
脏读:事务A读到事务B未提交的数据,事务是一系列动作 是一个中间值
-
隔离做的不好读到了别人的数据
-
不可重复读 不能用同一条查询语句查询到相同的结果
-
脏读可以读到重复的数据
-
不可重复读不能读到相同的数据 读两次 如果变了 就是不可重复读
-
幻读:特殊的不可重复读 数据集有增加的记录
-
更新呢丢失
为此专门定义了事务的隔离级别
读未提交 读已提交 可以重复度 (解决不可重复度,mysql默认的级别) 可串行化(事务不能并发,别并发了,一个一个来)
隔离级别越高效率越低
- mysql中设置隔离级别
- global一定要小心
pymysql的用法
import pymysql
conn = None # 初始化一个链接否则finally里面get不到
cursor = None # 同理
try:
conn = pymysql.Connect("127.0.0.1", "root", "cui980514", "xuelicunzheng")
cursor = conn.cursor() # 获取游标 类似于指针
sql = "select * from myapp_zhongzhi;" # SQL可以进行拼凑,但是生产环境下禁用,防止SQL攻击,前端发来的请求都是不可信的
cursor.execute(sql) # 执行sql语句
print(cursor.fetchone()) # fetchone() 获取一行 可以自定义指针的位置 fetchall()往下的全部拿到
conn.commit() # 事务要提交 默认autocommit=False
except:
conn.rollback() # 中间只要抛异常就rollback
finally:
if cursor:
cursor.close() # 游标关闭
if conn:
conn.close() # 链接关闭
- 参数化查询为什么会提高效率?
对SQL语句编译和缓存
开发时采用参数化查询,提高了编译的效率 - MD5一下进行匹配
- with语句 内部就是调用enter 返回值给as后面的内容
数据库连接池
- 是一个容器,减少了频繁的创建和销毁的性能消耗 提高了性能
- 思路:实际中业务是非常复杂的,不是100-200行代码就能搞定的
- 队列+锁 练习基本功的知识 对一些东西有深刻的认识 Queue解决了多线程安全的问题
元编程 实现 ORM框架
- 生产茶杯的机器就叫元机器
- 生成代码的程序叫元程序,生成编程的东西叫元编程
- type和object 之间的关系很复杂
- 借助type构造任何类,用代码生成代码,这就是元编程
- 元编程一般用于框架的开发 反射
- 越灵活就越使用的元编程
ORM
table:class 表映射类
row:object 行映射对象实例化
col:property 列映射字段 属性
https://www.cnblogs.com/ExMan/p/11272408.html mysql优化
Linux如何查看与测试磁盘IO性能
https://www.cnblogs.com/ExMan/p/11272239.html
Centos 下更改MySQL源数据存放目录(datadir)
https://www.cnblogs.com/ExMan/p/11271850.html
Ubuntu18.04下安装MySQL
https://www.cnblogs.com/ExMan/p/11266352.html
postgresql集群的搭建
https://www.cnblogs.com/ExMan/p/11247163.html
mysql 如何给大表添加字段
https://www.cnblogs.com/ExMan/p/11247066.html
Mysql新增字段到大数据表导致锁表
https://www.cnblogs.com/ExMan/p/11246978.html
MySQL的分区、分表、集群
https://www.cnblogs.com/ExMan/p/11239041.html
MySQL集群原理详解
https://www.cnblogs.com/ExMan/p/11238593.html
- 随着计算机和信息技术的迅猛发展和普及,行业应用系统的规模迅速扩大,行业应用所产生的数据量爆炸式增长。
- 分布式数据库是值数据在物理上分布,逻辑上集中进行管理。可以跨不同机房,城市甚至国家
- 各节点由本地的DBMS管理
mysql集群
- mysql集群是mysql适合分布式计算环境的高可用高冗余版本,采用了NDB cluster存储引擎,允许在一个集群中运行多个mysql服务器,在5.0以上的二进制版本中,以及最新的Linux版本兼容RPM包提供了该存储引擎。
- Mysql cluster由一组计算机构成,每台计算机运行多个进程。
- msyql服务器,NDB Cluster 的数据节点,管理服务器,以及可能存在的专门数据访问程序
- 管理服务器MGM节点负责管理Cluster配置文件 Cluster日志,cluster中每个节点从管理服务器检索配置数据
- 当数据节点内出现新事件时,节点将关于这类事件的信息管理服务器,然后,将这类信息写入cluster日志。
- msyql cluster 分为三种节点:管理节点,数据节点,SQL节点
- 管理节点:用于管理各个节点,能够通过命令对某个节点进行重启关闭等操作,也能够全部节点的工作状态。
- 数据节点:主要对数据的存储,不提供其他服务
- SQL节点:对外提供SQL功能
- SQL节点和数据服务器可以是同一台机器,逻辑上的额划分,实际部署时可以在一台物理机
https://www.cnblogs.com/ExMan/p/11238593.html
腾讯重磅开源分布式NoSQL存储系统DCache
https://www.cnblogs.com/ExMan/p/11166036.html
redis 哨兵机制环境搭建
https://www.cnblogs.com/ExMan/p/11122269.html
mysql优化心得 https://www.cnblogs.com/ExMan/p/11058919.html
mongo可视化工具adminMongo安装
https://www.cnblogs.com/ExMan/p/11047397.html
Grafana+Prometheus系统监控之Redis
https://www.cnblogs.com/ExMan/p/11045479.html
聊聊redis的监控工具
https://www.cnblogs.com/ExMan/p/11045329.html
Linux 服务器buff/cache清理
https://www.cnblogs.com/ExMan/p/11044912.html
Python 操作 mongodb 亿级数据量使用 Bloomfilter 高效率判断唯一性 例子
https://www.cnblogs.com/ExMan/p/11040991.html
redis RDB AOF
https://www.cnblogs.com/ExMan/p/11040399.html
练练数据库的索引吧
https://www.cnblogs.com/ExMan/p/10385554.html