感谢原博,我只是整理自己容易遗忘的

文章目录

  • 数据库基础知识
    • 数据为什么要保存在数据库中
    • 数据库的三大范式
  • 索引
    • 什么是索引?
    • 索引的优缺点
    • 索引的使用场景
    • 不适合创建索引的场景
    • 索引有哪几种类型
    • 索引的数据结构
    • 索引的基本原理
    • 创建索引的三种方式,删除索引
    • 百万级别或者以上的数据如何删除
    • B 树和B+ 树的区别
    • 使用 B 树的好处
    • 使用 B+ 树的好处
    • Hash 索引和B+ 树索引有什么区别或者说优劣呢?
    • 数据库为什么使用 B+ 树而不是B 树
    • 什么是聚簇索引?
    • 为什么B+ 树在满足聚簇索引和覆盖索引的时候不需要回表查询数据
  • 事务
    • 什么是数据库事务
    • 事务的四大特征(事务必须满足的四个条件)
    • 什么是脏读?幻读?不可重复读?
    • 什么是事务的隔离级别?MySQL 的默认隔离界别是什么?
    • MySQL 的锁
    • 隔离级别与锁的关系
    • 从锁的类别上分MySQL都有哪些锁?
    • 什么是死锁?怎么解决?
    • 数据库的乐观锁和悲观锁是什么?怎么实现的?
  • 常用SQL 语句
    • SQL 语句主要分为哪几类?
    • 六种关联查询
    • 说一下 SQL 左连接以及使用场景
    • join 作用,讲内连接 和 外连接
    • varchar 与 char 的区别
    • FLOAT 和 DOUBLE 的区别
    • drop、delete和truncate 的区别
    • 某个表中有 10 条一模一样的数据,现在要删掉其中的 9 条,写一下 sql 语句
    • 数据库事务、主键与外键的区别?
    • count 和 sum 的区别,以及count(*)和count(列名)的区别
    • 修改字段类型及名称
  • 扩展
    • 数据库连接泄漏的含义
    • 说说 redis
    • 缓存技术
    • 如果mysql中用户密码丢了怎么办?建一个数据库表,授权命令是什么?
    • 如何对数据库作优化

数据库基础知识

数据为什么要保存在数据库中

数据保存在内存中

优点:存取速度快
缺点:数据不能永久保存

数据保存在文件中

优点:数据永久保存
缺点:1)速度比内存操作慢,频繁的IO 操作;2)查询数据不方便

数据保存在数据库中

1)数据永久保存
2)使用 SQL 语句,查询效率高
3)数据管理方便

数据库的三大范式

第一范式:每个列都不可再分

第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不是依赖主键的一部分

第三范式:在第二范式的基础上,非主键列只依赖主键,不依赖其他非主键

索引

什么是索引?

索引是数据库中专门用于帮助用户快速查找数据的一种数据结构,索引可以大大提高MySQL的检索速度。索引的实现通常是使用 b 树及其 b+ 树。

通俗来说,索引就相当于目录,为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,要占用物理内存。

索引的优缺点

索引的优点:

  • 可以大大加快数据的检索速度,这也是创建索引最主要的原因。

索引的缺点:

  • 创建索引和维护索引需要时间,具体的,当对表中的数据进行增加、删除和修改的操作时,索引也要动态维护,会降低增/删/改的执行效率。
  • 索引需要占用物理内存。

索引的使用场景

  • 数据量过大的时候可以创建索引
  • 经常需要查询操作的字段可以创建索引
  • 经常出现在 where 子句中的字段需要创建索引
  • 用到排序的列上要创建索引

不适合创建索引的场景

  • 对于那些在查找是很少使用或者很少参考的列的不需要创建索引
  • 对于那些只有很少数值的列,本来结果集合就是相当于全表查询了,就没有必要建立索引了。比如人员信息表中的性别列就不需要建立索引
  • 对于那些 txt,image,bit 类型的列就不要增加索引了,这些类型的数据,要么数据量很大,要么取值很少。
  • 不会出现在where子句中的字段不需要建立索引
  • 当修改性能远远大于检索性能就不用创建索引。

索引有哪几种类型

主键索引:数据列不允许重复,不允许为NULL,一个表只能有一个主键

