Java常见数据库知识点

float 和 double 的区别是什么?

float 最多可以存储 8 位的十进制数,并在内存中占 4 字节。
double 最可可以存储 16 位的十进制数,并在内存中占 8 字节。

数据库char(定长)为什么比varchar(变长)效率高

因为varchar每次存储都要有额外的计算,得到长度,但是空间占用比char好。

MySQL 中有哪几种锁?

1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
2、行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
3、页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

说一下乐观锁和悲观锁?

乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,
但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,
这样别人想拿这个数据就会阻止,直到这个锁被释放。

如何提高数据库的查询效率

简化sql语句
适当给字段添加索引
将稳定的并经常查询的数据,缓存到redis中
将数据量大查询,可以使用分页查询

SQL 语言包括哪几部分?每部分都有哪些操作关键字?

SQL 语言包括数据定义(DDL)、数据操纵(DML),数据控制,访问权限(DCL)和数据查询(DQL)四个部分。
DDL:Create Table,Alter Table,Drop Table, Craete/Drop Index 等
DML:Select ,insert,update,delete,
DCL:grant,revoke
DQL:select

IFNULL() 函数

用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
IFNULL() 函数语法格式为:IFNULL(expression, alt_value)

多个模糊查询

SELECT * FROM magazine WHERE CONCAT(IFNULL(字段1,’’),IFNULL(字段2,’’),IFNULL(字段3,’’)) LIKE ‘%关键字%’

CONCAT用法

CONCAT(str1,str2,…)
返回值:由全体出入参数合并在一起而得到的字符串。只要输入的参数中有NULL值,就返回NULL。
CONCAT允许只有一个输入参数的情况。

你怎么看到为表格定义的所有索引?

索引是通过以下方式为表格定义的:
SHOW INDEX FROM tablename;

索引的底层实现原理和优化

B+树,经过优化的 B+树 主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,
因此 InnoDB 建议为大部分表使用默认自增的主键作为主索引。

索引的创建和删除

第一种是普通索引,CREATE INDEX indexName ON mytable(字段);创建表的时候直接指定。
删除索引的语法:DROP INDEX [indexName] ON mytable;
第二种是唯一索引,它与普通索引是类似的,但也存在不同之处,不同之处在于索引列的值必须唯一,
但允许有空值。如果是组合索引,则列值的组合必须唯一。

什么情况下设置了索引但无法使用

1、以“%”开头的 LIKE 语句,模糊匹配
2、OR 语句前后没有同时使用索引
3、数据类型出现隐式转化(如 varchar 不加单引号的话可能会自动转换为 int型)

简单描述 MySQL 中,索引,主键,唯一索引,联合索引 的区别,对数据库的性能有什么影响(从读写两方面)

索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们包含对数据表里所有记录的引用指针。
普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的访问速度。
普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,
在为这个数据列创建索引的时候就应该用关键字 UNIQUE 把它定义为一个唯一索引。
也就是说,唯一索引可以保证数据记录的唯一性。
主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯 一标识一条记录,使用关键字 PRIMARY KEY 来创建。
索引可以覆盖多个数据列,如像 INDEX(columnA, columnB)索引,这就是联合索引。
索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。

MySQL 如何优化 DISTINCT?

DISTINCT 在所有列上转换为 GROUP BY,并与 ORDER BY 子句结合使用。
SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;

如何显示前 50 行?

在 MySQL 中,使用以下代码查询显示前 50 行:
SELECT*FROM table LIMIT 0,50;

LIKE 声明中的%和_是什么意思?

%对应于 0 个或更多字符,_只是 LIKE 语句中的一个字符。

MySQL 支持事务吗?

在缺省模式(默认)下,MySQL 是 autocommit 模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,MySQL 是不支持事务的。
但是如果你的 MySQL 表类型是使用 InnoDB Tables 或 BDB tables 的话,你的
MySQL 就可以使用事务处理,使用 SET AUTOCOMMIT=0 就可以使 MySQL 允许在非 autocommit 模式,
在非 autocommit 模式下,你必须使用 COMMIT 来提交你的更改,或者用 ROLLBACK 来回滚你的更改。

数据库中的事务是什么?

事务特性:
1、原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
2、一致性:事务的执行使得数据库从一种正确状态转换成另一种正确状态(外部:银行收付账单,内部:原子性)
3、隔离性:在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,
4、持久性:事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

