mysql优化三要素_mysql基础知识点(复习一)

目录

其他

SQL基础-DDL、DML

SQL优化

Mysql对象-表、视图、函数、数据类型、索引等

Mysql存储引擎innodb与MyISAM特性及对比

mysql事务

mysql锁

Mysql存储引擎innodb与MyISAM特性及对比

正则

补充

一、其他

创建数据库:create database mytest

删除数据库:drop database mytest;

FOUND_ROWS()函数:

a)返回的是上一条 SELECT 语句(或 SHOW语句等)查询结果集的记录数。

ROW_COUNT()函数:

a)返回的是上一条SQL语句,对表数据进行修改操作后影响的记录数。

b)如果上一条SQL语句不是修改操作语句(INSERT/UPDATE/DELETE 等),而是查询语句(SELECT/SHOW 等)则返回-1。

c)如果是修改操作语句,则返回修改(增/删/该)影响的记录数。

d)如果上一条SQL语句是UPDATE语句,但是UPDATE后所有数据的值并没有改变,则返回 0。

e)如果上一条SQL语句是建表语句(创建表或临时表),但创建的是空表,则返回 0。如果是删除表(DROP语句),则返回的还是 0。

创建表时使用FULLTEXT(),可以启用全文本搜索;用于指定被搜索的列的是MATCH();against:指定要搜索的方式。全文本搜索,mysiam支持,innodb不支持。

删除用户账号命令是:DROP USER,创建:create user

数据库系统中的数据模型是( )。

a)A.层次模型

b)B.网状模型【注意不是网络模型】

c)C.关系模型

关系模型的组成:数据结构、操作集合、完整性约束

SQL语言是(非过程化)的语言,轻易学习。

返回字符串字节长度的函数是:length(),char_length()返回字符个数。【java中,数组使用length属性,字符串使用length()函数返回字符串长度】

在MySQL中,不允许有空表存在,即一张数据表中不允许没有字段。

在MySQL中,对于存放在服务器上的数据库,用户可以通过任何客户端进行访问。

数据库名称合法:db1_student、db1&student

Mysql的数据类型:BIGINT、TINYINT、INTEGER、INT

在MySQL中,用户在单机上操作的数据就存放在单机中。

查看由mysql自己解释的命令(BCD)

a)A.?

b)B.?

c)C.help

d)D.\h

运算符的优先级:算术>比较>逻辑

如果指定多列排序,可以在任意列使用升序或降序关键字。

创建数据表时,char的长度不可以省略的。

关系数据模型哪些优点?(ACB)

a)A)结构简单

b)B.)有标准语言

c)C适用于集合操作

对某个数据库使用记录单,可以进行的记录操作有( ABC)。

a)A.新建B.删除C.还原 D.插入

投影有两个功效,一个是消除原关系中的某些列,还有一个是额外性质即消除投影后重复的元组,因此元组也有变少的可能【做投影操作后,新关系的元组个数(<=)原来关系的元组个数】

a)优化查询语句:先做选择运算,再进行投影运算

数据库系统由外模式、模式【概念模式或逻辑模式】和内模式构成。

外模式是局部数据的逻辑结构和特征的描述--数据视图;【应用程序】又称用户视图,一个数据库可以有多个外模式。外模式也称子模式(Subschema)或用户模式,它是数据库用户(包括应用程序员和最终用户)能看见和使用的局部数据的逻辑结构和特征描述,是数据库用户的数据视图,是与某一应用有关的数据逻辑表示。

模式是全体数据的逻辑结构和特征的描述--所有用户的公共视图;【逻辑结构】是数据库中全体数据的逻辑结构和特征的描述,一个数据库只有一个模式。

内模式是数据物理结构和存储方式的描述;【物理结构】也称物理模式或存储模式,一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据库内部的表示方法。

数据库三级模式:数据库系统在三级模式之间提供了两级映像【物理独立性和逻辑独立性】

a)外模式/模式的映像保证逻辑独立性。

b)模式/内模式的映像则保证物理独立性。

单引号可能会导致sql注入。

在 GROUP BY 子句中提供 ALL 关键字。

只有在 SELECT 语句还包括 WHERE 子句时,ALL 关键字才有意义。

如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生的所有组,即使某些组没有符合搜索条件的行。没有 ALL 关键字,包含 GROUP BY 子句的 SELECT 语句将不显示没有符合条件的行的组。

数据库管理技术:(ABDF)

A. RDBMS:(Relational Database Management System)关系数据库管理系统;

B. NoSQL:非关系型的数据库

C. Nginx:是一个高性能的HTTP和反向***web服务器,同时也提供了IMAP/POP3/SMTP服务

D. NewSQL:新型关系型数据库

E. ActiveMQ:Apache下的一个中间件

F. Hbase:是一个分布式的面向列的数据库

关系型数据库:Oracle、MySql、SQLServer、DB2;非关系型数据库:MongoDB、BerkeyDB、Redis、IMS。

数据独立性最高的是: 关系数据模型【关系数据库系统提供三级模式与二级映像,可以实现数据库的逻辑独立性与物理独立性,因而具有最高的数据独立性。】

