sql读写文件的函数有哪些?

该项目记录了Oracle相关的速查知识汇总,主要涉及了oracle基础使用、SQL基础、oracle函数、oracle触发器、oracle高级查询、PL/SQL编程基础、PL/SQL存储过程等。若有新增,还将不断添加中。

(7)设置某字段的默认值

在创建表以后添加默认值:

只能以行为单位来删除数据

约束的作用是定义规则(最重要),确保完整性。

在创建表时设置非空约束:
在修改表时添加非空约束:
在修改表时去除非空约束:

必不可少,确定每一行数据的唯一性。

一张表只能设计一个主键约束。

主键约束可以由多个字段构成,称为联合主键或者复合主键。

在创建表时设置主键约束:

如果没有用约束来创建主键,则系统会自动命名约束的名称,可以看这个:

在修改表时添加主键约束:
更改约束的名称,可以修改任何约束的名字
drop primary key[cascade]; --删除主键约束,如果存在外键约束,填写cascade,可以把其他表中引用该主键约束的一起删掉

两个表之中字段关系的约束。

在创建表的时候设置外键约束:
--table2为主表,table1为从表,也叫主从表。主表当中的字段必须是主表中的主键字段,主从表的字段要设置成同一个数据类型。在向设置了外键约束的表输入值的时候,从表中外键字段的值必须来自主表中的相应字段的值,或者为null值。
如果这样给从表插入数据:

则2在主表中没有找到,会报错。需要填写

才可以,或者那个部分留空值:

在创建表的时候设置外键约束:
--定义完所有的字段之后设置的约束
--后面的中括号是级联删除,表示主表当中的一条数据被删除的时候,从表当中使用了这条数据的字段所在的行也会被一起删除掉,这样确保了主从表数据的完整性。
在修改表时添加外键约束:

作用是保证字段的唯一性,和主键约束的区别是,主键约束必须是非空的,而唯一约束允许有一个空值。主键约束在一张表中只能有一个,唯一约束可以有多个。

在创建表时设置唯一约束:
在修改表时添加唯一约束:

检查约束,让表当中的值更具有实际意义,能够满足一定的条件,具有实际意义。

在创建表时设置检查约束:
在修改表时添加检查约束:
  • 主键约束:每张表只能有一个,可以由多个字段构成
  • 外键约束:涉及两个表之间的关系

在创建表时设置约束: 只有非空约束只能在列级设置约束,不能在表级设置约束,其他的都是两者都可以的。非空约束是没有名字的。

在修改表时添加约束,也是只有非空约束不同,修改表时用的语句是

更改约束的名称:数据字典(user_constraints查看名称)

删除约束,非空约束较特殊

其他的如果是禁用的话使用

--column可以简写成col,设置新的字段名(别名),使用select语句来查询的时候就可以看到变化了,但使用desc看结构还依然不变化。

注意:字符类型只能设置它的长度。 --字符格式用a开头,后面跟它要的长度。 如

如果是数值类型用,9表示一位数字,比如

可以保留4位数和一位小数。 如果

但如果数据中有四位的数,超过这个长度的就用#####表示了,与excel一致。

清除之前设置过的格式:

(3)查询表中的所有字段

不会更改字段的名字,可以为多个字段设置别名

运算符大家都比较熟悉了,而表达式=操作数+运算符组成。

oracle中的操作数可以有变量、常量、字段。

运算符有算术运算符(+、-、*、/),比较运算符(>,>=,<,<=,=,<>都是用在where条件里面的,两个数进行比较得到的结果是布尔类型的,真或者假),逻辑运算符(and,or,not)

在select语句中使用运算符

在查询结果中,给每个员工的工资加上200元,但数据本身没变。 如

查询工资高于800元的员工的姓名; 如

逻辑运算符的优先级顺序:not,and,or

比较运算符优先级高于逻辑运算符

like关键字,也可以归入比较运算符当中。

通配符的使用(_表示一个字符,%表示0到多个任意字符) 如

between...and --表示从什么到什么之间。查询结果是含头又含尾的区间。

如果不在这个之间的,在它们前面加上not 如

in/not in 后面跟着小括号,里面是一个列表的值,一个具体的值。 如

10.其他一些实用命令

  • 使用上下箭头可以选择历史输入记录来使用。
substr(char,[m[,n]]) --获取子字符,分别是从哪取,从哪个位置开始取以及取出多少位,n省略时,从m的位置截取到结束,m从1开始如果m写0也是从第一个字符开始。如果m为负数时,从字符串的尾部开始截取
trim(c2 from c1) --代表从c1中去除c2字符串,就是子文本替换,要求c2中只能是一个字符
ltrim(c1[,c2]) --从c1中去除c2,从左边开始去除,要求第一个就是要去除的字符,有多少个重复的该字符就会去除多少次
rtrim(c1[,c2]) --从c1中去除c2,要求右侧第一个就是要去除的字符,有多少个重复的该字符就会去除多少次
trim(c1) --代表去除首尾的空格,删首尾空,同理ltrim和rtrim只有一个参数时。
add_months(date,i) --用于添加指定的月份,返回在指定的日期上添加的月份,i可以是任意整数,如果i是负数,则是在原有的值上减去该月份了
next_day(date,char) --第二个参数指定星期几,在中文环境下输入星期X即可,返回下一个周几是哪一天。

用于截取日期时间的trunc函数

用法:trunc(字段名,精度)

1、截取时间到年时,sql语句如下:

2、截取时间到月时,sql语句:

3、截取时间到日时,sql语句:

4、截取时间到小时时,sql语句:

5、截取时间到分钟时,sql语句:

6、截取时间到秒暂时不知道怎么操作

8.如果不填写第二个参数,则默认到DD,包含年月日,不包含时分秒。

to_char(date[,fmt[,params]]) --date为需要转换的日期,fmt为转换的格式,params为转换的语言(通常默认会自动选择,可以省略,与安装语言一致)
  • 9:显示数字并忽略前面的0
  • 0:显示数字,位数不足,用0补齐
  • S:加正负号(前后都可以) 如

fmt是转换的格式,可以省略 如

  • 在员工信息表中查询员工的生日
  • 将员工信息表中的年龄字段与10取余数
  • 查询出5月份入职的员工信息

本部分需要有如下两个部分的基础

  • 《oracle数据库开发必备利器之SQL基础》
  • 《oracle数据库开发利器之函数》

