Mysql复习

  • 复习内容
    • MySQL - 索引详解   √
    • MySQL 教程|菜鸟教程   √
    • Mysql面试知识点总结(基础篇)   √
  • 思维导图
  • 记忆点:
    • 使用聚集函数(分组函数,统计函数:作用域一组数据并对一组数据返回一个值。如count,max..)进行计算的执行顺序是group by后having 前
    • mysql性能优化
      • 当已知运行结果只有一行数据时,使用limit 1提高性能,因为mysql会在找到一条结果后停止
      • 选择合适的数据库引擎
        • myISAM适用于大量查询操作,不适用于大量读写。(例:使用update一个字段,整张数据库表都被锁起来,别的操作也需要等待)
        • InnoDB四一个复杂的存储引擎,但支持行锁,适用于大量写操作,支持很多高级应用
      • 用not exists 不用not in.not in 不支持索引,是最慢的方式要同每条记录对比,数据量大时不建议
      • 不用 in/not in/ is null/is not null/<>这些不利于索引的操作
      • 分库分表,主从配置
      • 对于几百条的数据库表,先分页再join
      • 导入数据前应该关闭自动提交,最好删除索引导入后再建
      • 索引损害插入删除更新的性能
      • 尽量选择fulltext 而不是like
      • 当从一个表中删除大量数据时,使用 optimize table回收所有空间
      • char比varchar 效率高
      • 随机获取数据用join不用order by rand() limit'
    • mysql存储引擎
      • InnoDB 是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB 是默认的 MySQL引擎。(!支持事务和外键,有独立黄充斥,支持表锁,不存储表的总行数,比myisam插入效率高)
      •  MyISAM 基于 ISAM 存储引擎,并对其进行扩展。它是在 Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM 拥有较高的插入、查询速度,但不支持事物。
      •  DB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC,但它是 Share Nothing 的架构,因此能提供更高级别的高可用性和可扩展性。NDB 的特点是数据全部放在内存中,因此通过主键查找非常快。关于 NDB,有一个问题需要注意,它的连接(join)操作是在 MySQL 数据库层完成,不是在存储引擎层完成,这意味着,复杂的 join 操作需要巨大的网络开销,查询速度会很慢。
    • 事务的特征:
      • 原子性:事务操作全部完成或全部不完成
      • 一致性:在事务开始之前和结束以后,数据库的完整性约束没有被破坏
      • 隔离性:各事务的操作互不影响
      • 持久性:事物一旦完成,就永远保存
    • where col  is null,不是==
    • char类型支持的最大字节数是255,text约为64kb,MEDIUMTEXT约为16M,LONGTEXT约为4G
    • 查询时exists适用于b表(在exists或者in中出现的)比A表大的情况,反之适用in
    • mysql优化案例:
      • 手机号存储:使用BIGINT代替CHAR或者VARCHAR存放手机号码。这是因为CHAR或者VARCHAR,占用空间大,影响查询性能。例如:11位手机号CHAR存储,utf8编码,则占用33个字节;使用如果使用INT的话,INT最大只能保存10为数据,而手机号为11位,会出现溢出,所以使用        BIGINT占用8个字节,支持11为数据存储。
      • IP地址可以使用INT存储
        MySQL里提供了一个很好的函数:INET_ATON(),他负责把IP地址转化为数字,而另一个函数    INET_NTOA()负责将数字转化为IP地址,示例如下:注意:INT使用无符号,这是因为INT有符号最大为2147483647而无符号 最大为4294967295,如果使用有符号的话,会出现溢出,使用无符号则不会溢出。
      • 对于非负整数优先使用无符号整形存储
      • 避免使用enum类型,用TINYINT替代。修改值必须使用alter、排序的效率比较低、禁止使用数字作为enum枚举值
      • 使用timestamp(4字节)/datetime(8字节)存储日期时间:timestamp日期范围:1970-1-1 00:00:01----2038-01-10 03:14:07,timestamp以int存储,但可读性高
      • 尽可能把所有列定义为not null,索引null列会占用更多的空间,进行比较时需要作额外的处理
    • group by规则:
      • 子句可以包含任意数目的列,使得可以对分组进行嵌套
      • 如果有嵌套分组,数据将在最后规定的分组上汇总
      • 子句中列出的每个列都必须是检索列或有效的表达式(!不能是聚集函数)
      • 除聚集语句外,select语句中每个列都必须在group by子句中给出
      • 如果分组列中有null值,则null将作为一个分组返回。如果有多行null,将分为一组
    • union/union all规则
      • union必须由两条或两条以上的select语句组成,语句之间用union分隔(4个select使用3个union)
      • union中每个查询都必有包含相同的咧,表达式或聚集函数
      • 列数据类型必须兼容,类型相同或可以隐含转换
    • 视图的规则和限制
      • 视图必须是唯一命名
      • 试图数目没有限制
      • 有足够的访问权限才可以创建视图
      • 视图可以嵌套
      • order by 可以用在视图中(!若视图检索数据select中有order by 则视图中的会被覆盖)
      • 视图不能索引
    • update ignore可以忽略错误行
    • <,>会截断索引
  • 错题
    • 数据库管理系统的特点:共享性高,冗余度小;具有高度的物理独立性和逻辑独立性;整体结构化,用数据模型描述;由数据库管理系统提供数据安全性、完整性、并发控制和恢复能力。
    • 数据库管理系统是位于用户和操作系统之间的一层数据管理软件。和操作系统一样是计算机的基础软件,也是一个大型复杂的软件系统
    • 在数据库中存在多列的情况下,若要删除表中的某一列应该使用SQL语句:ALTER TABLE tableName DROP COLUMN columnName
    • 关系模式的任何属性不可再分
    • 数据库恢复的基础是利用转储的冗余数据。这些转储的冗余数据是指日志文件、数据库后备副本(数据库恢复的实现中可定期对整个数据库进行复制或转储
      转储是数据库恢复中常用的基本技术,它是指DBA把数据库复制到另一个磁盘上的过程,可分为静态转储和动态转储;转储还可以分为海量存储和增量转储;转储的冗余数据包通常包括  日志文件、数据库后备副本 等。)
    • 以下哪一句从表TABLE_NAME中提取前10条记录:select TOP 10 * from TABLE_NAME(MYSQL:select * from TABLE_NAME limit 0,10)
    • 在进行数据库逻辑设计时,可将 E-R 图中的属性表示为关系模式的属性,实体表示为元组,实体集表示为关系,联系表示为关系
    • 以 MySQL 5.7 或更低版本为准的数据库中,选择数据类:更小通常更好;尽量用最简单的数据类型;尽量不使用 Null 作为字段值;字符串较长时优先用 varchar 数据类型,灵活可变长度
    • 删除操作:
      • 删除表中的数据以及定义:drop table Student;
      • 删除表中数据,定义还在:truncate table Student;
      • 删除表中所有数据,但是删的比较低效:delete table Student;(系统一行一行删,保留日志,可以rollback)
    • mysql sql注入中使用延时注入时常用的语句是:sleep(5);benchmark(100000000,md5(1))
    • 创建索引的语句是create index indexname on tablename (username (length)),其中若是char和varchar类型,length可以小于字段实际长度,若是blob或text类型,必须指定length!
    • 在保存较大文本时, 通常会选择使用 TEXT 或者 BLOB,二者之间的主要差别是 BLOB保存二进制数据,比如照片;而 TEXT 只能保存字符数据,比如一篇文章等等。
    • 封锁:
      • 排他锁:X锁,写锁:事务T对数据A加上X所,则只允许T读取和修改A,其他事物不能在A上加锁
      • 共享锁:S锁,读锁:事物T在数据A上加S锁,则只允许T读取A,其他事物也只能加S锁,保证数据A不修改
    • SQL SERVER中的数据库用户是一般用户。登录用户是指DBA(数据库管理员)
    • 数据的物理独立性是指用户的应用程序与存储在磁盘上数据库中的数据是相互独立的
    • 视图是由基本表和视图导出的表
    • 数据库一般使用B*树作为索引
    • 逻辑独立性存在于外模式和内模式之间。数据的逻辑独立性是指数据与程序的逻辑独立性。用户的应用程序和数据库中的逻辑结构是相互独立的,当数据的逻辑结构发生改变时应用不需要改变
    • 模式

      • 模式(schema):
               模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。

      • 外模式(external schema):
               外模式也称子模式(subschema)或用户模式,它是数据库用固话(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。

      • 内模式(internal schema):
               内模式也称存储模式(storage schema),一个数据库只有一个内模式。它是数据物理存储和存储方式的描述,是数据在数据库内部的组织方式。

    • 三种数据不一致性

      • 丢失修改(lost update)
        两个事务T1和T2读入同一数据并修改,T2提交结果破坏了T1提交的结果,到这T1的修改被丢失。

      • 不可重复读(Non-Repeatable Read)
        不可重复读是指事务T1读取数据后,事务T2执行封信操作,使T1无法再现前一次读取的结果

      • 读“脏”数据(dirty read)
        读“脏”数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时T1已修改的数据恢复原职,t2读到的数据就与数据库中的数据不一致,则T2读到的数据就是“脏”数据,即不正确的数据

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

视频地址: https://www.bilibili.com/video/av57575364?p=51

1.sql语句分类:

(1)dql:数据查询语言,select语句

(2)dml:数据操作语言:insert,update,delete:对数据操作

(2)ddl:数据定义语言:create,drop,alter:对数据结构操作

(4)tcl:数据定义与研:commit 提交事务.rollback:回滚事务

(5)dcl:数据控制语言:greant授权,revoke撤销权限

2.source sql脚本绝对路径->完成sql脚本的初始化

3.查看表结构:desc 表名;

4.常用命令

(1)select databsse()->查看当前使用的数据库

(2)select version()->查看mysql版本号

(3)\c->结束一条语句

(4)exit->突出mysql

(5)show create table 表名->查看创建表的语句

5.标准sql语句要求字符串使用单引号括起来

6.between..and..左小右大,适用于数字(左右都闭)和字符(左闭右开)

7.排序asc升序,desc降序

select * from 表名 order by col1,col2 desc;-->查询表中信息先以col1升序排,col1有相同情况再以col2的降序排列

8.分组函数->多行处理函数,对“某一组”数据进行处理

(1)分组函数自动忽略Null:a(任意值)+null=null->ifnull(可能为null的数据,当做什么处理)=if(num,0)->如果num是null当做0处理

(2)分组函数不可以直接使用在where语句中

(3)count(*)和count(col)区别->第一个统计的是记录数,第二个统计的是col不为null的数据

9.goup by/having

(1)group by:按照某个字段或某些字段进行排序->分组函数联合使用(在group by执行完成之后执行,没有group by ,整张表格自成一组)

!当一条语句后面后group by则select后面只能是参加分组的字段或是分组函数

(2)having:对分组之后的数据进行再次过滤

select max(col) from 表名 group by 排序字段;

10.select(5) ..from(1) ... where(2) ... group by(3)...having(4)...order by(6)...

11. 去除重复记录:select distinct col from table;

(1) distinct要出现在所有字段最前面

(2) disticnt对后面所有字段联合起来去重

12.连接查询

(1)分类:内连接(等值连接,非等值连接,自连接,两张表没有主副之分,凡是能够匹配上的记录都查询出来,匹配不上都不显示),外连接(左外连接(左表是主表),右外连接(右表是主表),两张表有主副之分,主要查询主表数据,副表中的数据没有和主表匹配上,副表生成null和主表匹配显示,主表数据无论是否匹配上都显示),全连接

(2)避免笛卡尔积现象。不能提高匹配效率,只是显示有效记录,匹配次数不变

(3)内连接:...表1 inner(可省略) join 表2 on 连接条件(表1.col = 表2.col) where ...

自连接:将一张表看做是两张表

(4)select b.* from 表1 a right join 表2 b on a.col=b.col where a.col2 is null->查询a表中没有b表中内容的记录

13.三表连接 ...A join B join C....

14.union:联合,将多个相关或不相关的查询结果加在一起,查询结果的列数相同

15.limit startIndex(起始位置,0表示第一条数据,0可忽略),length(取几个)---->sql语句最后执行

16.通用标准分页sql->每页显示size条记录,第number页的查询limit是(number-1)*size,size

17.varchar数据类型根据内容动态分配存储空间

在实际开发中,某个字段数据长度不发生改变用char,发生改变用varchar

18.create table 表名(col1 type1,col2 type2 default 默认值);->则插入记录不声明就直接默认为默认值

19.表的复制:create table 表名 as select语句;->将查询结果当做表创建

20.删除大表->truncate table 表名->彻底将表结构删除,截断表,不可回滚,永久丢失

21.增删改查->CRUD->create,retrive,update.delete

22.给两列添加唯一性约束:

(1)unique(col1,col2);->col1和col2联合起来不能重复

(2) create table tableName{type1 col1 unique,type2 col2 unique}-->col1,col2值唯一

!not null只能在字段后面单独加,只有列级约束

23.主键分类

根据主键字段数量划分:

(1)单一主键,选择一个字段作为主键

(2)复合主键,多个字段联合起来添加一个主键约束

根据主键性质划分:

(1)自然主键,和业务没有任何关系的自然数

(2)业务主键,主键值和系统业务挂钩(!最好不要,业务改变影响表结构)

!一张表的主键约束只能有一个,表级约束定义方法->primary key(col)

24.自动增长:auto_increment

25.外键约束:

(1)a中的外键引用b表中的一个列,a表是子表,b表示父表.删除数据/表先删除子表,添加数据/表先添加父表

(2)foreign key(a外键) references b表(b表某列)

(3)引用b表的列可以不是主键,但必须是唯一的

26.存储引擎(了解)

(1)就是表的存储方式

(2)查看当前mysql支持的存储引擎

show engines \G

(3)常见的存储引擎:

[1]MyISAM:

a.不支持事务

b.最常用,非默认

c.使用三个文件表示-表结构(格式文件,frm),表内容(数据文件,myd),表索引(索引文件,myi)

d.优点:可被压缩,节省存储空间,并且可以转换为只读表,提高检索效率

[2]InnoDB:

a.mysql存储引擎

b.每个innoDB表在数据库目录以.frm格式文件显示

c.表空间tablespace用于存储表内容(逻辑概念),无法被压缩,无法转换成只读

d.支持事务,用commit,davepoint,rollback支持事务处理,提供一组用来记录事务性活动的日志文件

e.在mysql中崩溃后提供自动恢复

f.支持级联删除和级联更新

[3]Memory:

a.缺点:不支持事务,数据容易丢失(数据和索引都存储在内存中)

b.优点:速度快

c.不支持blob和clob字段

27.事务:

(1)一个事务是一个完整的逻辑单元,不可再分,要么同时成功,要么同时失败

(2)和事务相关的语句只有DML语句。因为DML都是和数据库数据相关的,通常一个业务都是多个DML语句共同连个完成,事务是为了保证数据完整性和安全性

(3)开始事务,执行了相关语句之后不会像文件中保存数据,不影响硬盘上数据,只是将执行保存在数据库操作历史中,通过提交事务(commit,修改硬盘文件的数据,清空操作历史)/回滚事务(rollback清空操作历史)结束事务

(4)特性:(ACID)

[1]原子性,是最小的工作单元,不可再分

[2]一致性,保证多条DML语句同时失败或成功

[3]隔离性,事务A与事务B之间具有隔离

[4]持久性,最终数据必须持久化到硬盘文件,事务才算成功

(5)事务的隔离级别

[1]第一级别,读未提交,read uncommit,事务A可以读取事务B没有提交的数据,存在脏读现象

[2]第二级别,读已提交(Oracle默认),read commit,问题是不可重复读

[3]第三级别,可重复读(mysql默认),repeatable read,存在问题,读取的幻想数据(事务A提交了对数据删除操作,事务B仍能读到)

[4]第四级别,序列化/串行化读,效率低,事务需要排队

(6)msyql事务默认自动提交,执行一条DML语句就提交一次,通过start transaction 关闭

28.索引

(1)相当于一本书的目录,通过目录快速查找相应资源

(2)通过索引减小扫描范围提交检索效率,但是不能随意添加,索引也是数据库对象需要维护。数据量庞大或字段很少有DML操作且经常出现在where语句中作为查询条件则可以考虑添加索引

(3)主键和unique约束的字段自动生成索引

(4)create index 索引名 on 表名(索引名);----drop index 索引名称 on 表名;

(5)实现原理

[1]采取的数据结构:B-TREE

[2]思路:数据库表中的记录都会有一条物理地址

根据查询条件的字段查找到对应的索引,通过索引检索找到字段值对应区域,在区域内再次寻找对应区域,知道定位到该值,获取记录的物理地址,原sql语句的查询条件就变成了物理地址=获取的物理地址

[3]原理:通过B TREE缩小扫描范围,底层索引进行排序,分区。索引会携带数据在表中的“物理地址”,最终通过索引检索到数据之后获取到关联的物理地址,通过物理地址定位表中数据

(6)分类:

[1]单一索引:给单个字段添加索引

[2]复合索引:联合多个字段添加一个索引

[3]主键索引:主键上自动添加索引

....

(7)失效:索引在模糊查询第一个通配符是%的时候失效

29.视图:

(1)create view 视图名 as sql的DQL语句

(2)对视图增删改查会通过视图影响原表数据

(3)作用:隐藏表的实现细节,保密级别高的系统只对外提供相关视图

30.DBA命令

(1)将数据库中数据导出

在windows的dos窗口执行

mysqldump 数据库名 [数据表名] sql文件存储路径 -用户名 -密码

(2)向数据库中导入数据

create database 数据库名

use 数据库;

source sql文件路径;

31.数据库三范式

(1)设计范式:设计表的一句,按照这个设计的表不会出现数据冗余

(2)三范式:

[1]第一范式,任何一张表都有主键,并且每个字段具有原子性,不可再分

[2]第二范式,符合第一范式,所有非主键字段完全依赖于全部主键字段(多对多->三张表,两个数据表,一个关系表->两个外键一个自然主键)

[3]第三范式,符合第二范式,不能有传递依赖(a->b,b->主键)->×,一对多->两张数据表,多的那个表加外键

你可能感兴趣的:(learning,diary)