唯一索引:数据列不允许重复,允许为 NULL,一个表中允许有多个唯一索引

  • 可以通过 ALTER TABLE table ADD UNIQUE (col); 创建唯一索引
  • 可以通过ALTER TABLE table ADD UNIQUE (col1, col2); 创建唯一组合索引

普通索引:基本的索引类型,允许重复,允许为 NULL 值

  • 可以通过 ALTER TABLE table ADD INDEX index_name (col); 创建普通索引;
  • 可以通过 ALTER TABLE table ADD INDEX index_name (col1, col2, …); 创建普通组合索引

全文索引:是目前搜索引擎使用的一种关键技术

  • 可以通过 ALTER TABLE table ADD FULLTEXT (col); 创建全文索引

索引的数据结构

MySQL的索引目前只有两种:b 树和 Hash 索引,b 树索引是 MySQL 数据库中使用最频繁的索引类型。

(1)B 树索引

查询方法:
主键索引区:PI (关联保存时数据的地址 )按主键查询

普通索引:SI (关联的id的地址,然后再到达上面的地址)。所以按主键查询速度最快。

B+ 树性质:
1)n 棵子树的节点包含 n 个关键字,不用来保存数据而是保存数据的索引
2)所有的叶子节点中包含了全部关键字的信息,及指向这些关键字记录的指南,且叶子节点本身依关键字的大小自小而大顺序链接
3)所有的非终端节点可以看成是索引部分,结点中仅含其子树中的最大(或最小关键字)
4)b+ 树中,数据对象的插入和删除仅在叶节点上进行。
5)b+ 树有 2 个头指针,一个是树的根节点,一个是最小关键码的叶节点。

b 树索引不仅可以被用在 =,>,>=,<,<= 和 between 这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的量

(2)hash 索引
类似于数据结构中简单实现的 hash 表一样,当我们在 mysql 中用哈希索引时,主要就是通过 hash 算法,将数据库字段转换成定长的 hash 值,与这条数据的行指针一并存入 hash 表的对应位置;如果发生 hash 碰撞,则在对应 hash 键下以链表形式存储。

hash索引只能用于对等比较,比如=, <=>(相当于=) 操作

索引的基本原理

索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说,执行查询时就得遍历整张表。

索引的原理也很简单,就是把无序的数据变成有序的查询。

  1. 把创建了索引的列的内容进行排序;
  2. 把排序结果生成倒排列表;
  3. 在倒排列表内容上拼上数据链地址;
  4. 在查询的时候,先拿到倒排列表内容,再取出数据地址链,从而拿到具体数据。

创建索引的三种方式,删除索引

第一种方式:在执行 create table 是创建索引

CREATE TABLE user_index2 (id INT auto_increment PRIMARY KEY,first_name VARCHAR (16),last_name VARCHAR (16),id_card VARCHAR (18),information text,KEY name (first_name, last_name),FULLTEXT KEY (information),UNIQUE KEY (id_card)
);

第二种方式:使用 alter table 命令去增加索引

ALTER TABLE table_name ADD INDEX index_name (column_list);

其中,table_name为表名,index_name 为索引名(可自己命名,缺省时,MySQL将根据第一个索引列赋一个名称),column_list 为要增加索引的列名

第三种方式:使用 create index 命令创建

CREATE INDEX index_name ON table_name (column_list);

可对表增加普通索引或 UNIQUE 索引。

删除索引:

1)根据索引名删除普通索引、唯一索引、全文索引。alter table 表名 drop KEY 索引名

alter table user_index drop KEY name;
alter table user_index drop KEY id_card;
alter table user_index drop KEY information;

2)删除主键索引,alter table 表名 drop primary key。因为主键只有一个。如果主键是自增长的,那么不能直接执行此操作,因为自增长依赖于主键索引。

百万级别或者以上的数据如何删除

索引需要额外的维护成本。索引是一个文件,所以当我们对数据进行增删改操作的时候,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,从而降低增删改的执行效率。对大量数据进行更新操作和创建的索引数量是成正比的,因此我们需要采取其他的方式对大量数据进行更新操作。

  1. 先删除百万数据的索引;(耗时约3分钟)
  2. 删除其中的无用数据;(耗时不到两分钟)
  3. 删除后重新创建索引;(此时数据比较少,创建索引也快,约 10 分钟)

通过次方法比之前的直接删除绝对要快很多。