关系完备的系统是指:支持关系数据结构和所有关系代数操作。

sql语句本质上就好比一个java文件,都是要经历先解析编译后,处理优化,最后执行返回结果 的过程

数据库设计:

a)需求分析阶段的任务是在调查、分析的基础上明确用户对系统的需求。

b)概念设计阶段的任务是设计概念模型,较著名的是E-R图。

c)逻辑设计阶段的任务是把概念模型转化为特定DBMS的逻辑结构(模式和外模式)【E-R图转化为二维表】,进行关系规范化

d)物理设计阶段的任务是设计合适的物理(存储)数据库结构。【选择合适的存储结构和存储路径】

插入失败、插入异常:该插入的没插入;

a)删除失败:该删的没删;

b)删除异常:不该删的删了,新添加的属性列,一般不允许设置为NOT NULL

E-R图:矩形:实体型;椭圆:实体的属性;菱形:实体型之间的联系

数据库完整性(Database Integrity)是指数据库中数据在逻辑上的一致性、正确性、有效性和相容性。

a)在select查询中,select 子句是投影操作,where子句是选择操作,join子句是连接操作。【select a from table1即为查询table1关系上a属性上的投影.】

DBS(数据库系统)包含DB(数据库)和 DBNS(数据库管理系统)

删除列可以省略column,添加列必须说明数据类型

sql中使用了like,即使创建索引,也不会根据索引查询

数据库事务:会降低系统的并发能力

关系模式中:

a)A->B:当 B属性函数依赖于A属性时,也可以说成A函数确定B。对于A中的每一个属性在B中只有唯一的一个值与之对应,而B中的一个值可与A中的多个值对应,所以A、B之间的联系是从A到B的多对一联系。即一个确定的B可以有多个A,但是一个确定的A只能有一个B。即多对1的关系。

b)AB:1对1的关系。

关系代数运算中的基本运算包括并(∪)、差(-)、广义笛卡尔积(×)、投影(π)和选择(σ),其他运算的功能都可以由这五种基本运算来实现

Union:ACD

A、union只连接结果集完全一样的查询语句

B、union可以连接结果集中数据类型个数相同的多个结果集

C、 union是筛选关键词,对结果集再进行操作

D、任何查询语句都可以用 union来连接

注:使用union组合查询的时候,只能用一个order by,并且只能出现在最后一个select语句后面。

char和varchar的区别:

char的长度是不可变的,而varchar的长度是可变的【定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的】

char的存取速度还是要比varchar要快得多。【因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。】

char的存储,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节。

建立Statement对象的作用是? 执行SQL语句

a)Prepared Statement 对象用于执行预编译SQL语句。

b)Callable Statement对象用于执行对存储过程的调用。

数据模型指的是数据库的组织形式,数据模型的三要素:数据结构、数据操作、数据完整性约束

在数据库系统中,最小的存取单位是记录。

数据库使用读写分离最主要的目的是():减少X锁与S锁的竞争。

数据库系统的独立性是指:不会因为系统数据存储结构与数据逻辑结构的变化而影响应用程序

日志文件是用于记录:对数据的所有更新操作。

字段就是属性,行是元组,关系模式即是二维表,表格表示实体类型和实体之间的联系。

Explain:查看SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。

a)Extra出现 using filesort:Mysql需要在执行一次额外的排序使查询结果有序。

b)Extra出现using index :表示查询所需的信息直接通过索引获取,未读取实际的数据行。【一种是Mysql的聚簇索引(Cluster Index),因为聚簇索引将索引信息和数据信息组织在了一起。另一种是覆盖查询,即查询所需的列已在索引中包含。】

MySQL执行命令delete语句时,如果包括where条件,并不会真正的把数据从表中删除,而是将数据转换成了碎片。

由于命令optimize会进行锁表操作,所以进行优化时要避开表数据操作时间,避免影响正常业务的进行。

UTF-8编码下一个汉字(包括中文形式下的符号)一般是3个字节,一个英文(包括英文下的符号)1个字节,一个数字1个字节;在GBK和GB2312编码下一个汉字(包括中文形式下的符号)是2个字节,一个英文(包括英文下的符号)1个字节,一个数字1个字节;

UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复。

avg(score)会忽略空值。

各分 E-R 图之间的冲突主要 有三类,即属性冲突、命名冲突和结构冲突。

属性域冲突:即属性值的类型、取值范围或取值集合不同。

命名冲突:

i.同名异义,即不同意义的对象在不同的局部应用中具有相同的名字。

ii.异名同义(一义多名),即同一意义的对象在不同的局部应用中具有不同的名字。

结构冲突

i.同一对象在不同应用中具有不同的抽象。

ii.同一实体在不同子系统的E-R图中所包含的属性个数和属性排列次序不完全相同。

iii.实体间的联系在不同的E-R图中为不同的类型。

Mysql每个会话独有的:join buffer、sort buffer、mrr(multi range readerbuffer)

还原一个数据库:mysql