分组函数作用于一组数据,并对一组数据返回一个值。 结构:

  • 求出员工的平均工资和工资的总和
  • 求出员工工资的最大值和最小值
  • 举例1:统计员工的平均工资 如
  • 举例二:统计员工的平均奖金 如

二和三结果一样,一不一样,因为在奖金列里面含有空值,count的时候数数不一样

所以分组函数会自动忽略空值,可以在分组函数中使用nvl函数来使分组函数无法忽略空值 如

  • 求出员工表中各个部门的平均工资 注意:在select列表中所有未包含在组函数(就是汇总计算xxx的列)中的列都应该包含在group by子句中,但包含在group by子句中的列不必包含在select列表中 如

要求所用包含于select列表中,而未包含于组函数中的列都必须包含于group by子句中。

这里的deptno没有包含在group by子句中,所以会报错。

注意不能在where子句中使用组函数(注意)。

可以在having子句中使用组函数。

如果在能使用where的场景下,从SQL优化的角度来看,尽量使用where效率更高,因为having是在分组的基础上过滤分组的结果,而where是先过滤,再分组。要处理的记录数不同。所以where能使分组记录数大大降低,从而提高效率。

(7)在分组查询中使用order by子句

  • 示例:求每个部门的平均工资,要求显示:部门号,部门的平均工资,并且按照工资升序排列 可以按照:列、别名、表达式、序号进行排序
  • 示例:求部门平均工资的最大值 如
  • 按部门、不同的职位显示工资的总额;同时按部门,统计工资总额;统计所有员工的工资总额。 如

rollup就可以实现上述的效果。小计、总计的效果,可以用在报表里面。

再运行上面的代码即可。

部门号 职位 工资总额 部门号 职位 工资总额

按数据库设计原则,员工表中只有部门的编号信息,部门的详细信息会存放在部门表中。

什么是多表查询:就是从多个表中获取数据。

前提是有一个外键约束来表示员工是哪个部门的,有个一个部门号来联结。

有了它才有多表查询的存在。笛卡尔集的列数等于每张表列数的相加,行数等于每张表的行数相乘。比如emp*dept有六列六行。里面的每一条记录不一定都是对的。多表查询就是要从笛卡尔集中选择出正确的记录。需要一个连接条件,比如部门号相等。有了连接条件,就能避免使用笛卡尔全集。在实际运行环境下,应提供where连接条件,避免使用笛卡尔全集。连接条件至少有要连接表数-1个。

创建笛卡尔集可以使用全连接: FULL JOIN

核心:通过外连接,把对于连接条件不成立的记录,仍然包含在最后的结果中。

左外连接(LEFT [OUTER] JOIN):当连接条件不成立的时候,等号左边的表仍然被包含

右外连接(RIGHT [OUTER] JOIN):当连接条件不成立的时候,等号右边的表仍然被包含

改为右外连接 方法是在相反的方向的等值连接结尾加上(+),比如右外连接就是加在左边的最后。

部门号 部门名称 人数
 
  • 作用:通过别名,将同一张表视为多张表(核心) INNER JOIN

尽管是查询一张表,但本质上仍然是多表查询,会产生笛卡尔集。

可以通过这个看笛卡尔集有多少条记录select count(*) from emp e,emp b;表越多,次方越多。比如员工表中有一亿条记录,如果看成三张表,就有一亿的立方的笛卡尔集,所以自连接不适合查询大表。

  • 所以要使用解决方法: 层次查询 (单表查询,只有在一张表时才不会查询笛卡尔集,在某些情况下可以取代自连接)。

  • 层次查询的原理:可以把前面的结果变成分level的一棵树。这棵树的根是没有上司的king,也就是mgr就是NULL。 如:

  • 自连接的优点:结果直观。缺点:不适合操作大表。

  • 层次查询的优点:适合单表查询,不会产生笛卡尔集。缺点:并没有自连接那么直观。

为什么要学习子查询:子查询可以解决不能一步求解的问题

  • 示例:查询工资比scott高的员工信息

子查询的语法:其实也就是select语句的嵌套

(2)子查询注意的十个问题

语法中一定要有小括号,不然是错的。

该换行的换行,该缩进的索引,可以便于阅读。

select后面使用,要求一定要只返回一条记录,要是单行子查询才行,多行子查询不行。 如

非常的重要,很多问题都是在from后面方式子查询来解决的 如

  • 不可以使用子查询的位置:group by
  • 强调:from后面的子查询,比较特殊,比较重要
  • 主查询和子查询可以不是同一张表

哪种查询方式好呢?从理论上来讲,尽量使用多表查询比较好,因为子查询需要对数据库访问两次,而多表查询只需要对数据库访问一次。但实际情况下有可能不一样,因为多表查询的笛卡尔集可能很大所以慢了。

  • 一般不在子查询中,使用排序;但在Top-N分析问题中,必须对子查询排序

比如找到员工表中工资最高的前三名。

rownum行号,是一个伪列,表上没有这一列,当做一些特殊操作的时候,oracle自动加上。行号需要注意的问题:行号永远按照默认的顺序生成;行号只能使用<,<=,不能使用>或者>=这样的符号。 如

  • 一般先执行子查询,再执行主查询;但相关子查询例外

相关子查询的表必须设定一个别名,然后把主查询的内容传入到子查询中进行查询。 如

这里就把主查询e表中的部门号传入子查询中进行查询了。

  • 单行子查询只能使用单行操作符;多行子查询只能使用多行操作符

非法使用单行子查询: 如

group by deptno); --因为子查询返回了不止一行,所以是非法使用单行子查询。
多行操作符:in(等于列表中的任意一个)、any(和子查询返回的任意一个值比较)、all(和子查询返回的所有值比较)
  • 注意:子查询中是null值的问题

单行子查询中返回空值,要使用in之类的关键字,等于号的话永远为空。

多行子查询中,如查询不是老板的员工 如:

  • 分页查询显示员工信息:显示员工号,姓名,月薪
  • 注意:rownum只能使用<,<=不能使用>,>=,因为oracle数据库是一个行式数据库,取了第一行才能取第二行,所以行号永远从1开始,所以比如rownum>=5这样的条件永远为假。
  • 找到员工表中薪水大于本部门平均薪水的员工

如果需要查询执行计划看性能的话,则在语句前面加上EXPLAIN PLAN FOR

  • 按部门统计员工人数,按照规定格式输入,已知员工的入职年份在80,81,82,87年之中。 如