B 树和B+ 树的区别

  • 在 B 树中,可以将键和值存放在内部节点和叶子节点;但在 B+ 树中,内部节点都是键,没有值,叶子结点同时存放键和值,所有的关键字都在叶子节点出现
  • B+ 树的叶子节点有一条链相连,而 B 树的叶子节点各自独立
  • B+ 树只有到达叶子节点才能命中(B 树可以在非叶子节点命中),其性能也等价于在关键字全集做一次二分查找。

使用 B 树的好处

B 树可以在内部结点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方会大大提高热点数据的查询效率。这种特性使得B树在特定数据重新查询的场景中更加有效。

使用 B+ 树的好处

由于 B+ 树的内部只存放键,不存放值,因此,一次读取,可以在内存中获取更多的键,有利于更快的缩小查询范围。

B+ 树的叶节点由一条链相连,因此,当需要进行一次全数据遍历的时候,B+ 树只需要使用O(logN)时间找到最小的一个结点,然后通过链进行O(N)的顺序遍历即可。而B 树则需要对树的每一层进行遍历,这需要更多的内存置换次数,因此也需要花费更多的时间。

Hash 索引和B+ 树索引有什么区别或者说优劣呢?

首先要清楚 Hash 索引和 B+ 树索引的底层实现原理:

hash 索引底层实现就是 hash 表,进行查找时,调用一次 hash 函数就可以获取到相应的键值,之后进行回表查询获取实际数据。B+ 树底层实现是多路平衡查找树。对于每一次的查询都是从根节点出发,查找到子节点方可获得所查键值,然后根据查询判断是否需要回表查询数据。

因为在hash 索引中经过 hash 函数建立索引后,索引的顺序与原顺序无法保持一致,因此不能支持范围查询。而B+ 树的所有结点都遵循(左节点小于父节点,右节点大于父节点),天然支持范围。

那么可以看出他们的不同:

hash 索引一般情况下进行等值查询更快,但是无法进行范围查询。

  • hash 索引不支持使用索引进行排序;
  • hash 索引不支持模糊查询以及多列索引的最左前缀匹配。原理是 hash 函数的不可预测,AAAA 和 AAAAB 的索引没有相关性
  • hash 索引任何时候都避免不了回表查询数据,而B+ 树在符合某些条件的时候可以只通过索引完成查询(聚簇索引、覆盖索引等);
  • hash 索引虽然在等值查询上比较快,但是不稳定。且性能不可预测,当某个键值存在大量数据的时候,发生 hash 碰撞,此时效率可能极差。而B+ 树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低。

因此在大多数情况下,直接选择 B+ 树索引可以获得稳定且较好的查询效率。

数据库为什么使用 B+ 树而不是B 树

  • B 树只适合随即检索,而B+ 树同时支持随即检索和顺序检索;
  • B+ 树空间利用率更高,可以减少 IO 次数,磁盘读写的代价更低。索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。这样就导致索引查找过程中就要产生磁盘的 I/O 消耗。B+ 树的内部结点知识作为索引使用,并没有指向关键字具体辛纳希的指针,其内部结点比B 树小,内存能容纳的节点中的关键字数量有限,因此一次性读入内存中可以查找的关键字也就越多,相对的,IO 读写次数就会降低。
  • B+ 树的查询效率更加稳定。B 树搜索时有可能在非叶子节点结束,越靠近根节点的记录查找时间越短,只要找到关键字即可确定记录的存在,其性能相当于在关键字的全集内做一次二分查找。而在B+ 树中,顺序检索比较明显,随即检索时,任何关键字的查找都必须走一条从根节点到叶节点的路,所有关键字的查找路径相同,导致每一格关键字的查询效率相当。
  • B+ 树的叶子节点使用指针将叶子结点连接在一起,只要遍历叶子结点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B 树不支持这样的操作。
  • B+ 树增删文件时,效率更好。因为B+ 树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可以更好的提高增删效率。

什么是聚簇索引?

  • 聚簇索引:将数据与存储放到一块,找到索引也就找到了数据;
  • 非聚簇索引:将数据存储与索引存储分开结构,索引结构的叶子节点指向了数据的对应行,myisam 通过key_buffer 把索引先缓存到内存中,当访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘响应数据,这也就是为什么索引不在key_buffer命中时,速度慢的原因。

