MySQL

2019-07-29  本文已影响0人  吴晗君

为什么需要数据库操作系统,历史上最开始的数据库是怎么样的,有什么问题?

最开始的数据库其实和现在没有什么区别,都是存储在硬盘的文件中。存在的问题是:

  1. 数据存储冗余,每张表可能存有相同数据。
  2. 数据不一致,可能相同字段在不同的表中都存在,但是某天数据更新了,并不会更新所有表。这个问题,现如今还是会存在。需要好的设计模式来解决。
  3. 数据访问困难,不能像现在一样通过命令来查询。如果现在有一个需求,产品想要特定区域内客户的账户主人的姓名,或者需求升级了,需要账户金额高于10000的人的账户主人的姓名。以前这类需求是不支持的。
  4. 数据孤立,这些数据可能存储在不同文件夹中的不同类型的文件中,导致查询很麻烦。
  5. 并发访问异常,难以处理多个连接同时访问时对数据的正确处理。

什么是关系型数据库?

关系模型用表的集合来表示数据和数据间的关系。
例如银行中:客户账户信息表、客户详细信息表、客户与账户之间对应关系表。这三张表组成的集合就描述来数据与数据间的关系。

什么是主键(Primary Key)和外键(Foreign Key)

如果
有成绩表和学生表两张表。

成绩表中的学号不是成绩表中的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键。

联合主键(组合键)

如果两列或者多列组合起来唯一标识表中的每一行,则该主键又称为"组合键"。

什么是索引,为什么需要索引?什么是聚集索引和非聚集索引?

如果要去硬盘里根据条件找一段数据,就和想要去一本厚书中找一个段落一样,非常麻烦。

这个时候,索引就出现了,它就像目录,标识了数据存在的位置。数据库中除了存储数据之外还存储了索引。

索引的定义:索引包含从表中一个或多个列生成的键,以及映射到指定数据的存储位置的指针,也就是说索引由键和 指针组成。它是用于提高数据库表数据访问速度的数据库对象。
聚集索引和非聚集索引
索引

int(11)中的11的意义是?

和实际存储大小没有关系,指定为int了,存储大小就是4k。它的意思就是显示宽度。
MySQL中的int(11)到底代表什么意思?

DDL

Data Define Language是用来定义数据库和表结构的,无需背、记。比如创建表、修改表结构等等,平常都是通过界面操作。

SQL

Structured Query Language结构化查询语言

为什么要用SQL

在生产环节中,大量业务不可能通过界面操作数据库,我们需要通过应用程序来完成。

SQL组成

DDL(data definition language)是数据定义语言
主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。无需背、记。比如创建表、修改表结构等等,平常都是通过界面操作。

DML(data manipulation language)是数据操纵语言
它们是SELECT、UPDATE、INSERT、DELETE`,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言

DCL(DataControlLanguage)是数据库控制语言是用来设置或更改数据库用户或角色权限的语句,包括(grant,revoke等)语句

为什么在分组查询的时候,要查询的列必须被包含在分组列中?

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'support_desk.mod_users_groups.group_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
SELECT city, name count(idcard)
FROM testTable
GROUP BY city

用ANY_VALUE实验得到原因

SELECT city, ANY_VALUE(name), count(idcard)
FROM testTable
GROUP BY city

如果要查询的列name不在GROUP BY中,在查询结果中MySQL无法知道要输出哪一列的name,而用ANY_VALUE这个api会得到任意一列的name,也就是个随即值。所以MySQL默认模式sql_mode=only_full_group_by,指定要查询的列必须在GROUP BY中。

count(*)、count(1)和count(column_name)的区别

首先他们仨都是统计行数的。这个内部会涉及索引,内容挺多的,在这篇知乎上可以看到。
使用上的区别是:count(column_name)在统计的时候不包含该列为null的行。而count(*)是包含的。count(1)在使用上和count(*)没有区别,在某种条件会与count(*)走同样的优化。等索引学完了更新下这个答案。常用count(*)

HAVING和WHERE的区别

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

表连接

两个表最简单的连接用的是笛卡尔乘积,其实就是两个表的并集,两者相同的列会生成一个name(2)新列/

SELECT  *  from tableA, tableB

内连接可以用WHERE替换

数据去重

segmentfault

软件开发

软件开发就是将现实世界通过建模的方式在信息世界还原的过程。

为什么需要基于角色的权限访问控制(Role-Based Access Control),直接给用户分配权限有哪些问题?

这篇文章说的非常清楚
其实是可以直接给用户分配权限,只是直接给用户分配权限,少了一层关系,扩展性弱了许多,适合那些用户数量、角色类型少的平台。

image
对于通常的系统,比如:存在多个用户拥有相同的权限,在分配的时候就要分别为这几个用户指定相同的权限,修改时也要为这几个用户的权限进行一一修改。有了角色后,我们只需要为该角色制定好权限后,将相同权限的用户都指定为同一个角色即可,便于权限管理。

对于批量的用户权限调整,只需调整用户关联的角色权限,无需对每一个用户都进行权限调整,既大幅提升权限调整的效率,又降低了漏调权限的概率。

事务是什么,为什么需要事务?它是怎么实现的?

深入浅出事务
银行转账问题:A账户资金减少,B账户资金增加。一旦B账户执行出错,A账户的金额就会减少。这就是个问题。

事务是作为单个逻辑工作单元执行的一系列操作,多个操作作为一个整体向系统提交,要么都执行,要么都不执行,事务是一个不可分割的工作逻辑单元。
比如转账问题,用事务进行处理就是A账户的增加和B账户的减少构成一个事务。他俩是不可拆分的。

使用:数据库默认是自动commit的(可以类比github),开始事务后,对数据库的操作就是非自动的。每次对数据库进行操作之前,使用START TRANSACTION表示开启事务,这些操作就会被存储在缓冲区内,不会真实提交到数据库中。如果流程没有出问题,可以用COMMIT提交事务。如果程序报错,可以用ROLLBACK回滚事务,这样可以保证数据不会出错。

为什么需要连接池?

应用服务区(比如Node)和数据库服务器(mysql)之间连接也是走的tcp连接,不断地连接和断开非常消耗时间和性能,没有必要。所以就有了连接池的概念,在应用服务器启动的时候连接一次,后续就不再关闭。这样的话,有用户请求,应用服务器就可以通过连接池中建立的n个连接来和数据库进行通信。

在业务代码中对数据库的操作每次都得创建事务,然后出错的时候回滚吗?这样在node中会有很多层回调函数嵌套,感觉很不友好。

数据库事务原子性、一致性是怎样实现的?

知乎回答

上一篇下一篇

猜你喜欢

热点阅读