a)备份一个数据库:mysqldump(mysqlbackup)

b)

60、二进制日志bin-log是不能直接cat或more文件查阅日志内容。

使用SELECT语句随机地从表中挑出指定数量的行,可以使用的方法是

a)A 在ORDER BY子句中使用RAND()函数,并用LIMIT子句定义行数

innodb存储引擎可以支持全文索引:这句话是错的

a).MySQL中的全文索引是FultLeXT类型的索引。

b)2).全文索引只能用于InnoDB或MyISAM表,只能为CHAR、VARCHAR、TEXT列创建。

mysql中的约束有()BCD

A 检查约束 B 默认约束 C 非空约束 D 唯一约束

MySQL默认隔离级别是:repeatable

查看mysql当前活跃的并发连接数:Thread_running变量

表连接算法可能会使用到join buffer:

a)Block Nested-Loop Join

b)Batched Key Access

MySQL的哪些操作可能产生磁盘上的临时表

a)Group by

b)Distinct

c)Union

d)Union all(不需要排序,故不产生)

即使在两个表没有主外健关系的情况下,我们依然可以使用JOIN语句。

INFORMATION_SCHEMA中包含的信息,一部分和SHOW语句的信息相同

使用连接JOIN代替子查询Sub-Queries:连接不需要在内存中创建临时表

使用联合UNION代替手动创建的临时表:联合可在查询会话结束后自动删.

数据不一致的原因:数据冗余、并发控制不当、故障和错误。

设计数据库概念结构时常用的数据抽象方法:分类、聚集、概括。

数据完整性(实体完整性:主键;参照完整性:外键;域完整性;用户自定义完整性):数据库中数据在逻辑上的一致性、正确性、有效性和相容性

①实体完整性约束,指使用主键约束且主键不能为空值

②参照完整性约束,指不允许关系引用不存在的元组,外键要么是实际存在的元组,要么就为空

③用户定义的完整性约束,指在具体应用所涉及的数据必须满足的语义要求

检查约束:检查输入数值的合法性

文件后缀

a)数据库文件的扩展名为.DBC

b)数据表文件的扩展名为.DBF

c)表单文件的扩展名为.SCX

d)项目文件的扩展名为.PJX

数据库保护(数据库控制):安全性控制、完整性控制、并发性控制、数据恢复

命令顺序:select, from, where, group by, having, order by, limit

a)执行顺序:from, where, group by, having, select, order by, limit

本质区别:where子句是把磁盘上的数据筛选到内存上,而having子句是把内存中的数据再次进行筛选.

In 和 or的功能一样,但是in效率高

Update时遇到错误就会停止,可以使用ignore,继续更新。

二、SQL基础-DDL、DML

1. 数据库定义语句(DDL:Data Definition Language):用来创建数据库中的表、索引、视图、存储过程、触发器等,常用的语句关键字有:CREATE,ALTER,DROP,TRUNCATE,COMMENT,RENAME。

* 创建表:CREATE TABLE 表名

* 查询表:SHOW 表名

* 修改表名:ALTER TABLERENAME[TO];

* 修改表字段:ALTER TABLE 表名 CHANGE 原字段名 新字段名 数据类型[属性]

* 添加字段:ALTER TABLE表名ADD字段名 数据类型 约束

* 删除表:DROP TABLE [IF EXISTS] 表名

* 删除表字段:ALTER TABLE 表名 DROP 字段名

* 增加一列:ALTER TABLE S ADD(CN CHAR(8))

2. 数据操纵语句(DML:Data Manipulation Language),用来查询、添加、更新、删除等,常用的语句关键字有:SELECT,INSERT,UPDATE,DELETE,MERGE,CALL,EXPLAIN PLAN,LOCK TABLE,包括通用性的增删改查。

* 插入语句:INSERT INTO 表名[字段名] VALUES (值列表)

* 更新语句:UPDATE 表名 SET 列名=更新值[WHERE 更新条件]

* 删除行数据语句:DELETE [FROM] 表名[WHERE ]

3. 数据控制语句(DCL:Data Control Language)即,用于授权/撤销数据库及其字段的权限,常用的语句关键字有:GRANT,REVOKE。

4. 事务控制语句(TCL:Transaction Control Language),用于控制事务,常用的语句关键字有:COMMIT,ROLLBACK,SAVEPOINT,SET TRANSACTION。

* savepoint保存点来实现事务的部分回滚

5. limit、offset:

* 当limit后面跟两个参数的时候,第一个数表示要跳过的数量,后一位表示要取的数量;

* 当 limit后面跟一个参数的时候,该参数表示要取的数据的数量;

* 当 limit和offset组合使用的时候,limit后面只能有一个参数,表示要取的的数量,offset表示要跳过的数量

三、SQL优化

1. 优化

a)选取最适用的字段属性:字段尽量设置为not null;设置数值型数据,比文本型快

b)使用连接JOIN代替子查询Sub-Queries:连接不需要在内存中创建临时表

c)使用联合UNION代替手动创建的临时表:联合可在查询会话结束后自动删除临时表