注意:innodb中,在聚簇索引上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值

为什么B+ 树在满足聚簇索引和覆盖索引的时候不需要回表查询数据

在B+ 树的索引中,叶子节点可能存储了当前的 key 值,也可能存储了当前的key值以及整行的数据,这就是聚簇索引和非聚簇索引。

在 InnoDB 中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。

当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次回表查询。

事务

什么是数据库事务

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单元,其执行的结果必须使数据库从一种一致性的状态转变到另一种一致性状态。事务是逻辑上的一组操作,这组操作要么全部执行,要么全部都不执行。

举例:小明要在银行给小红转账 1000 元,这个转账过程涉及到两个操作:将小明的银行账户余额减少1000元,小红的银行账户余额增加1000元。万一在这两个操作之间突然出现错误,比如银行系统崩溃,导致小明的余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都失败。

事务的四大特征(事务必须满足的四个条件)

关系数据库需要的事务需要遵循 ACID 规则,具体如下:

  • 原子性(A):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么全部失败;
  • 一致性©:执行事务结束后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
  • 隔离性(I):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间的数据库是独立的。隔离性可以防止多个事务并发执行时由于交叉执行而导致的数据的不一致。
  • 持久性(D):一个事务被提交后,它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

什么是脏读?幻读?不可重复读?

  • 脏读:某个事务更新了一份数据,而这次更新还未提交到数据库中,另一个事务在此时读取了同一份数据,由于某些原因,前一个事务发生 RollBack 操作,则后一个事务所读取的数据就会是不正确的;
  • 不可重复读:在一个事务中多次读取同一个数据。在这个事务还没结束时,另一个事务也访问改数据并发生更新,那么第一个事务读到的数据可能是不一样的。
  • 幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的全部数据进行了修改。同时第二个事务像表中插入一行数据。那么第一个事务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一样。

什么是事务的隔离级别?MySQL 的默认隔离界别是什么?

为了达到事务的四大特性,数据库定义了 4 种不同的事务隔离界别,由低到高依次是读未提交、读已提交、可重复读、可串行化,这四个级别可以逐个解决脏读、不可重复读、幻读这几个问题

隔离界别 脏读 不可重复读 幻读
读未提交 会导致 会导致 会导致
读已提交 不会导致 会导致 会导致
可重复读 不会导致 不会导致 会导致
可串行化 不会导致 不会导致 不会导致
  • 读未提交:最低的隔离级别,允许读取尚未提交的数据变更。会导致脏读、不可重复读、幻读
  • 读已提交:允许读取并发事务已提交的数据。可以组织脏读,但幻读或不可重复读仍有可能发生
  • 可重复读:对同一字段的多次读取都是一致的,除非数据是被本身事务自己所修改。可以组织脏读和不可重复读,但幻读仍有可能发生
  • 可串行化:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次按照逐个执行,这样事务之间就完全不可能产生干扰。可以防止脏读、不可重复读以及幻读

其中,MySQL 默认的隔离机制级别是可重复读。

MySQL 的锁

当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。

隔离级别与锁的关系

在读未提交的级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突;

在读已提交的级别下,读操作需要加共享锁,但在语句执行完以后释放共享锁;

在可重复读的级别下,读操作需要加共享锁,但是在事务结束前不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁;

可串行化是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一致持有锁,直到事务完成。

从锁的类别上分MySQL都有哪些锁?

  • 共享锁:又叫做读锁。当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
  • 排他锁:又叫做写锁。当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,他和其他的排他锁、共享锁互斥。

举例:用户的行为有两种,一种是来看房,多个用户一起看房是可以接收的。一种是真正的入住一晚,在这期间,其他用户无论是来看房还是入住都是不可以的。

什么是死锁?怎么解决?

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶行循环的现象。

常见的解决死锁的办法:

  1. 如果不同程序并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁的机会;
  2. 在同一事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率;
  3. 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率。

如果业务处理不好可以用分布式锁或者乐观锁。

数据库的乐观锁和悲观锁是什么?怎么实现的?

数据库管理系统中并发控制的任务是确保在多个事务存取数据库中统一数据时,不破坏事务的隔离性和统一性以及数据库的统一性。乐观并发控制和悲观并发控制是并发控制主要采用的技术手段。