新建两个表,然后按要求查到相关的内容

1.需要进行两个表的连接查询,为两个表都取别名

2.使用instr(a,b)函数,该函数的含义为:如果字符串b在字符串a的里面,则返回的是b在a中的位置,及返回值大于0

1 张三,赵六,王五,李四

同时学会了一个,如果在oracle中,需要实现如果表已经存在则先删除表的操作,写法为:

--如果已经存在表则先删除表
 

其中查询的表名和drop的表名变成你要检测的表名即可。

使用PLSQL语言操作Oracle数据库的效率最高。

之前用sql语句是命令式的语言,但如果案例是复杂的,比如需要分条件来做不同的事情的,就需要PL/SQL效率会更高,不需要用其他的编程语言。

指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。

(1)是sql的扩展,支持sql语句。

(2)是面向过程的语言。

--说明部分(变量说明、光标申明、例外说明) --程序体(DML语句)
/ --这个正斜杠用来退出前面的代码编写并且执行语句

4.不同数据库中SQL扩展

举例:名字在片面,变量是在后面,:=为赋值符号不是单=号

这里的into就可以赋值,是一一对应的。

--取表中一行的类型,作为变量的类型,可以理解为数组,如果需要取用到列里面的某一行,就像如下写法:
--在控制光标的时候比较简单
 

select如果返回的结果有多行的话就会出错,所以需要引入光标,光标cursor就是一个结果集。也叫游标。

此外,光标是可以带参数的。

(1)把当前指针指向的记录返回;

(2)将指针指向下一条记录。

  • %isopen:判断光标是否打开
  • %rowcount:影响的行数,不是总行数,比如光标取走了10行的数据,那么这个值就是10

默认情况下,oracle数据库只允许在同一个会话中打开300个光标

scope是范围,取值有三个:both, memory(只更改当前实例), spfile(只更改参数文件,数据库需要重启)

例外是程序设计语言提供的一种功能,用来增强程序的健壮性和容错性。

  • timeout_on_resource 在等待资源时发生超时(分布式数据库的访问会用到)

使用raise关键字抛出自定义例外

设计1.概要设计2.详细设计

以上步骤就像水流一下,最忌讳一上来就编码。

想明白SQL语句、变量。

变量:1.初始值是多少2.最终值如何得到

  • 使用||符号来连接文本字符串。
  • --表示单行注释,/* */表示多行输入
  • plsql中大小写不敏感。
  • then语句相当于一个大括号,后面的语句可以一起被处理,比如如下写法:

这里两句话都会被打印出来。

  • 把握一个原则:能不操作数据库就不操作数据库,比单单加减乘除的计算慢。

触发器是一个特殊的存储过程。是一个与表相关联的、存储的PL/SQL程序。

作用:每当一个特定的数据操作语句(insert、update、delete,注意没有select)在指定的表上发出时,oracle自动地执行触发器中定义的语句序列。

在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行。

语句级触发器针对表,只会触发一次

触发语句作用的每一条记录都被触发。在行级触发器中使用:old和:new伪记录变量,识别值的状态。如果有for each row就表示行级触发器。 如

行级触发器针对行,有多少条记录就触发多少次。

每当成功插入新员工后,自动打印一句话,"成功插入新员工"。单词trigger

4.触发器的具体应用场景

(1)复杂的安全性检查 --比如周末不允许操作数据库

(2)数据的确认 --涨后的工资大于涨前的工资

(3)数据库审计 --跟踪表上所做的数据操作,什么时间什么人操作了什么数据,操作的人是什么。基于值的审计

(4)数据的备份和同步 --异地备份,把主数据的数据自动同步到备数据库中

  • 触发器案例一:禁止在非工作时间插入数据
  • 触发器案例二:涨工资不能越涨越少 :old:new的使用要注意。
  • 触发器案例三:创建基于值的触发器
PLSQL子程序体; (关键字可以小写)(如果不传参,则参数列表的小括号也可以省略)

这个PLSQL子程序体;一般为:

如果写的是存储函数,那么这里的PROCEDURE需要改成FUNCTION,而且必须在参数列表和AS之间添加一句:RETURN 函数值类型。而且需要在子程序体需要返回的时候写return 返回值

写好之后先编译,然后调用、运行。

as后面跟的是说明部分,相当于declare。

在参数列表中,如果是输入参数,可以写入eno in number,in是关键,in前面是变量名,后面是变量类型。

如果是输出参数,写eno out number,out是关键,out前面是变量名,后面是变量类型。

存储过程和存储函数都可以有out参数。

他们都可以有多个out参数。

存储过程可以通过out参数来实现返回值。

查询某个员工姓名、月薪和职位

--得到该员工的姓名、月薪和职位

5.在out参数中使用光标案例

案例:查询某个部门中所有员工的所有信息。

包头(负责声明包中的结构):

注意:包头中也可以不定义存储过程,只定义光标那一行。

包体(负责写需要实现包头中声明的所有方法):

--打开光标类型(是一个集合,意味着可以返回许多信息的集合)

注意:包体里面的存储过程也可以不写在包体内部也可以一样调用包头中定义的光标。

  • 参数列表可以换行,也可以在关键字之间多加空格。
  • 如果是没有参数的就是存储过程,如果有参数就是存储函数。存储函数可以有一个返回值,可以用return子句进行返回。
  • 我们的原则是,如果只需要一个返回值,则用存储函数。如果没有返回值,用存储过程,如果需要有多个返回值,则使用存储过程,在参数中使用out参数。
  • 单行注释使用“--注释内容”,多行注释使用“/* 注释内容 */”。

哪个权限没有就到sqlplus输入如下代码:

grant 要调的权限(中间用逗号分隔) to 用户名;

一些不知道插进过去的哪些笔记的笔记就放在这里吧~

为例, exists表示,对于A中的每一个记录,如果,在表B中有记录,其属性a的值与表A这个记录的属性a的值相同,则表A的这个记录是符合条件的记录,

如果是NOT exists,则表示如果表B中没有记录能与表A这个记录连接,则表A的这个记录是符合条件的记录。

、一个数据库的状态是否正常可以从哪些指标看出来,至少列出2个

正在运行的mysql进行监控,其中一个方式就是查看mysql运行状态。
 apache是一个请求对应一个线程的模式,不管那个请求是否需要读写都会分配一个线程,而nginx则是异步非阻塞模型,只有当请求需要读写的时候才会拿出来处理。

