数据库

常见的关系型数据库管理系统产品有?
答:Oracle、SQL Server、MySQL、Sybase、DB2、Access等。

SQL语言包括哪几部分?每部分都有哪些操作关键字?
数据定义语言(DDL: Data Definition Language):Create Table,Alter Table,Drop Table, Craete/Drop Index等
数据操纵语言(DML: Data Manipulation Language):Select ,insert,update,delete,
数据控制语言(DCL: Data Control Language):grant,revoke
数据查询语言(DQL: Data Query Language):select

什么是事务?
事务(Transaction)是一系列的数据库操作,是数据库应用的基本逻辑单位。这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

数据库事务的四个特性及含义
(1) 原子性:整个事务中的所有操作,要么全部完成,要么全部不完成。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
(2)  一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
(3) 隔离性:在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务。
(4) 持久性:事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

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

存储过程是一些预编译的SQL语句,只需创建一次,就可以在程序中多次调用。优点:
(1) 存储过程是一个预编译的代码块,执行效率比较高
(1) 一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率
(1)  可以一定程度上确保数据安全

什么是视图?以及视图的使用场景有哪些?
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

视图的优点
(1) 视图能够简化用户的操作
(2) 视图使用户能以多种角度看待同一数据;
(3) 视图为数据库提供了一定程度的逻辑独立性;
(4) 视图能够对机密数据提供安全保护。

索引

索引是对数据库表中一或多个列的值进行排序的结构,数据库的搜索引擎可以利用它加速对数据的检索。索引允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。

为什么使用数据索引能提高效率
(1) 数据索引的存储是有序的
(2) 在有序的情况下,通过索引查询一个数据是无需遍历索引记录的
(3) 极端情况下,数据索引的查询效率为二分法查询效率,趋近于 log2(N)

索引的优点
(1) 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
(2) 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
(3) 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

索引的缺点
(1) 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
(2) 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
(3) 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

什么情况下应不建或少建索引
1、表记录太少
2、经常插入、删除、修改的表
3、数据重复且分布平均的表字段,例如一个字段A只有T和F两种值,那么对A字段建索引一般不会提高数据库的查询速度。
4、经常和主字段一块查询但主字段索引值比较多的表字段

数据库几个基本的索引类型
唯一索引,主键索引,聚集索引,非聚集索引。

聚簇索引和非聚簇索引
聚簇索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序。
非聚集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。
(1) 使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。
(2) 非聚集索引在查询的时候可以的话就避免二次查询,这样性能会大幅提升。
(3) 不是所有的表都适合建立索引,只有数据量大表才适合建立索引,且建立在选择性高的列上面性能会更好。

B+树索引和哈希索引的区别
B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接,是有序的
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可,是无序的。如果大量重复键值时,哈希索引的效率很低,因为存在所谓的哈希碰撞问题。

哈希索引不适用的场景
1、不支持范围查询
2、不支持索引完成排序
3、不支持联合索引的最左前缀匹配规则

表分页查询

select top @pageSize *
from (
    select row_number() over(order by id asc) as row,* from dbo.data
) tmp where row > ((@pageIndex-1) * @pageSize);

表分区
表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。

表分区与分表的区别
分表:指的是通过一定规则,将一张表分解成多张不同的表。比如将用户订单记录根据时间成多个表。
分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表。

表分区的好处
1、分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。 2. 和单个磁盘或者文件系统相比,可以存储更多数据
2、优化查询。在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。
3、分区表更容易维护。例如:想批量删除大量数据可以清除整个分区。
4、可以使用分区表来避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问,ext3问价你系统的inode锁竞争等。

说一说三个范式
第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如 果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段 → 非关键字段 x → 非关键字段y

数据库的优化
1.从结构层: web服务器采用负载均衡服务器,mysql服务器采用主从复制,读写分离
2.从储存层: 采用合适的存储引擎,采用三范式
3.从设计层: 采用分区分表,索引,表的字段采用合适的字段属性,适当的采用逆范式,开启mysql缓存
4.sql语句层:结果一样的情况下,采用效率高,速度快节省资源的sql语句执行

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

MySQL优化
1、开启查询缓存,优化查询
2、explain你的select查询,这可以帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的
3、当只要一行数据时使用limit 1,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据
4、为搜索字段建索引,索引最好建立在唯一和非空的字段上,建立太多的索引对后期插入、更新都存在一定的影响(考虑实际情况来创建);
6、Prepared StatementsPrepared Statements很像存储过程,是一种运行在后台的SQL语句集合,我们可以从使用 prepared statements 获得很多好处,无论是性能问题还是安全问题。Prepared Statements 可以检查一些你绑定好的变量,这样可以保护你的程序不会受到“SQL注入式”攻击
7、垂直分表,对于大数据字段,独立表进行存储,以便影响性能
8、选择正确的存储引擎

 

---------------------
作者:zhouwei1818
来源:CSDN
原文:https://blog.csdn.net/zhouwei1818/article/details/80180872
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @   安小  阅读(195)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示