乐观锁:假定不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过 version 的方式来进行锁定。实现方法:一般使用版本号机制或 CAS 算法实现。

常用SQL 语句

SQL 语句主要分为哪几类?

数据定义语言DDL(Data Definition Language):CREATE,DROP,ALTER
以上操作是对逻辑结构的操作,其中包括表结构、试图和索引。

数据查询语言DQL:SELECT
即查询操作,以select 为关键字。各种简单查询、连接查询都属于 DQL。

数据操纵语句DML:INSERT,UPDATE,DELETE
以上操作是对数据进行操作,与数据查询语言共同构建了多数初级程序员常用的增删改查操作。

数据控制语言DCL:GREANT,REVOKE,COMMIT,ROLLBACK
以上操作即对数据库安全性完整性等有操作,可以简单理解为权限控制。

六种关联查询

  • 交叉连接(笛卡尔积连接)
  • 内连接(左右两边数据表都有时才选出来)
  • 外连接
  • 联合查询
  • 全连接(左右两边数据表的值全部都有)

在数据库DB中有两张表db1 和 db2。

内连接:连接两张表,来读取 db1 中所有 author 字段在 db2 中对应的 count 字段值

select a.id, a.author, b.count from db1 a join db2 b on a.author = b.author;

等价于

select a.id, a.author, b.count from db1 a, db2 b where a.author = b.author


左外连接:左外连接会读取左边数据表的全部数据,几遍右边表无对应数据

以下实例中db1 为左表,db2 为右表

select a.id, a.author, b.count from db1 a left join db2 b on a.author = b.author;

以上实例使用左外连接,该语句会读取左边的数据表db1 的所有选取的字段数据,即便右边的表没有对应的字段值

右外连接:会读取右边数据表的全部数据,即使左边表无对应数据。
以下实例中db1 为左表,db2 为右表。

select a.id, a.author, b.count from db1 a right join db2 b on a.author = b.author;


以上实例使用了右外连接,该语句会读取右边的数据表的所有选取的字段数据,即使在左边的数据表中没有对应的字段值

说一下 SQL 左连接以及使用场景

左连接返回包括子句中指定的左表的所有行,而不仅仅是连接所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的右表的列设为空指

使用场景:需要保持左表完整加入另一表中的数据

join 作用,讲内连接 和 外连接

join 的作用是连接两个表。假设有 2 个表 —— student 表 和 sc 表

内连接:也是自然连接,当使用内连接时,如果 student 中某些学生没有选课,也就是在 sc 表中没有相应元组。最终查询结果会舍弃这些学生的信息。

外连接:如果想以 student 表为主体列出每个学生的基本情况及其选课情况。即使某个学生没有选课,依然在查询结果中显示,查询结果的sc表的属性上填空值。

varchar 与 char 的区别

char的特点

  • char 表示定长字符串,长度是固定的;
  • 如果实际插入数据的长度小于char定义的长度,则用空格填充;
  • 当输入的字符长度超过指定的数时,char会截取超过的字符;
  • 因为长度固定,所以存取速度要比varchar快,但会占据多余的空间;
  • 对于char 来说,最多能存放的字符个数为 255,和编码无关

varchar 的特点

  • varchar 表示变长字符串,长度是可变的;
  • 插入的数据是多长,就按照多长来存储;
  • varchar 因为长度不固定,所以存取速度慢,但不占据多余的内存;
  • 对于varchar 来说,最多能存放的字符个数为65532

FLOAT 和 DOUBLE 的区别

  • float 类型数据可以存储至多 8 位十进制数,并在内存中占 4 字节
  • double 类型数据可以存储至多 18 位十进制数,并在内存中占 8 字节

drop、delete和truncate 的区别

delete truncate drop
类型 属于DML 属于DDL 属于DDL
回滚 可回滚 不可回滚 不可回滚
删除内容 表结构还在,删除全部或者一部分数据行 表结构还在,删除表中全部数据 从数据库中删除所有的数据行,索引和权限也会被删除
删除速度 删除速度慢,需要逐行删除 删除速度快 删除速度最快

因此,在删除一个表时用drop;删除部分数据行时用delete;在保留表而删除所有数据的时候用truncate

某个表中有 10 条一模一样的数据,现在要删掉其中的 9 条,写一下 sql 语句

delete * from table limit 9

数据库事务、主键与外键的区别?