d)事务:保证数据库中数据的一致性和完整性。BEGIN开启;COMMIT结束

e)锁定表:维护数据的完整性

f)外键:保证数据的关联性

g)索引:建立在将用于JOIN、WHERE和ORDER BY的字段上,不要对数据库中某个含有大量重复值的字段建立索引

h)优化查询语句:先做选择运算,再进行投影运算

四、Mysql对象-表、视图、函数、数据类型、索引等

对数据表的操作:

a)查看表结构:describe employees(desc employees);desc是缩写,和降序“desc”是一样。

b)查询出表的列信息:show columns from employees。【和上面的结果一样】

c)查询建表语句:show create table employees;

d)查找数据库中所有的数据表:SHOW TABLES,有s。

视图:【视图一般用于查询select,作为一个select语句存在数据字典中】

创建视图

i.create [algorithm = undefined | merge | temptable] view 视图名称 [(字段列表)] as sql语句

ii.语法解析:

视图名必须唯一,同时不能与表重名.

指定视图执行的算法,通过algorithm指定.

merge: 合并算法,将视图的语句和外层的语句合并后再执行.

temptable: 临时表算法,将视图执行的结果生成一张临时表,再执行外层语句.

undefined: 未定义型,用哪种算法有MySQL决定,默认算法merge.

"字段列表"如果存在,数目必须等于select语句检索的列数。

修改视图结构

alter view 视图名称 [(字段列表)] as sql语句

视图名必须唯一,并且不能与表重名。

一个视图可以对应一个基本表,也可以对应多个基本表。

视图与表的区别

视图

不是编译好的sql语句

已经编译好的sql语句

有实际的物理记录

没有实际的物理记录

在视图上不能完成的操作是:在视图上定义新的表。

解析:视图是从基本表导出的表,是虚表,数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍然存放在原来的基本表中。

删除一个视图的命令:DROP

视图VIEW是数据库的外模式。

使用视图不可以加快查询语句的执行速度【索引】

视图建立后,在数据字典中存放的是:视图的定义

视图是一种常用的数据对象,它是提供( 查看)和(存放 )数据的另一种途径,可以简化数据库操作

视图是一种查看存储在别处的数据的一种设施,本身不包含数据。【隐含复杂的SQL】

视图不能索引,也不能有关联的触发器或默认值。

更新视图:【更新一个视图将更新其基表】

i.先DROP,再CREATE

ii.或者直接使用CREATE OR REPLACE VIEW

iii.更新限制:如果视图定义中含有以下操作则不能进行更新

分组(group by、having)

联结

自查询

聚集函数(min(),count(),sum())

DISTINCT

导出(计算)列

游标:【是一个存储在mysql服务器上的数据库查询;它不是一条sql语句,而是被该条语句检索出来的结果集;只能用于存储过程和函数】

声明游标:DECLARE cursor_name CURSOR FOR select_statement。

给游标赋值:FETCH cur1 INTO flag1;

游标的使用:

i.使用前必须声明(定义)它;

ii.A.声明后必须打开游标以供使用

iii.B.结束游标使用时,必须闭游标

iv.C.使用游标前必须声明它

v.D.游标只能用于存储过程和函数

创建游标:

i.Declare ordernumbers CURSOR【和定义变量一样】

ii.打开游标:open ordernumbers,关闭游标:close ordernumbers;

使用过的游标不需要再次声明,用open打开就行了。

游标的声明、打开、关闭都是在存储过程中完成。

使用游标:

游标打开后使用fetch语句分别访问它的每一行【fetch order into o】

查询表:Select

SELECT语句的完整语法较复杂,但至少包括的部分是:select,from。

查询的关键字:

i.GROUP BY子句用来分组WHERE子句的输出

ii.WHERE子句用来筛选FROM子句中指定的操作所产生的行。

iii.聚合函数需要和group by一起使用

iv.HAVING子句用来从group by的结果中筛选行

查询 正在执行的事务:

i.SELECT * FROM information_schema.INNODB_TRX

查看正在锁的事务

i.SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS

可以观察SHOW INNODB STATUS的输出结果来确认未提交事务。

删除表:

当你不再需要该表时:drop table tb,无法找回

当你仍要保留该表,但要删除所有记录时:truncate (table) tb,删除表中所有数据,但不能与where一起使用。

i.回滚:truncate删除后不记录mysql日志,因此不可以rollback,更不可以恢复数据;

ii.truncate 不会触发任何 DELETE触发器;

iii.truncate 返回的是0或者-1(成功则返回0,失败返回-1);

当你要删除部分记录或者有可能会后悔的话:delete from tb (where)

i.删除表中所有数据:delete from user;

ii.删除指定行:delete from user where username ='Tom';

iii.delete 是可以 rollback ;(原因:truncate 相当于保留原mysql表的结构,重新创建了这个表,所有的状态都相当于新的,而delete的效果相当于一行行删除,所以可以rollback;);

iv.delete 操作后返回删除的记录数。