、问页面请求超时取决于nginx的配置还是PHP-CGI的配置?

、PHP中常见错误类型?

 1、Notice:这些都是一些非常正常的信息,而非重大错误,甚至有一些都不会展示给用户。
 2、Warning:这类是稍微严重一些的错误,错误会展示给用户,但不影响程序的输出。
 3、Fatal errors:这些是非常严重的错误,比如要访问一个不存在的PHP类。
 200 - 服务器成功返回网页
 301 - 永久移动,请求的网页已被永久移动到新位置
 304 - 缓存网页未修改,直接返回内容
 403 -(已禁止) 服务器拒绝请求
 404 - 请求的网页不存在,网页不存在。
 500 - 服务器遇到错误,无法完成请求。
 503 - 服务器暂时不可用,目前无法使用服务器(由于超载或进行停机维护)。通常,这只是一种暂时的状态。 HTTP 状态代码的完整列表 
答:使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数。另外const在编译时要比define快很多。 1、const用于类成员变量的定义,一经定义,不可修改。Define不可以用于类成员变量的定义,可用于全局常量。 3、Const不能再条件语句中定义常量 4、const采用普通的常量名称,define可以采用表达式作为名称 5、const只能接受静态的标量,而define可以采用任何表达式 6、const定义的常量时大小写敏感,而define可以通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感。

、PHP支持多继承吗?

、用php写出显示客户端Ip与服务器Ip的代码

、用最少的代码写一个求3值最大值的函数.

7、写出 访问 所需的报文头

、本页地址,当前脚本的名称

、链接到当前页面的上一页面的 URL 地址:

print_r() 可以打印出复杂类型变量的值(如数组,对象)

、对于大流量的网站,您采用什么样的方法来解决访问量问题?

2、生成html静态页面 3、使用主辅数据库,把数据库的读写分开 4、使用负载均衡器和多台服务器

、类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是。

、语句include和require的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们?

 1、pHp程序执行到require()时,只会读取一次档案,故常放在程序开头,档案引入后pHp会将网页档重新编译,让引入档成为原先网页的一部分。
 2、pHp程序执行到include()时,每次皆会读取档案,故常用于流程控制的区段,如条件判断或循环中。

12、php5中魔术方法函数有哪几个,请举例说明各自的用法

__destuct():当删除一个对象或者对象操作终止是被执行; __call():调用对象不存在方法时被调用; __get():调用对象不存在的属性时被调用; __set():设置对象不存在的属性时被调用; __sleep():serialize之前被调用,若对象比较大,想做一些删除在序列化,可以考虑使用该方法; __autoload():实例化一个对象时,如果对应的类不存在,在该方法被调用 __FILE__:返回文件的完整路径和文件名,如果用在包含文件里面,则返回包含文件名,自 php4.0.2开始, __FILE__总是包含一个绝对路径,而在此前的版本有时候会包含一个相对路径 __FUNCTION__:返回函数名称(自 php4.3.0新加的)。自php5起本常量返回该函数被定义时的名称,区分大小写,在php4中该值总是小写; __CLASS__:返回类的名称,自 php4.3.0新加的,自php5起本常量返回该类被定义时的名称,区分大小写,在php4中该值总是小写的;

13、简单说明pHp的垃圾收集机制是怎样的?

 对变量有个引用计数,计数到0时变量被销毁

14、请写一段pHp代码,确保多个进程同时写入同一个文件成功

15、你用什么方法检查php脚本的执行效率(通常是脚本执行时间)和数据库SQL的效率(通常是数据库Query时间),并定位和分析脚本执行和数据库查询的瓶颈所在

2, xdebug统计函数执行次数和具体时间进行分析,最好使用工具winCacheGrind分析 3, 在线系统用strace跟踪相关进程的具体系统调用 通常还要看数据库设计是否合理,需求是否合理等

4、请简述操作系统的线程与进程的区别。列举LINUX下面你使用过的软件?
5、熟悉memcache/redis、MVC/REST架构、模板引擎、中间件的原理与应用者优先;

mysql_fetch_array() 从结果集中取得一行作为关联数组,或数字数组,或二者兼有

、MYSQL取得当前时间的函数是?,格式化日期的函数是

1、请简述数据库设计的范式及应用。
  一般第3范式就足以,用于表结构的优化,这样做既可以避免应用程序过于复杂同时也避免了SQL语句过于庞大所造成系统效率低下

 1NF:原子性 字段不可再分,否则就不是关系数据库; 
 2NF:唯一性 一个表只说明一个事物; 
 3NF:每列都与主键有直接关系,不存在传递依赖; 

  第一范式:若关系模式R的每一个属性是不可再分解的,再属于第一范式。
  第二范式:若R属于第一范式,且所有的非码属性都完全函数依赖于码属性,则为第二范式。
  第三范式:若R属于第二范式,且所有的非码属性没有一个是传递函数依赖于候选码,则属于第三范式

1、创建新闻发布系统,表名为message有如下字段 (3分)

2、列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩

、JS表单弹出对话框函数是?获得输入焦点函数是?

TCP协议下的套接字通信

什么是进程和什么是线程两者之间的区别

守护进程与守护线程之间的差异

OSI七层协议的简要说明
  • 为了实现计算机系统的互连,OSI参考模型将整个网络的通信功能划分为七个级别,并且还定义了级别与每个层中所包含的服务以及每个层的功能之间的相互关系。 。 OSI从低到高的七个层分别是:物理层,数据链路层,网络层,传输层,会话层,表示层,应用程序层,接下来的三层(物理层,数据链路层,网络层)分别是面向数据通信,上三层(会话层,表示层,应用层)面向资源子网,而传输层是七层中最重要的一层。它位于上下层之间,是上下层之间的链接。
什么是C/S和B/S体系结构
  • C/S体系结构是典型的两层体系结构,其全名是Client/Server体系结构,即客户机/服务器体系结构,其客户机包含在用户计算机上运行的一个或多个程序,并且服务器-方面有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端数据。另一个是Socket服务器端,服务器端程序通过Socket与客户端程序进行通信。
  • B/S体系结构的全名是Browser/Server,即浏览器/服务器结构。浏览器是指Web浏览器。很少有事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器客户端,WebApp服务器端和数据库端构成了所谓的三层体系结构。 B/S体系结构系统不需要特殊的安装,只需要Web浏览器