数据库事务:事务即用户定义的一个数据库操作序列,这些操作要么全做要么全部不做,是一个不可分割的单位。

主键:主键是一个表中能确定一条记录的唯一标识。比如,有一条记录包括学号、姓名、班级。学号就是唯一能确定一个学生的信息,所以学号是主键。

外键:用于和另一张表关联。是另一张表能确定唯一一条记录的字段,用于保持数据的一致性

count 和 sum 的区别,以及count(*)和count(列名)的区别

求和累加数据用 sum(),求行的个数累计用count()

count(*) 包括了所有的列,在统计结果时不会忽略列值为null的值

count(列名) 只包括列名那一项,会忽略列值为空的计数

修改字段类型及名称

alter table tb modify c char;

等价于

alter table tb change c c int;

change 关键字后紧跟着要修改的字段名,然后指定新字段及类型

扩展

数据库连接泄漏的含义

数据库连接泄露指的是如果在某次使用或者某段程序中,没有正确的关闭 connection、statement和resultset资源,那么每次执行都会留下一些没有关闭的连接,这些连接失去了引用而不能得到重新使用,因此就会造成数据库连接的泄漏。

数据库连接的资源是宝贵而且有限的,如果在某段使用频率很高的代码中出现这种泄漏,那么数据库连接资源将被耗尽,影响系统的正常运转。

说说 redis

redis 是一个key-value 存储系统。和memcached类似,它支持存储的value类型相对更多,包括string、list、set和hash。这些数据类型都支持push/pop、add/remove 及取并集交集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis 支持各种不同方式的排序。与memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,在此基础上实现了主从同步。

用来实现缓存机制,国内像新浪、淘宝等均在使用redis 的缓存服务。

缓存技术

redis 可以实现缓存机制。

Redis 作为一个高性能的key-value 数据库具有以下特征

  1. 多样的数据模型
  2. 持久化
  3. 主从同步

Redis 支持丰富的数据类型,最常用的数据类型有:String、Hash、List、Set和 SortSet。Redis 通常将数据存储于内存中,或被配置为虚拟内存。

Redis 有一个很重要的特点就是它可以实现持久化数据,通过两种方式可以实现数据持久化:使用RDB快照的方式,将内存中的数据不断写入磁盘;或使用类似mysql的AOF 日志方式,记录每次更新的日志。前者性能高,但是可能会引起一定程度的数据丢失;后者相反。

Redis 支持将数据同步到多台数据库上,这种特性对提高读取性能非常有益。

如果mysql中用户密码丢了怎么办?建一个数据库表,授权命令是什么?

对于普通用户的密码丢失,直接用 root 超级管理员登录修改密码即可。若是 root 密码丢失

  1. 停止mysql:service mysql stop
  2. 安全模式启动:mysql_safe-skip-grant-table&
  3. 无密码回车登录:mysql -uroot -p;
  4. 重置密码:use mysql update user set password=password(’’) where user=‘root’ ans host=‘localhost’; flush privileges
  5. 正常启动:service mysql restart
  6. 在使用mysqladmin:mysqladmin password ‘123456’

授权命令

grant select,update(Sno)
on table Student
to U4
with grant option

如何对数据库作优化

  • 调整数据结构的设计,对于经常访问的数据库建立索引;
  • 调整 SQL 语句,例如在查询语句中指定列名,避免使用select *,重复查询相同的数据时可以缓存数据下次直接读取缓存,优化子查询可以使用关联查询替代,优化limit分页,优化union查询(union all 的效率高于 union),优化where子句(建立索引,尽量避免在where子句中使用!=或<>操作符等)
  • 调整服务器内存分配。内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整数据库全局区的数据缓冲区、日志缓冲区和共享池的大小;还可以调整程序全局区的大小。
  • 调整磁盘I/O,DBA 可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡。