truncate 比 delete快,而且 truncate 删除后将重建索引(新插入数据后id从0开始记起),而 delete不会删除索引 (新插入的数据将在删除数据的索引后继续增加)

索引:【索引对于 增删改操作的性能影响比较大。但是加快查询速度】

索引的分类【单列索引:全文索引、主键索引、唯一索引、普通索引】

i.(1)普通索引: 仅加速查询

ii.(2)唯一索引: 加速查询 + 列值唯一(可以有null)

iii.(3)主键索引: 加速查询 + 列值唯一(不可以有null)+ 表中只有一个,它 是一种特殊的唯一索引,不允许有空值。

iv.(4)组合索引: 多列值组成一个索引,专门用于组合搜索,其效率大于索引合并,为了更多的提高mysql效率,遵循”最左前缀“原则。

v.(5)全文索引: 对文本的内容进行分词,进行搜索 (注意:目前仅有MyISAM引擎支持)

一个表可以有多个单列索引。

主键是一种约束,唯一索引是一种索引。唯一索引不一定是主键。

UNIQUE惟一索引的作用是:A.保证各行在该索引上的值都不得重复。

建表时创建唯一索引:1)设置主键约束;2)Create index。

创建索引的语句是create index indexname on tablename (username (length))

i.其中若是char和varchar类型,length可以小于字段实际长度

ii.若是blob或text类型,必须指定length!

建索引的作用:

i.大大加快数据的检索速度,这也是创建索引的最主要的原因;

ii.加速表和表之间的连接;

iii.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间;

iv.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;

索引的缺点:

i.创建索引和维护索引要耗费时间,时间随着数据量的增加而增加

ii.索引需要占用物理空间和数据空间

iii.表中的数据操作插入、删除、修改, 维护数据速度下降。故不是越多越好。

覆盖索引:如果我们要查询的东西,能够直接从索引上得到,而不用再去表中取数据,那么这个使用的索引就是覆盖索引。

i.type中的index,仅仅是说,查询类型index,表示本次查询仅仅扫描索引树,没有其他读取操作。

ii.Extra中的using index,意思是说,查询使用到了“覆盖索引”。

iii.使用like %%的时候,也会遇到即使是%在开头,也会有using index的场景。那也是用到了覆盖索引的思想。

当用Explain查看SQL的执行计划时,里面有列显示了key_len 的值,根据这个值可以判断索引的长度,在组合索引里面可以更清楚的了解到了哪部分字段使用到了索引。

k)普通索引:查找到满足条件的第一个记录(5,500)后,需要查找下一个记录,直到碰到第一个不满足k=5条件的记录。

唯一索引:由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。

索引是不可更改的,想更改必须删除重新建。

查看某张表的索引统计信息:show index from

Innodb引擎不会走索引扫描:

i.在where子句中使用!=或<>操作符

ii.在where子句中对字段进行null值判断

iii.不符合索引的最左前缀原则

在Innodb引擎中,关于唯一索引和普通索引,下列说法正确的是哪三项?

i.只有普通索引能够使用change buffer

ii.普通索引适合频繁写入,不实时读取的情况

iii.对于写完即读的情况,二者没有区别

避免在WHERE条件中,在索引列上进行计算或使用函数,因为这将导致索引不被使用。

如果order by排序利用了索引,那么select中的字段必须出现在所用索引中。

创建索引

创建唯一索引:

create [unique唯一索引][clustered聚集索引] index on ([],[]…);例如:create unique index number on student(seat_number desc);

创建普通索引

例如:create index name_class on student(name asc,class desc);

创建主键索引:

例如:create table student(id int(10) unsigned not null auto_increment comment 'id主键索引', name char(20) not null default '' comment '名字', class varchar(50) not null default '' comment '班级', seat_number smallint(5) not null default 0 comment '座位编号', primary key (id))engine=InnoDB default charset=utf8 comment='学生表';

删除索引

i.drop index on 表名;

例如:drop index number on student;

主键

主键的建立有( 3 )种方法

i.uid INT PRIMARY KEY;

ii.uid INT,PRIMARY KEY(uid);

iii.uid INT。ALTER TABLE user ADD PRIMARY KEY(uid);

联合主键的创建方式:PRIMARY KEY(uid,uname)

删除主键约束:ALTER TABLE USER DROP PRIMARY KEY;

主键的作用:

i.A.主键的值对用户而言是没有什么意义

ii.B.主键的主要作用是将记录和存放在其他表中的数据进行关联。

iii.C.一个主键是唯一识别一个表的每一记录

iv.D.主键是不同表中各记录之间的简单指针

超键(候选键+其他属性)>候选键(主键+其他候选键)>主键

关键码key:数据元素中能起标识作用的数据项

超键Super key:在关系中能唯一标识元素属性的集

候选键Candidate Key:不含有多余属性的超键,候选码中的属性为主属性

主键Primary Key:用户选作元组标识的候选键

外键Foreign Key:某个属性在其他关系中是主键

触发器

触发器不是响应以下哪一语句而自动执行的Mysql语句:select。

触发器的名字必须是表中唯一,而非数据库中唯一;