简要描述TCP三向握手和四波的过程。
    • 第一次握手:客户端的申请流程会主动打开并将请求段发送给客户端。在其标题中:SYN = 1,seq = x。
    • 第二次握手:服务器应用程序进程被被动打开。如果客户的请求得到同意,则会发送回确认消息。在其标头中:SYN = 1,ACK = 1,ack = x + 1,seq = y。
    • 第三次握手:客户端收到确认消息后,它通知上层应用程序进程已建立连接,并向服务器发送确认消息。它的标头:ACK = 1,ack = y +1。当服务器从客户端收到确认消息时,它还会通知其上层应用程序进程已建立连接。
    • 第一波:数据传输结束后,客户端的应用程序进程将发送连接释放段并停止发送数据。其标头:FIN = 1,seq = u。
    • 服务器收到连接释放消息段后,会发送一条确认消息,其标题为:ack = u + 1,seq = v。这时,连接已进入半关闭状态,客户端没有不再将数据发送到服务器。服务器将继续发送。
    • 第三波:如果服务器没有要发送给客户端的数据,则它的应用程序进程通知服务器释放TCP连接。服务器在此阶段发送的最后一条消息的标头应为:FIN = 1,ACK = 1,seq = w,ack = u +1。
    • 第四波:收到连接释放段后,客户端必须发送一个确认:ACK = 1,seq = u + 1,ack = w +1。经过2MSL(最长消息寿命)后,此TCP连接真的结束了,沟通的双方都已经告别了。

    如果已建立TCP连接但客户端突然失败,该怎么办?

    • TCP还具有一个保持活动计时器。显然,如果客户端发生故障,服务器将无法永远等待,浪费资源。服务器每次收到客户端请求时都会重置此计时器。时间通常设置为2小时。如果客户端在两个小时内没有收到来自客户端的任何数据,则服务器将发送一个探测段。每秒发送一次。如果连续发送10条探测消息后仍然没有响应,则服务器认为客户端已失败,然后关闭连接。
  • ARP的全名是”地址解析协议”,即地址解析协议。
  • 通过LAN中的IP地址实现主机的MAC地址。
  • 48位MAC地址主机的物理地址在LAN中是唯一的。
  • ARP协议类似于DNS服务,但是无需配置服务。
  • ARP协议是三层协议。
  1. 面向TCP连接(例如在拨打电话之前进行拨号以建立连接); UDP是无连接的,即在发送数据之前不需要连接
  2. TCP提供可靠的服务。换句话说,通过TCP连接传输的数据没有错误,没有丢失,没有重复并按顺序到达。 UDP尽最大努力进行传送,即不能保证可靠的传送
  3. UDP具有更好的实时性能,并且其工作效率高于TCP。适用于高速传输和实时通信或广播通信。
  4. 每个TCP连接只能是点对点的; UDP支持一对一,一对多,多对一和多对多的交互式通信
  5. TCP需要更多的系统资源,而UDP需要更少的系统资源。
为什么基于tcp协议的通信比基于udp协议的通信更可靠
  • TCP是一种面向连接的传输协议。每次您需要建立可信任的连接时,都会有一个三向握手过程。而且UDP是无连接传输协议,无需建立安全连接,
  • 局域网(LAN),称为LAN,是指由特定区域中的多台计算机互连的一组计算机。 “某个区域”是指通常在几公里之内的同一办公室,同一建筑物,同一公司,同一所学校等。局域网可以实现诸如文件管理,应用软件共享,打印机共享,扫描仪共享,工作组计划,电子邮件和传真通信服务之类的功能。局域网是封闭的,可以由办公室中的两台计算机组成,也可以由公司中的数千台计算机组成。
  • 广域网(Wide Area Network,简称WAN)是跨越大型区域网络的计算机网络的集合。通常跨省,市甚至一个公司/地区。 WAN包含不同大小的子网。子网可以是局域网或小型WAN。
    • 范围不同,WAN比LAN宽
什么是套接字?简要描述基于tcp协议的套接字通信过程?
  • 套接字通常也称为\\ u插座;用于描述IP地址和端口,是通信链的句柄。
    1. 服务器创建一个ServerSocket对象,指定端口号,然后ServerSocket对象等待客户端的连接请求。
    2. 客户端创建一个Socket对象,指定主机地址和端口号,并将连接请求发送到服务器。
    3. 服务器接收客户端的连接请求,建立TCP连接,然后创建一个Socket对象以与客户端的Socket对象进行通信。
    4. 服务器和客户端分别创建一个字节输入流和一个字节输出流,通过字节输入流从另一方获取数据,并通过字节输出流将数据发送到另一方。
    5. 当一方决定结束通信时,它将发送结束消息给另一方;另一方收到结束消息后,双方将关闭各自的TCP连接。
    6. ServerSocket对象停止等待客户端连接请求。
什么是粘性包装?粘小包的原因?
  • 粘性数据包:多个数据包连续存储在一个连续的缓冲区中。当读取数据分组时,由于不能确定发送者的发送者,因此使用一定的估计值来读出数据。如果双方的大小不一致,则意味着发送方发送的某些数据包数据将在接收方收到时粘贴到数据包中。在接收缓冲区中,后一个数据包的数据的开头紧跟着前一个数据包的数据的结尾。
  • 产生粘滞现象的原因很多。这可能是由发送者或接收者引起的。
    • 由发送方引起的粘性数据包是由TCP协议本身引起的。为了提高TCP的传输效率,发送方通常必须在发送数据包之前收集足够的数据。如果连续几次发送的数据很少,通常TCP将根据优化算法将这些数据合成为一个数据包,然后一次发送出去,以便接收方接收到粘性数据包数据。
    • 接收方造成的粘包是因为接收方的用户进程没有及时接收到数据,导致粘包现象。这是因为接收器首先将接收到的数据放入系统接收缓冲区中,而用户进程则从缓冲区中获取数据。如果下一个数据包到达时,用户进程尚未提取前一个数据包,则将下一个数据包放入系统接收缓冲区时,它将接收前一个数据包,然后用户进程将获取系统会根据预设的缓冲区大小从系统接收缓冲区接收数据,以便一次获取多个数据包。
  1. 对于由发送方引起的粘连现象,用户可以通过编程避免它。 TCP提供操作命令推送,以强制立即传输数据。收到操作命令后,TCP软件立即发送该段的数据。无需等待发送缓冲区已满;
  2. 对于由接收方引起的粘性数据包,可以优化程序设计,简化接收过程的工作量,并增加接收过程的优先级以使其及时接收数据,从而避免产生粘性包尽可能多;
  3. 它由接收器控制,并将数据包划分为结构字段。人工控件分为多个接收,然后合并。这种方法可以避免粘性数据包。
  • I/O复用用于提高效率。单个进程可以同时监视多个网络连接IO。
  • 与多进程和多线程技术相比,I/O复用技术的最大优点是系统开销很小,并且系统不必创建进程/线程或维护这些进程/线程,大大减少了系统。的费用。