【面试复习】—— 数据库相关推荐

  1. 数据库面试复习_数据科学面试复习

    数据库面试复习 大面试前先刷新 (REFRESH BEFORE THE BIG INTERVIEW) 介绍 (Introduction) I crafted this study guide from ...

  2. 面试复习归纳(技术服务、网络安全、运维与云计算)

    文章目录 面试复习归纳 说明 参考阅读 一.自我介绍 二.网络基础 1.OSI.TCP/IP模型 1.1 OSI 1.2 TCP/IP模型 1.3 封装与解封装 1.4 比较 2.应用层 2.1 DH ...

  3. Android面试复习资料整理

    Activity巩固和复习 1. 什么是Activity 四大组件之一,通常一个用户交互界面对应一个activity.activity是Context的子类,同时实现了window.callback和 ...

  4. Java面试复习---Docker(狂神版)

    Java面试复习---Docker(狂神版) 前言 Docker学习路径 Docker概述 Docker为什么出现? Docker的历史 Docker能干嘛 Docker安装 Docker的基本组成 ...

  5. Java面试复习---MySQL(狂神版)

    Java面试复习---MySQL(狂神版) 前言 1.初始MySQL 1.1.为什么学习数据库 1.2.什么是数据库 1.3.数据库分类 1.4.MySQL简介 1.5.安装MySQL 1.6.安装S ...

  6. 计算机专业保研面试复习笔记——计算机网络

    计算机专业保研面试复习笔记: 计算机专业保研面试复习笔记--数据结构中的重要算法 计算机专业保研面试复习笔记--数据库 计算机专业保研面试复习笔记--操作系统 计算机专业保研面试复习笔记--计算机网络 ...

  7. 【面试复习】Python基础复习

    [面试复习]Python基础复习 前言 相信一些学习python的朋友找不到一些python的的朋友找不到相对应的python面经,所以博主就推荐大家可以去牛客上面看看哦,各种大厂面经和习题哦! 地址 ...

  8. PHP面试MySQL数据库的索引

    你好,是我琉忆,PHP程序员面试笔试系列图书的作者. 本周(2019.3.4至3.8)的一三五更新的文章如下: 周一:PHP面试MySQL数据库的基础知识 周三:PHP面试MySQL数据库的索引 周五 ...

  9. Java面试宝典系列之面试复习提纲

    Java面试复习提纲 作者:egg 邮箱:xtfggef@gmail.com 微博:http://weibo.com/xtfggef 博客:http://blog.csdn.net/zhangerqi ...

  10. datagrid只传入了一部分的数据 未显示全_软件开发面试之数据库事务篇

    软件开发面试之数据库事务篇 不少的小伙伴正在准备或是即将准备后端开发的岗位,对于这个岗位而言数据库是必问的一个知识点,而数据库的事务和数据库的隔离级别又是问到数据库时必问的重点.小编从年初开始也是不断 ...

最新文章

  1. 微生物组学研究的那些”奇葩“动物模型
  2. Java开发小技巧(六):使用Apache POI读取Excel
  3. mysql大量数据插入探讨(量变引起质变)
  4. 帝豪gs车机系统wince_有了帝豪GS,生活变得越来越好,很不错
  5. xmind快捷键_XMind思维导图软件最全面的使用教程!
  6. zigbee cc2530 adc转换
  7. 编程大讲坛、坛坛是佳酿--编程大讲坛:Visual Basic核心开发技术从入门到精通...
  8. 判断frame是否已创建_类的创建
  9. 【Pascal's Triangle II 】cpp
  10. Twisted twisted.python.log日志
  11. python traceback_Python 列表操作,节后大放送
  12. Communicator可以多点同时Logon
  13. oracle 32 下载,oracle 11g 32位下载
  14. java求圆柱体体积面积(接口继承、字符串常用方法)
  15. AUTOCAD——LEN命令
  16. 怎么用计算机向手机上传照片,华为手机怎么传照片到电脑上去?华为手机往电脑传照片方法...
  17. 2020云栖大会-达摩院
  18. 【博客33】使用 “NVI“解决缺省参数绑定问题
  19. C# 实现软件授权码的功能
  20. 给Div添加边框颜色

热门文章

  1. 不缺信心与黄金 新基建赛道下的云计算将一飞冲天
  2. TestNG+Allure生成测试报告
  3. excel函数——IF、AND、OR、NOT
  4. 2021年最新获取url参数的方法,用正则就落后啦
  5. 自定义view实战(11):滑动解锁九宫格控件
  6. Vue实现类似于word插入表格时选中行列的效果
  7. 海康威视2022面经(含内推码)
  8. Android实现QQ第三方登录
  9. VMware网络配置(网络连不上常见问题及解决方案,持续更新)
  10. 编译原理(一)词法分析器