1. 数据库如何设计权限表?
rbac设计(基于角色的访问控制):是一种常见的权限管理模型,它通过将权限分配给角色,然后将角色分配给用户,来控制用户对资源的访问。通常包括以下组件:用户、权限、角色、资源。
通过将这些组件映射成为各种表,通过改变表的内容来改变权限
2. Mysql如何分库分表
MySQL的分库分表主要依赖于应用程序或者中间件来实现,常见的中间件有ShardingSphere、MyCat等。以下是一些常见的分库分表策略:
垂直拆分:垂直拆分是按照表的列进行拆分,将一张表的某些列(通常是访问频率较低的列)拆分到另一张表中。这种方式可以减少I/O,提高性能。
水平拆分:水平拆分是按照表的行进行拆分,将一张表的数据分散到多个表(或者多个数据库)中。这种方式可以处理更大的数据量。
基于范围的分库分表:这种方式是按照某个字段的范围进行分库分表,例如按照用户ID的范围进行分库分表。这种方式的优点是查询效率高,缺点是数据分布不均匀可能导致某些库或表的压力过大。
基于哈希的分库分表:这种方式是按照某个字段的哈希值进行分库分表,例如按照用户ID的哈希值进行分库分表。这种方式的优点是数据分布均匀,缺点是范围查询效率低。
基于取模的分库分表:这种方式是按照某个字段的取模值进行分库分表,例如按照用户ID的取模值进行分库分表。这种方式的优点和缺点与基于哈希的分库分表相同。
分库分表后,对数据库的查询也需要进行相应的调整。对于单表查询,需要根据分库分表的策略计算出数据所在的库和表,然后在对应的库和表中进行查询。对于跨表查询,需要在应用程序中进行多次查询并合并结果,或者使用中间件提供的跨库查询功能。
分库分表可以提高数据库的性能和扩展性,但也会增加应用程序的复杂性。因此,在决定是否进行分库分表时,需要根据应用程序的具体需求进行权衡。
3. MySQL为什么要分库分表?
性能问题:随着数据量的上升,单个库或者表的读写操作效率很低,分库分表可以将数据和请求分散到多个数据库或者表,提高并发处理能力。
存储问题:单个数据库存储的容量是有限的。
高可用:如果都存到一个库或者表,任何影响该表的问题都会导致整个系统不可用。
4. MySQL索引为什么快?
B+Tree提供快速查找功能,时间复杂度O(logn)
5. 什么是慢查询?慢查询的优化方式是什么?
慢查询是指执行时间超过一定阈值(例如1秒)的查询。MySQL提供了一个慢查询日志功能,可以记录所有执行时间超过指定阈值的SQL语句。这个功能对于发现和优化数据库性能问题非常有用。
分库分表、查询缓存、建立索引、优化查询语句
6. 介绍一下B+树和B树的区别?
数据存储位置不同:B树的每个节点包含键和数据,而B+树的叶子节点才存储数据。这使得B+树在数据访问上更加高效,因为在找到具体的叶子节点之前,不需要做任何数据的比较。
叶子节点的链接不同:B树的叶子节点是独立的,没有链接到其他节点;B+树的叶子节点通过指针链接在一起,形成一个链表结构。
磁盘IO和空间利用:由于B+树的内部节点不存储数据,它可以在同样的空间中存储更多的键,从而有更高的分支因子,使得树的高度更低,对磁盘的I/O操作更少。
7. 如果让你自己设计一些索引,你会遵循什么原则?
设计数据库索引时,需要考虑许多因素以优化查询性能,同时避免不必要的开销。
在查询频繁的列上创建
避免过度索引
8. 索引可能会失效吗?具体什么情况会失效?
查询条件使用非等值查询
在索引列上使用函数
数据类型不匹配:比如整数列上建立了索引,但是where一个字符串
Like查询使用通配符
9. 索引优化有什么办法?
对索引定期维护和重组
监控索引性能,哪些被频繁使用?哪些很久没用?
10. 解释一下排他锁、共享锁、乐观锁、悲观锁、间隙锁?
排他锁(Exclusive Lock):也被称为写锁。当一个事务对数据加上排他锁时,其他任何事务都不能再对这个数据加上其他任何类型的锁。
共享锁(Shared Lock):也被称为读锁。当一个事务对数据加上共享锁时,其他事务可以对同一数据加上共享锁,但不能加上排他锁。也就是说,多个事务可以同时读取(共享)被共享锁锁定的数据,但不能修改它。在MySQL的InnoDB存储引擎中,普通的SELECT语句会使用共享锁。
乐观锁(Optimistic Lock):乐观锁假设数据通常不会造成冲突,所以在数据进行提交更新时才会真正进行锁定,因此冲突的可能性很小。一般通过版本号机制实现。
悲观锁(Pessimistic Lock):悲观锁假设数据很可能会造成冲突,所以在数据操作前就会先加锁,以确保数据操作的独占性。这样做虽然可以确保数据的一致性,但可能会降低并发性能。
间隙锁(Gap Lock):间隙锁是MySQL中InnoDB存储引擎的一个特性,它锁定的是两个索引记录之间的间隙,间隙锁的主要目的是防止幻读(在一个事务内多次执行相同的查询,但由于其他事务的插入操作,导致每次返回的结果不一致)。
11. 解释一下脏读、幻读、不可重复读?如何避免?
脏读:事务A修改了一条数据,然后事务B读取了这条数据,但是事务A最后决定回滚操作,这样事务B读取的数据就是不正确的,这种情况就叫做脏读。
幻读:在一个事务内多次执行相同的查询,但由于其他事务的插入操作,导致每次返回的结果不一致。
不可重复读:一个事务内多次读取同一数据,在事务未结束时,由于其他事务的修改导致后续读取的数据和最初读取的数据不一致。
避免这些要设置隔离级别:
读未提交(Read Uncommitted):这是最低的隔离级别,任何事务都可以读取到其他事务未提交的修改,可能导致脏读、不可重复读和幻读。
读已提交(Read Committed):这是大多数数据库系统的默认隔离级别(例如Oracle和PostgreSQL)。在这个隔离级别下,一个事务只能读取到其他事务已经提交的修改,可以避免脏读,但仍然可能导致不可重复读和幻读。
可重复读(Repeatable Read):在这个隔离级别下,一个事务在整个过程中看到的数据是一致的,可以避免脏读和不可重复读,但仍然可能导致幻读。这是MySQL的默认隔离级别
串行化(Serializable):这是最高的隔离级别,事务串行化顺序执行,可以避免脏读、不可重复读和幻读,但性能最低。
12. 什么是数据库事务?
数据库事务(Transaction)是数据库管理系统执行过程中的一个逻辑单位,由一条或多条SQL语句组成。事务是一个原子性的工作单元,也就是说,它要么被完全执行,要么完全不执行。事务的主要目的是为了保证数据库操作的一致性。
原子性(Atomicity):原子性意味着事务是一个不可分割的工作单位,事务中包含的操作要么全部成功,要么全部失败回滚,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(Consistency):一致性保证事务必须使数据库从一个一致性状态转变到另一个一致性状态。一致性与业务规则有关,比如在银行转账的例子中,无论转账是否成功,转账的源账户和目标账户的总额应该是不变的。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。隔离性保证每个事务在一个独立的“事务空间”中执行,这意味着事务从开始到结束,对其他事务是不可见的。
持久性(Durability):持久性是指一旦事务提交(Commit),其结果就是永久性的,即使系统发生故障也不会丢失。
13. 什么是聚簇索引和非聚簇索引?
聚簇索引(Clustered Index):在一个表中,可以有一个聚簇索引。这种索引的特点是它会改变数据行的物理存储顺序,使之与键值的逻辑(索引)顺序相同。也就是说,一个聚簇索引将数据存储在连续的块中,这些块的顺序由索引键的值决定。在查找特定值时,聚簇索引可以快速找到对应的数据块,然后在块中搜索具体的数据行。因为数据行本身就是按照聚簇索引的顺序存储的,所以聚簇索引通常可以提供最高的数据检索性能。
非聚簇索引(Non-Clustered Index):在一个表中,可以有多个非聚簇索引。非聚簇索引与聚簇索引的主要区别在于,非聚簇索引并不改变数据行的物理存储顺序。它维护一种单独的数据结构(通常是B-tree),这个数据结构存储了索引键的值,以及指向表中每个数据行的指针。在查找特定值时,非聚簇索引首先在索引的数据结构中查找,然后使用找到的指针去访问表中的具体数据行。
评论