只有表支出触发器,视图不支持,临时表也不支持。

每个表每个事件每次只能只允许一个触发器。因此每张表最多支持6个触发器【insert、update、delete的之前和之后】

单一触发器不能与多个事件或多个表关联

触发器不能更新或覆盖【为了修改一个触发器只能删除它,再重建】

触发器中不支持CALL,表示不能从触发器内调用存储过程。

存储过程:【实际上是一种函数】

存储过程是一组预先定义并(编译)的Transact-SQL语句。

存储过程的执行叫:调用【CALL productpring()】

创建存储过程【create producer ()/ begin/ 一系列的sql操作/ end】

存储过程创建之后被保存在服务器上以供使用,直至被删除。

删除:drop producer Pro,如果不存在就会报错;使用drop producer Pro if exists 不会报错

不能通过一个参数返回多个行和列。

Mysql变量都必须以@开始【定义局部变量declare total decimal(8,2)】,形参不用加@。

若要显示执行存储过程后的数据,使用select @money

查看所有的存储过程:show producer status。

查看存储过程的创建等信息:show create producer pro。

更新update:

B.不能在一个子查询中更新一个表,同时从同一个表中选择

C.不能把ORDER BY或LIMIT与多表语法的UPDATE语句同时使用

D.如果把一列设置为其当前含有的值,则该列不会更新

Mysql中被定义为NOT NULL的列可以被更新为NULL

alter:

A.alter table user drop column sex;

B.alter table user add sex varchar(20);

C.alter table user drop sex;

D.alter table user modify id int primary key;

插入insert:

a)B.insert into 表名 values(字段名1对应的值,字段名2对应值);

b)D. insert into 表名(字段名1,字段名2)  values(字段名1对应的值,字段名2对应值);

范式:

a)范式是个递推的约束关系:

i.1NF:属性的原子性 【列不可再分】

ii.2NF:第二范式(2NF)要求实体的属性完全依赖于主关键字【非主键属性全部依赖于主键属性】

iii.3NF:即当2NF消除了非主属性对码的传递函数依赖,则称为3NF 【非主键属性之间无依赖关系】

a)BCNF:对3NF关系进行投影,将消除原关系中主属性对码的部分与传递依赖,得到一组BCNF关系。【主键属性之间无依赖关系】

Having:

a)where在分组前过滤,having在分组后过滤,两者之间不冲突。

b)group by 限定分组条件,即用按照那一列进行分组,相同列值被分为一组。

c)没有聚合函数的使用也可以用having过滤。

d)having子句即可包含聚合函数作用的字段也可包括普通的标量字段

e)having子句必须于group by 子句同时使用,不能单独使用

字段修改:alter table 表名 alter column 字段名 set default 默认值;

a)change 用来修改字段名字以及类型

b)modify 用来修改字段类型和长度

c)alter column ... set用来修改字段数据(修改表的数据结构)

d)update:修改数据内容的。

表的复制:【select * into book2 from book】

a)select into from 和 insert into select都是用来复制表

b) select into from 要求目标表不存在,因为在插入时会自动创建。

c)insert into select from 要求目标表存在

键:

a)外键:关系与关系间的相关联系就是表和表之间的连接【外键不能夸引擎】

b)超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键【(姓名)、(姓名,性别,年龄) 都是唯一 所以都是一个超键】

c)候选键(candidate key):不含有多余属性的超键称为候选键【但是只有(姓名)是候选键,因为不能有多余的属性】,候选关键字中的属性称为

d)主键(primary key):用户选作元组标识的一个候选键程序主键【主键从候选键中挑中的一个】

表连接:

内连接:在每个表中找出符合条件的共有记录【用的比较多】

i.第一种写法:(只使用where)select t.teacher_name, s.student_name from teacher t,student s where t.id = s.teacher_id;

ii.第二种写法:(join .. on.. )select t.teacher_name, s.student_name from teacher t join student s on t.id = s.teacher_id;

iii.第三种写法:(inner join .. on.. )select t.teacher_name, s.student_name from teacher t inner join student s on t.id = s.teacher_id;

外连接:外连接有三种方式:左连接,右连接和全连接(mysql不支持全外连接,使用union来联合左右连接)。