数据库隔离级别(关于spring的事务隔离级别与数据库的一样,也是下面的四个,只不过多了一个default)

1.Read uncommitted (读未提交):最低级别,任何情况都无法保证。(脏读,幻读,不可重复度)
2.Read committed (读已提交):可避免脏读的发生。(幻读,不可重复读)
3.Repeatable read (可重复读):可避免脏读、不可重复读的发生。(幻读)
4.Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

脏读:

一个事务读到另外一个事务还没有提交的数据,我们称之为脏读。(进行存款事务时候,还没有存完,允许查询事务)

不可重复读

在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。
这是由于查询时系统中其他事务修改的提交而引起的。
例如:事务B中对某个查询执行两次,当第一次执行完时,事务A对其数据进行了修改。
事务B中再次查询时,数据发生了改变。

幻读:

是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。
那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.

MySQL 里记录货币用什么字段类型好

NUMERIC 和 DECIMAL 类型被 MySQL 实现为同样的类型,这在 SQL92 标准允许。他们被用于保存值,
该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,精度和规模的能被(并且通常是)指定。

一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?

表类型如果是 MyISAM ,那 id 就是 18。
表类型如果是 InnoDB,那 id 就是 15。

如何通俗地理解三个范式?

第一范式:1NF 是对属性的原子性约束,要求属性具有原子性,不可再分解;
第二范式:2NF 是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
第三范式:3NF 是对字段冗余性的约束,即任何字段不能由其他字段派生出来, 它要求字段没有冗余。
范式化设计优缺点:
优点: 可以尽量得减少数据冗余,使得更新快,体积小
缺点:对于查询需要多个表进行关联,减少写得效率增加读得效率,更难进行索引优化

实践中如何优化 MySQL,最好是按照以下顺序优化:

1、SQL 语句及索引的优化
2、数据库表结构的优化
3、系统配置的优化
4、硬件的优化

说说对 SQL 语句优化有哪些方法?(选择几条)

1、Where 子句中:where 表之间的连接必须写在其他 Where 条件之前,
那些可以过滤掉最大数量记录的条件必须写在 Where 子句的末尾.HAVING最后。
2、用 EXISTS 替代 IN、用 NOT EXISTS 替代 NOT IN。
3、避免在索引列上使用计算 (在 WHERE 子句中,如果索引列是计算或者函数的一部分,DBMS 的优化器将不会使用索引而使用全表扫描)
4、避免在索引列上使用 IS NULL 和 IS NOT NULL
5、对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引。
6、应尽量避免在where子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
7、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

redis 是什么?都有哪些使用场景?

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis 使用场景:
数据高并发的读写
海量数据的读写
对扩展性要求高的数据

redis 有哪些功能?

数据缓存功能
分布式锁的功能
支持数据持久化
支持事务
支持消息队列

Redis 的数据类型?

答:Redis 支持五种数据类型:string(字符串),hash(哈希),list(列表),
set(集合)及 zsetsorted set:有序集合)。

一个字符串类型的值能存储最大容量是多少?

答:512M

redis 为什么是单线程的?

因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。
既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。
关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。
而且单线程并不代表就慢 nginx 和 nodejs 也都是高性能单线程的代表。

什么是缓存穿透?怎么解决?

缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,
查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决方案:最简单粗暴的方法如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),
我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

redis 持久化有几种方式?

Redis 的持久化有两种方式,或者说有两种策略:
RDB(Redis Database):指定的时间间隔能对你的数据进行快照存储。
AOF(Append Only File):每一个收到的写命令都通过write函数追加到文件中。

redis 怎么实现分布式锁?

Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,
占用成功了就可以继续执行,失败了就只能放弃或稍后重试。
占坑一般使用 setnx(set if not exists)指令,只允许被一个程序占有,使用完调用 del 释放锁。

redis 分布式锁有什么缺陷?

Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,
程序的执行如果超出了锁的超时时间就会出现问题。

redis 如何做内存优化?

尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,
所以你应该尽可能的将你的数据模型抽象到一个散列表里面。
比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,
而是应该把这个用户的所有信息存储到一张散列表里面。

redis 常见的性能问题有哪些?该如何解决?

主服务器写内存快照,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,
会间断性暂停服务,所以主服务器最好不要写内存快照。
Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,主从库最好在同一个局域网内。

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值