什么是防火墙?防火墙的作用是什么?
  • Internet上的防火墙是一种非常有效的网络安全模型,通过它可以隔离风险区域(即Internet或具有一定风险的网络)与安全区域(LAN)之间的连接,而不必阻碍人们接触风险区域。因此,通常将其连接在核心交换机和外部网络之间。
    1. 过滤进入和离开网络的数据
    2. 管理访问网络和访问网络的行为
    3. 通过防火墙记录信息内容和活动
简短描述进程,线程,协程和应用程序场景之间的差异
    1. 线程是操作系统的调度单元
    2. 流程切换所需的资源很大,效率很低
    3. 线程切换所需的资源是平均的,效率是平均的(不考虑GIL
    4. 协程切换任务的资源非常小且效率很高
    5. 根据不同的CPU内核,多进程,多线程可能是并行的,但是协程位于一个线程中,因此是并发的。 )
    1. 协程:当程序中有很多不需要CPU的操作时,协程适用
    2. 计算密集型,使用过程。 IO密集型,使用线程。
如何在python中使用进程池和线程池
 
  • 为每个线程创建一个独立的空间,以便该线程在其自己的空间中对数据进行操作(数据隔离)。
如何在流程之间进行通信?
  • 并发性:指可以交替执行不同任务的应用程序,实际上并发性与多线程原理相似,多线程并不是要同时执行多个任务,如果同时运行两个线程来执行,您几乎不可能注意到这两个任务之间不断切换的速度已经达到”同时执行效果”,这是不正确的,但是计算机的速度太快了,我们无法注意到。
  • 并行:意味着应用程序可以同时执行不同的任务,
  • 并发是指同时执行多个事件,而并行是指在同一时间执行多个事件。
    • 同步:发出函数调用时,直到获得结果后,该调用才会返回。
    • 异步:发出异步过程调用时,调用者将不会立即获得结果。实际处理此呼叫的部分是在发出呼叫后通过状态和通知通知呼叫者,或通过回调函数处理呼叫。
    • 阻塞:阻塞调用意味着当前线程将在调用结果返回之前被挂起。该函数仅在获得结果后返回。
    • 非阻塞:在无法立即获得结果之前,该函数不会阻塞当前线程,而是会立即返回。
  • 阻塞,非阻塞:进程/线程要访问的数据是否准备就绪,以及进程/线程是否需要等待;
  • 同步与异步:在访问数据的方式中,同步需要主动读写数据,并且在读写数据过程中仍然会阻塞;异步仅要求通知I/O操作完成,并且不主动读取和写入数据。系统内核完成数据的读取和写入。
路由器和交换机之间的差异
  • 交换机是用于转发电信号的网络设备。路由器是一种链接Internet中各种局域网和广域网的设备。
    1. 交换机在第二层(数据链路层)工作,而路由器在第三层(网络层)工作。
    2. 路由器提供防火墙服务。
    3. 传统交换机只能设置冲突域的样式,而不能拆分广播域。两个路由器可以拆分广播域。
  • 域名解析是一项将域名指向网站空间IP的服务,使人们可以通过注册域名轻松访问该网站。 IP地址是用于标识网络上站点的数字地址。为了方便存储,使用域名代替IP地址来标识站点地址。域名解析是从域名到IP地址的转换过程。
生产者消费者模型应用场景
    • 生产者仅在仓库未满时进行生产,而生产过程在仓库已满时被阻塞;消费者仅在仓库不空时消费,而消费者过程在仓库空时被阻塞;
  • 应用场景:处理数据非常耗时,线程是专用的,并且生产数据不需要立即反馈。例如,写入日志,将多个线程生成的日志放入队列,然后再写入。
  • cdn代表内容分发网络。目的是允许用户更快地获取请求的数据。
  • cdn用于加速。它允许用户访问附近的数据,以便他们可以更快地获取所需的数据。
守护程序线程,什么是守护程序进程
  • 主进程创建一个守护程序
    1. 当主进程代码完成运行时,守护程序将立即挂断。
    2. 守护程序本身是一个子进程。
    3. 主进程完成后,认为主进程已完成(此时将重新运行守护进程),然后主进程将在非守护子进程完成后等待未守护子进程完成。子进程(否则会生成僵尸进程)在结束之前,
    1. 进程中的所有非守护程序线程运行完毕后,守护程序线程将”挂起”。并非主线程完成运行后,守护进程线程就会挂起。这与守护程序不同!
    2. 守护程序线程守护:当前进程中的所有子线程!
    3. 仅在其他非守护程序线程完成运行之后才结束主线程(此时将回收守护程序线程)。因为主线程的结束意味着进程的结束,所以将恢复进程的全部资源,并且该进程必须确保所有非守护程序线程在结束之前都已完成运行。
简要描述多进程开发中join和deamon之间的区别
  • join:子线程调用join时,主线程被阻塞,并且主线程只能在子线程结束后才能继续执行。
  • deamon:将子进程设置为守护进程时,主进程结束,无论子进程是否完成,它都将在主进程结束时结束。
  • 将降低多线程处理的效率。可以说python是一个单线程程序。
    • 用多个进程替换多个线程
使用yield来实现协程
 
 
对引起线程死锁的方式的简要说明。如何避免呢?
    • 锁定顺序:线程以特定顺序锁定
    • 锁定时间限制:当线程尝试获取锁定时,将添加一定的时间限制。如果超过了时间限制,则放弃对锁的请求,并释放由其持有的锁。
  • asyncio是一种并发方式,是与协程相关的库。也称为异步IO
  • gevent是pythn网络框架,它为各种并发和与网络相关的任务提供了一个简洁的API
  • twisted是一个以python实现的事件驱动的网络引擎框架。
  • LVS是linux虚拟服务器,是虚拟linux集群系统。
  • HAProxy是用C语言编写的免费开源软件,它提供高可用性,负载平衡以及基于TCP和HTTP的应用程序代理
  • 负载平衡建立在现有的网络结构上。它提供了一种廉价,有效且透明的方法来扩展网络设备和服务器的带宽,提高吞吐量,增强网络数据处理能力以及提高网络灵活性和可用性。
  • 负载平衡意味着将其分配给多个操作单元以执行。