左连接:根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配,如果找不到与左表匹配的,用null表示。[x left [outer] join y on...

i.第一种写法:(left join .. on ..)select t.teacher_name, s.student_name from teacher t left join student s on t.id = s.teacher_id;

ii.第二种写法:(left outer join .. on ..)select t.teacher_name, s.student_name from teacher t left outer join student s on t.id = s.teacher_id;

iii.第三种写法:"(+)" 所在位置的另一侧为连接的方向select t.teacher_name, s.student_name from teacher t, student s where t.id = s.teacher_id(+);

iv.左连接时,如果 left join on的条件在右表中有所重复,那么最终记录数目会大于原表数量

右连接和左连接相反

全连接:返回符合条件的所有表的记录,没有与之匹配的,用null表示(结果是左连接和右连接的并集)

i.第一种写法:(full join .. on ..)select t.teacher_name, s.student_name from teacher t full join student s on t.id = s.teacher_id;

ii.第二种写法:(full outer join .. on)select t.teacher_name, s.student_name from teacher t full outer join student s on t.id = s.teacher_id;

自连接:自连接,连接的两个表都是同一个表,同样可以由内连接,外连接各种组合方式,按实际应用去组合。

i.SELECT a., b. FROM table_1 a,table_1 b WHERE a.[name] = b.[name]

交叉连接是两个表数据笛卡尔积(相当于不加连接条件)【交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。】

i.SELECT S., T. FROM STUDENT S CROSS JOIN TEACHER T ;

ii.等价于:SELECT S., T. FROM STUDENT S , TEACHER T ;

自然连接:是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。【不能加限定条件】

i.SELECT * FROM STUDENT NATURAL JOIN TEACHER;

函数

CHAR_LENGTH()

长度计算

字符串函数

INSTR()

首次出现位置

STRCMP()

比较

CONCAT()

拼接(可多个参数,拼接NULL即为null)

REVERSE()

翻转

LEFT()

显示左侧相应个数字符

RIGHT()

显示右侧相应个数字符

LOWER()

转小写

UPPER()

转大写

LPAD()

左补字符

RPAD()

右补字符

SUBSTRING()

截取

SUBSTRING_INDEX()

从某个位置截断

TRIM()

字符剔除

日期时间

NOW()

当前日期时间

CURDATE()

当前日期

CURTIME()

当前时间

数字运算

SIGN(-42)

正负

FLOOR(-1.23)

最近最小数

CEILING(1.23)

最近最大数

COUNT([DISTINCT] column_name)

计数

MIN(column_name)

最小

MAX(column_name)

最大

SUM([DISTINCT] column_name)

求和

AVG([DISTINCT] column_name)

平均

GROUP_CONCAT([DISTINCT] column_name)

结果集拼接

Dayofweek、weekday返回日期对应的星期:

i.DAYOFWEEK(date)返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六);

ii.WEEKDAY(date)返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。

LAST_DAY()函数是取某个月最后一天的日期。

i.SELECT LAST_DAY('2019-04-01') # 2019-04-30

关于SUM()和SVG()函数的限制是:ABD

i.不支持字符类型

ii.不支持临时数据

iii.不能在同一条SQL语句中出现

iv.不能用其他的聚合函数作为参数

innodb引擎中,count(),count(1),count(主键),count(列名):

count()和count(1)速度相似且最快,count(列名)最慢?

AVG() 、COUNT(列名)、sum()、max()、min() 忽略null的行。COUNT()不忽略null的行

Distinct 指定列名则不能用于count(),但是可以用于count(列)

数据类型:

整型:

字符型:

日期时间

五、Mysql存储引擎innodb与MyISAM特性及对比

执行计划:

Explain:查看SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。

Extra出现 using filesort:Mysql需要在执行一次额外的排序使查询结果有序。

Extra出现using index :表示查询所需的信息直接通过索引获取,未读取实际的数据行。【一种是Mysql的聚簇索引(Cluster Index),因为聚簇索引将索引信息和数据信息组织在了一起。另一种是覆盖查询,即查询所需的列已在索引中包含。】

存储引擎的对比

表的行数查询,innodb要全表扫描【count(*)很慢】,mysiam内置计数器,效率高。

Innodb支持行锁和表锁,mysiam只支持表锁。

对于Delete from table,mysiam会重新建表,而innodb会一行行删除,不会删除表结构。

Mysiam崩溃后无法恢复,而innodb可以完全恢复。

六、Mysql事务

开启一个事务:A.START TRANSACTION或者begin

修改事务自动提交 set autocommit = 0 | 1 (0:取消自动提交;1:自动提交

注意:数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,创建、取消或更改表或存储的子程序的语句。

事务不能被嵌套。

SET TRANSACTION;用来设置事务的隔离级别

RELEASE SAVEPOINT identifier;删除一个事务的保存点。

在mysql中,以下哪种方式可以开启一个事务:start transaction和 begin

不能回退select(回退也是没有意义的),不能回退create和drop操作。可以使用,但是不起作用。

当执行commit或rollback语句后,事务会自动关闭(将来的更改会隐含提交)

sync_binlog=0和innodb_flush_log_at_trx_commit=0都可以提高事务的执行速度。

事务隔离级别:

a)未提交读(read uncommitted):所有事务都能看到其他未提交事务的结果。脏读、不可重复读、幻读

b)提交读(read committed):一个事务只能看到已经提交事务所做的改变。不可重复读、幻读

c)可重复读(repeatable read):同一事务的多个实例在并发读取数据时,看到同一数据行【事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容。】。MySQL默认事务隔离级别。幻读

d)串行读(serializable):最高隔离级别。强制事务排序,数据行上加共享锁。

i.幻读【事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据 称为幻读】而【如果事务A 按一定条件搜索, 期间事务B 删除了符合条件的某一条数据,导致事务A 再次读取时数据少了一条。这种情况归为 不可重复读】

事务日志:

a)Redo log重做日志,提供前滚操作

b)Undo log回滚日志,提供回滚操作

七、Mysql锁

两段锁协议:

a. 对任何数据读取、修改之前,事务先获得锁。

b. 释放一个封锁,事务不再获得其他锁。

共享锁S锁又称为读锁。

排它锁X锁又称为写锁。

MDL锁加在数据上而非数据行上

查看锁信息:show engine innodb status、information_schema.innodb_lock

mysql以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。

mysql临时表是仅对当前用户会话可见的数据库对象,并且一旦会话结束,这些表将自动删除。

表锁:是MySQL中最基本的锁策略,并且是开销最小的策略。【写锁比读锁有更高的优先级,写锁可以插入到锁队列中读锁的前面,读锁不能插入到写锁的前面。】不会出现死锁。

行级锁:可以最大程度地支持并发处理(同时也带来了最大的锁开销)。行级锁只在存储引擎层实现,而MySQL服务器层没有实现。行锁是现在索引上,如果不走索引就退化为表锁。

如果只读考虑使用myisam,又读又写考虑使用innodb。

InnoDB使用不同的锁策略(Locking Strategy)以及MVCC机制来实现不同的隔离级别。

下面哪些方法可以观察到锁信息

a)Information_schema.innodb_lock

b)Show engine innodb status

死锁的产生:互斥条件、请求与保持条件、不剥夺条件、循环等待条件。

八、Mysql管理-权限、日志、主从等

数据库并发常见问题:

i.丢失更新:一个事务的更新覆盖了另一个事务的更新

ii.脏读:一个事务读取了另一个事物未提交的数据

iii.不可重复读:一个事务两次读取同一个数据,两次读取的数据不一致

iv.幻读:一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据

主从同步:

i.设置主从数据库实现读写分离,主数据库负责“写操作”,从数据库负责“读操作”,通过实现数据库的读写分离提高系统的性能。此过程需要解决主从数据库数据同步的问题,在主数据库写入数据后要保证从数据库的数据也要更新。

ii.主服务器master激励数据库操作日志到二进制日志binary log,从服务器开启I/O线程将二进制日志记录的操作同步到中继日志relay log(存在从服务器的缓存中),另外sql线程将中继日志relay log记录的操作在从服务器执行。

日志:记录更新操作

日志名

作用

适用性

查询日志general query log

记录每一条sql语句

访问量较大时不建议开启,否则影响服务器性能

慢查询日志slow queries log

记录运行时间超过long_query_time值的sql语句

作为数据优化可查的分析项

二进制日志binary log

记录所有更改数据的语句

可用于数据的恢复,且为针对时间点的还原;主从架构、数据备份、数据恢复

事务日志

1.Redo log重做日志,提供前滚操作 ;2.Undo log回滚日志,提供回滚操作

错误日志error log

包含启动和关闭的次数;错误、警告和注释的相关诊断信息;自动检查或修复的信息;主从复制架构中从服务器线程时产生的信息;event scheduler运行一个event时产生的日志信息

中继日志relay log

复制架构中,被服务器用于保存主服务器的二进制日志中读取到的事件

权限:

mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表

mysql权限表的验证过程为:

先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。

通过身份认证后,进行权限分配,按照user,db,tables_priv,columns_priv的顺序进行验证。即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。

Procs_priv表:存放存储过程和函数级别的权限

Host权限表:配合db权限表对给定主机上数据库级操作权限做更细致的控制,此权限表不受grant和revoke语句的影响

Root:MySQL默认管理员,管理数据库

修改用户权限:

a)执行Grant,revoke,set password,rename user命令修改权限之后, MySQL会自动将修改后的权限信息同步加载到系统内存中。

b)如果执行insert/update/delete操作上述的系统权限表之后,则必须再执行刷新权限命令才能同步到系统内存中。

revoke命令收回用户权限;

有两种方式创建MySQL授权用户

执行create user/grant命令(推荐方式)

通过insert语句直接操作MySQL系统权限表

分配权限给用户

grant 权限列表 on *|库名 . *|表名 to 用户名[@主机地址] [identified by "用户密码"] [with grant option];

权限列表: all [privileges]: 表示所有权限; delete:允许使用delete; select:允许使用select; update:允许使用update; insert:允许使用insert 等...

.* :表示所有库的所有表

库名.表名 :表示某库下面的某表

撤消权限

revoke 权限列表 on *|库名 . *|表名 from 用户名[@主机地址];

revoke all privileges, grant option from 用户名[@主机地址];-- 撤销所有权限

例如:revoke update on . from 'user_one'@'localhost';

审计:记录所有操作(包括查询)

九、正则表达式

1. 匹配任意一个字符的符号是:.

2. 零次或一次:?

3. 零次或多次:

4. 正则表达式的转义符是( )A.\\*

5. MySql的like语句中的通配符:百分号、下划线和escape

a)%:表示任意个或多个字符。

b)_:表示任意单个字符。

c)使用escape,转义字符。

十、补充

你可能感兴趣的:(mysql优化三要素)