?远程过程调用(RPC)是一种协议,程序可以使用该协议从网络上另一台计算机上的程序请求服务

? 1.RPC使用客户端/服务器模型。请求程序是客户端,服务提供者是服务器。

? 2.首先,客户端调用过程将带有过程参数的调用消息发送到服务过程,然后等待回复消息。

? 3.在服务器端,该过程将保持睡眠状态,直到呼叫信息到达为止。呼叫消息到达时,服务器获取过程参数,计算结果,发送回复消息,然后等待下一个呼叫消息。

? 4.最后,客户端调用流程以接收回复消息,获取流程结果,然后调用执行以继续。

什么是正向和反向代理?
    • 转发代理就像跳板机一样,并且代理访问外部资源。
    • 转发代理是客户端和原始服务器之间的服务器。为了从原始服务器获取内容,客户端将请求发送到代理并指定目标服务器(原始服务器),然后代理将其发送到原始服务器。转发请求并将获得的内容返回给客户端。客户端必须进行一些特殊设置才能使用转发代理。
      • 访问以前无法访问的资源,例如google
      • 可以用作缓存来加快对资源的访问
      • 授权客户端访问并在线进行身份验证
      • 代理可以记录用户访问记录(在线行为管理),并从外部隐藏用户信息
    • 反向代理(Reverse Proxy)实际上是作为代理服务器来接受Internet上的连接请求,然后将请求转发到内部网络上的服务器,并将从服务器获得的结果返回给Internet请求连接的客户端,代理服务器此时将作为外界的服务器出现
      • 为了确保Intranet的安全,您可以使用反向代理来提供WAF功能以防止Web攻击
      • 负载平衡,通过反向代理服务器优化网站的负载
列出公共关系和非关系数据库。
mysql通用数据库引擎和差异
  • InnoDB:用于事务处理应用程序,具有许多功能,包括ACID事务支持。 (提供行级锁定)
  • MyISAM:默认的MySQL插件存储引擎,它是Web,数据仓库和其他应用程序环境中最常用的存储引擎之一。请注意,通过更改STORAGE_ENGINE配置变量,可以轻松更改MySQL服务器的默认存储引擎。
  • 内存:将所有数据保存在RAM中
对事务及其特征的简短描述
  • 事务是一系列用户定义的数据库操作。这些操作已经完成或根本没有完成,并且是不可分割的工作单元
  • 事务具有四个特征:原子性,一致性,隔离性和连续性。
    • 原子性:事务是数据库中逻辑的工作单元,事务中包含的所有操作必须完成或不执行。
    • 一致性:事务执行的结果必须是将数据库从一种一致性状态更改为另一种一致性状态。
    • 隔离:事务的执行不会受到其他事务的干扰。即,事务中使用的操作和数据与其他并发事务隔离开来,并且并发执行的每个事务都不会相互干扰。
    • 持久性:持久性也称为永久性,这意味着一旦提交了事务,它就应该永久更改数据库中的数据。以下其他操作或故障不应对其执行结果产生任何影响。
触发器,函数,视图和存储过程的简要说明
  • 触发器:触发器是一个特殊的存储过程,它是MySQL在插入,更新和删除时自动执行的代码块。
  • 函数:MySQL提供了许多内置函数,您还可以自定义函数(实现程序员需要sql逻辑处理)
  • 视图:视图是由查询结果形成的虚拟表,并且是该表通过某种操作获得的投影
  • 存储过程:封装一段代码。当要执行这段代码时,可以通过调用存储过程来实现(第一次编译后,无需再次编译就可以再次调用它,这比逐个执行SQL语句效率更高。) >
  • 普通索引:仅加快查询速度
  • 唯一索引:加快查询+唯一列值(可能为null)
  • 主键索引:加速查询+唯一列值(不能为null)+表中仅一个
  • 组合索引:多列值构成一个索引,专门用于组合搜索,比索引合并更有效
  • 全文索引:分词和文本内容搜索
索引何时遵循最左边的前缀规则?
  • 索引多个字段时,将遵循上述原则
  • ABS(x):返回x的绝对值
  • ROUND(x):返回对参数x进行四舍五入的整数
  • TRIM(str):删除字符串两侧的空白
  • COUNT():返回值的数量
  • AVG():返回平均值
列出创建的索引但无法找到索引
  1. 如果条件中存在or,则即使存在带有索引的条件也不会使用它(这就是为什么or的使用尽可能少的原因)
  2. 对于不是第一部分(第一部分)的多列索引,将不使用该索引
  3. 如果列类型是字符串,则必须在条件中用引号将数据引起来,否则就不使用索引
  4. 如果mysql估计使用全表扫描比使用索引更快,则不使用索引
您知道哪些数据库优化解决方案
  1. 减少数据访问-正确创建和使用索引
  1. 在客户端处理许多复杂的操作
  1. char具有固定长度,而varchar是可变长度字符类型
MySQL执行计划功能和使用方法
  • 功能:用于查询分析,例如整个查询涉及多少防御,使用了哪些索引,运行时间等。
为什么在数据大时使用限制偏移分页,页面速度较慢,如何优化?
  • 使用限制分页(例如限制10000)时,20表示扫描满足条件的10020行,丢弃前10000行,最后返回20行。问题就在这里。当数据量很大时,将花费大量时间进行扫描。
    • 当数据库表太大,LIMIT偏移量中的偏移值,长度太大时,SQL查询语句将非常慢,您需要增加order by,并且需要对order by字段建立索引。
    • 如果使用子查询优化LIMIT,则子查询必须是连续的。从某种意义上说,子查询不应具有where条件,where条件将过滤数据并使数据失去连续性
  1. 索引合并是将多个索引的范围扫描合并到一个索引中。
  2. 合并索引时,索引将被合并,相交或先相交,然后合并以合并为一个索引。
  3. 需要合并的索引只能是一个表。无法索引合并多个表。

覆盖索引也可以称为索引覆盖。

  1. 说明1:只能从索引中获得选定的数据列,而不能从数据表中读取,换句话说,查询列应由所使用的索引覆盖。
  2. 说明2:索引是一种有效查找行的方法。当索引可用于读取所需数据时,无需读取数据表中的行。如果索引包含(或覆盖)满足查询语句中的字段和条件的数据,则称为覆盖索引。
  3. 解释3:这是一种非聚集复合索引的形式,它包括查询中Select,Join和Where子句中使用的所有列(即,索引字段恰巧覆盖了查询语句[select子句]和查询条件[Where子句]中涉及的字段,即索引包含查询正在查找的所有数据。
数据库读写分离的简短描述
      • 根据业务耦合,低相关性的不同表存储在不同的数据库中
      • 基于\ quot;列”在数据库中,一个表具有许多字段,您可以创建一个新的扩展表,并将不经常使用或具有较大字段长度的字段拆分为扩展表。
    • 水平分割分为库子表和子库子表,这是基于表中数据的内部逻辑关系,同一张表分散在多个数据库或不同条件下的多个表中,每个表它只包含一部分数据,这使得单个表的数据量较小,并实现了分布式效果。
  • 锁共有三种类型:乐观锁,悲观锁和共享锁
  • 与操作系统一样,数据库是多个用户使用的共享资源。当多个用户同时访问数据时,数据库中的多个事务将同时访问同一数据。如果您不控制并发操作,则可以阅读和存储错误的数据,破坏了数据库的一致性。锁定是实现数据库并发控制的一项非常重要的技术。在实际应用中,经常会遇到与锁相关的异常。当两个事务需要一组冲突的锁并且该事务无法继续时,将发生死锁,从而严重影响应用程序的正常执行。
MySQL的半同步的复制原理
  • 半同步复制,介于异步复制和完全同步复制之间,主库不会在执行客户端提交的事务后立即返回到客户端,而是等待至少一个从属接收并写入中继日志只退还给客户。与异步复制相比,半同步复制会牺牲某些性能并提高数据安全性。
  • 异步复制,MySQL的默认复制是异步的。主库将在执行客户端提交的事务后立即将结果返回给客户端。它不在乎从库是否已接收并处理了它。
  • 是最简单的,而性能是最好的,但是主服务器和从服务器之间的数据不一致的可能性很高。

  • 完全同步复制,这意味着当主库执行事务时,所有从属库都会在将事务返回给客户端之前执行该事务。由于您需要等待所有从属服务器在返回之前执行事务,因此完全同步复制的性能将不可避免地受到严重影响。
MySQL添加,删除和更改检查
      • 语法:INSERT INTO表名(字段名1,字段名2,…)VALUES(值1,值2,…);
      • 示例:将值插入学生值(2,” lisi”,62);
      • 语法:INSERT INTO表名[(字段名1,字段名2,…)] VALUES(值1,值2,…),(值1,值2,…),。..(值1,值2,…)
      • 语法:从表名[条件条件表达式]删除
      • 命令:在ID = 7的学生中删除;
      • 命令:更新学生SET等级= 80;
      • 语法:SELECT字段名1,字段名2,…FROM表名(此语法也可以查询某些字段)
      • 语法:SELECT分段名1,分段名2,…来自表名WHERE条件表达式
    • 命令:SELECT ID,来自2和5之间ID的学生的名字;
    • 语法:从表名中选择DISTINCT分支名称;
    • 命令:选择来自Student2的不同性别;
    • 带LIKE关键字的查询
    • 注意:%表示匹配任意长度的字符串,_表示匹配长度字符串
    • 带AND关键字的多条件查询
    • 带OR关键字的多条件查询
    • AND和OR一起使用时,AND的优先级高于OR
    • COUNT()函数:统计记录的条数
    • SUM()函数:求出表中某些分段所有值的总和
    • AVG()函数:求出表中某些细分所有值的预设
    • MAX()函数:求出表中某些相邻所有值的替代
    • MIN()函数:求出表中某些相邻所有值的预设
    • 语法:SELECT扩展名1,分段名2,…来自表名GROUP BY分支名1,分支名2,…[HAVING条件表达式];
    • GROUP BY和聚合函数一起使用
    • 通过和HAVING关键字一起使用
    • 使用限制限制查询结果的数量
    • 语法:SELECT域名(AS)别名[,别名(AS)别名,…] FROM表名;
 
MySQL如何创建索引
      • ALTER TABLE表名添加索引索引名(列列表)
      • 在表名(列列表)上创建索引索引名
      • 在表名(列列表)上创建唯一索引index_name
对SQL注入的原理以及如何在代码级别容纳SQL注入的简短介绍

用外行的话来说,SQL注入的根本原因是:\”用户输入数据\”意外地变成了正在执行的代码。\”用户输入数据\”我可以参考Web前端$ _POST,$ _GET获得的数据或从数据库获得的数据。当然,它不排除程序猿意外使用的特殊字符串。在SQL语句的拼接中,某些包含特殊字符的变量字符在拼接时会破坏SQL语句的结构,从而导致”用户输入数据的引用”意外地变为代码执行。

  1. 语法语法(分析协议级别完全避免了SQL注入)
  2. 字符串转义(不要在sql中拼接字符)#将查询作为sql模板,args是要在execute中传递的参数(query,args = None)
 
简短描述左联接和右联接之间的差异
  • 左连接和右连接非常相似,仅左表和右表的位置不同。
  • 左联接(左联接)返回以包含左表中的所有记录和右表中具有相同连接字段的记录
  • 右连接(右连接)返回以包含右表中的所有记录和左表中具有相同连接字段的记录
索引的作用是什么,有哪些类别,优点和缺点是什么?
  • 功能:为了提高查询速度并改善系统性能
    • 唯一索引:不允许其中任意两行具有相同索引值的索引。
    • 非唯一索引:允许任意两行具有相同的索引值。
    • 主键索引:有一个列或列的组合,其值唯一地标识表中的每一行。
    • 聚集索引:表中行的物理顺序与键的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。
    • 使用索引的唯一性来控制记录的唯一性
    • 您可以加快表之间的连接
    • 减少查询分组和排序的时间
    • 存储索引占用了磁盘空间
    • 执行数据修改操作(INSERT,UPDATE,DELETE)以生成索引维护
  • MySQL的慢速查询日志是MySQL提供的日志记录。用于记录响应时间超过阈值的MySQL语句。特别是,运行时间超过long_query_time值的SQL将记录在慢速查询日志中。in。

我要回帖

更多关于 sql是什么文件格式 的文章

 

随机推荐