java-MySQL

java-MYSQL



基础知识

SQL查询语句的完整语法

select distinct 查询字段-----去重
from 表名
JOIN 表名
ON 连接方式
where 查询条件
group by 分组字段-----分组
having 分组后条件
order by 排序条件-----排序(ASC–升序/DESC–降序)
limit 查询其起始位置,查询条数
注意:执行的时候select的执行顺序在having后面,ON在JOIN前面

drop delete truncate三者的区别

在关系型数据库中, drop, delete, truncate都是用来删除表或表中数据的操作,区别:
Drop–属于DDL语言,删除整个表并释放占用的空间,所有相关的对象(如索引,触发器等)也将被删除–不可回滚
Delete–属于DML语言,删除表中符合条件的行,但保留表结构和占用的空间,可回滚
Truncate–属于DDL语言删除整个表中的数据,但保留表结构和占用的空间.由于不记录每行删除的日志,因此执行速度相对较快-不可回滚

MySQL有几种连接查询方式

有三种连接查询,分别是内连接,左外连接和右外连接,内连接是将两张表有关联关系的数据显示出来,没有关联关系的不显示,左外连接是查询左表的全部数据,左边为驱动表,驱动表的数据全部显示,匹配表匹配的数据显示,的不匹配的不会显示,右外连接同理,查询右表的所有数据,右边为驱动表,驱动表的数据全部显示,匹配表匹配的数据显示,不匹配的不会显示

什么是组合索引?什么是最左匹配原则?

组合索引是多个字段组成的索引, 如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询 从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将会部分失效 ,例如现在有A,B,C是联合索引,进行查询的时候有ABC,AB,就能生效,如果是BC就会失效,如果是AC,A生效C失效

MySQL中常用的存储引擎有哪些?

Myisam–不支持事务,采用表锁,如果查询数据场景多,且不需要事务可选择,查询性能好
innoDB(主要)–支持事务,采用行锁,如果需要事务,或增删改较多,可选择
Memory–内存存储,速度快,不安全–底层数据结构是hash表
image.png

MySQL中varchar(50)中50的含义?

varchar(50)中的50表示该字段可以存储的最大字符数,即最大长度为50个字符。这并不意味着varchar(50)字段总是会占用50个字符的存储空间,而是表示该字段可以存储的最大长度

慢查询

MySQL中,如何定位慢查询?

有两种方式,使用开源工具和MySQL自带的慢日志,我印象中我们当时在做压测的时候有的接口比较慢,接口的响应时间已经超过了2秒,因为我们当时系统已经部署了监控系统Skywalking,在展示的报表中可以看到哪个接口比较慢,还有SQL具体的执行时间,很快就定位了是哪个SQL出现了问题. 如果没有部署监控系统,MySQL也提供了解决办法,就是慢日志查询,可以在系统配置文件中开启慢日志的功能,并且设置时间,比如设置为2秒,SQL执行超过2秒就会记录到日志文件中,我们就可以通过日志文件找到哪条SQL语句执行比较慢了(在平时为什么不开启慢日志查询呢?–因为慢日志查询需要记录日志并进行存储,会提高IO成本,造成性能损耗)

方案1–开源工具
调试工具–Arthas
运维工具–Prometheus, Skywalking
方案2–MySQL自带慢日志

那这个SQL语句执行很慢, 如何分析呢?

如果有一条SQL语句执行很慢的话,我们可以使用关键字explain去查看该语句的执行情况,在返回的结果集中可以关注key和key_len,type字段以及extra优化建议,具体来说可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,就可以判断索引是否有失效的情况,第二个就是可以通过type字段查看SQL是否有进一步的优化空间,是否存在全索引扫描或全盘扫描,最后还可以通过extra来判断是否出现了回表,如果出现了可以尝试添加索引或修改返回字段来修复

explain返回的结果集需要重点关注的字段:

  • possible_key–当前SQL可能会使用到的索引
  • key–当前SQL实际命中的索引
  • key_len索引占用的大小
  • Extra额外的优化建议
    • Using where; Using Index–查找使用了索引,需要的数据都在索引列中能找到,不需要回表查询
    • Using index condition–查找使用了索引,但是需要回表查询数据
  • type–这条SQL的连接的类型,性能好到差为
    • NULL–没有使用到表(无需关注)
    • system–查询系统中的表(用的不多)
    • const–根据主键查询
    • eq_ref–主键索引查询或唯一索引查询(只能返回一条数据)
    • ref–索引查询(多条数据)
    • range–范围查询
    • index–索引树查询(尽量避免)
    • all–全盘扫描(尽量避免)

索引

了解过索引吗?

有的,索引是帮助MySQL高效获取数据的数据结构,它能够提高数据查询的效率,能够降低数据库的IO成本,而且索引能够进行数据排序,能够降低数据库进行数据排序的成本,降低CPU的消耗

索引有哪些分类?

image.png

索引的数据结构了解过吗

MySQL默认使用的索引底层结构是B+树,选择B+树就要聊聊二叉树和B树,B树是一种多叉路平衡查找树,相对于二叉树每个结点可以有多个分支,B树的非叶子节点和叶子节点都会存储数据,然后B+树是在B树基础上进行了优化,第一点就是阶数更多,高度更低,查找数据时路径更短,当有千万条数据,B+Tree可以控制在小于等于3的高度,第二点因为B+树非叶子结点只存储索引,叶子节点存储数据,磁盘读写的代价更低,最后B+树的叶子节点是一个双向链表,便于扫库和区间查询,进行范围查询的效率更高

为什么索引底层数据结构使用B+树不使用红黑树?

红黑树是二叉树,B+树是多叉路平衡查找树,相对于二叉树每个结点可以有多个分支,当有千万条数据,红黑树的高度会非常高,查询的效率会比较低,但是B+Tree可以控制在小于等于3的高度,查询效率更高

B树和B+树的区别是什么呢?

B树是一种多叉路平衡查找树,B+树是在B树基础上进行了优化
具体的区别体现在:
第一点: 在B树中,非叶子节点和叶子节点都会存储数据,而B+树中只有叶子节点才存储数据,在进行数据查询时更加稳定
第二点: B+树的最末级叶子节点是一个双向链表,便于扫库和区间查询,进行范围查询的效率更高
B+树最末级叶子节点原本采用的是单向链表,但是MySQL进行了优化,使其变成了双向链表,能够双向遍历

介绍一下B+Tree和hash实现索引的区别?

B+树是一种有序的数据结构,适用于范围查询和有序数据访问的场景,适合于磁盘存储;而哈希表是基于散列函数的,它没有固定的排序,适用于快速的数据查找和插入操作,适合于内存存储。在选择索引实现方式时,需要根据具体的需求和场景来选择合适的数据结构

什么是聚簇索引?什么是非聚簇索引?

聚簇索引是数据与索引存储在一起,非叶子结点存储的是主键,最末级结点存储的是主键对应的完整数据,有且仅有一个
非聚簇索引(二级索引)主要是指数据与索引分开存储,最末级结点存储的是主键,可以有多个

使用MySQL一定有聚簇索引吗

不是,要看使用的存储引擎,如果是InnoDB是有聚簇索引的,但是如果使用的是Myisam,是不支持聚簇索引的,只有非聚簇索引

聚簇索引选取规则

如果存在主键,主键索引就是聚集索引
如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引
如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引

知道什么是回表查询嘛

知道的,在谈回表查询之前得先说说聚簇索引和非聚簇索引,聚簇索引是数据与索引存储在一起,非叶子结点存储的是主键,最末级结点存储的是主键对应的完整数据,有且仅有一个,非聚簇索引(二级索引)主要是指数据与索引分开存储,最末级结点存储的是主键,可以有多个,如果没有设置聚簇索引,使用非聚簇索引时会出现回表查询是指数据库在执行查询操作时,需要根据索引查找到对应的数据行,然后再根据数据行的主键值去表中查找具体的数据

非聚簇索引一定会回表查询吗?

不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询

知道什么叫覆盖索引嘛?

覆盖索引是指一个索引包含了查询语句所需要的所有字段,因此数据库引擎可以直接使用这个索引来满足查询需求,而不需要再去访问实际的数据行

使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高
如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select*

MYSQL超大分页怎么处理?

超大分页一般都是在数据量比较大的时候,一般使用limit分页查询,并对数据量进行排序,效率比较低,我们使用覆盖索引和子查询来解决,具体来说
我们先分页查询获取表中的id并且对表的id进行排序,就能筛选出分页后的id集合,因为id是覆盖索引,我们操作id的时候效率相对来说是比较高的,最后再通过id集合再到原来的表中做关联查询,效率就得到提升了

索引创建原则有哪些?

嗯,索引创建的原则有很多,首先有个前提是只有数据量比较大且查询比较频繁的表,一般是数据超过10万的表我们才会创建索引,也会选择常作为查询,排序,分组条件,区分度比较高的字段作为索引,如果一个字段比较长的话,我们也会考虑使用前缀索引,还有就是尽量使用联合索引,因为可以更好的使用覆盖索引,避免回表,当然,也不是说索引创建要越多越好,如果你的索引太多,维护成本太高,在进行增删改的时候需要维护索引的内容

  • 创建索引的前提–数据量比较大,且查询比较频繁的表

  • 选择常作为查询条件,排序,分组的字段

  • 尽量使用联合索引,因为可以更好的使用覆盖索引,避免回表

  • 要控制索引的数量,如果你的索引太多,维护成本太高,在进行增删改的时候需要维护索引的内容

  • 字段内容区分度高

  • 内容较长,使用前缀索引

  • 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它

什么情况下索引会失效?

嗯,索引失效的场景有很多,那我就说一下我遇到过的情况,首先我想说一下我们怎么判断索引失效的,可以使用explain关键字,在返回的结果集中我们需要重点关注key和key_len两个字段来判断是否命中了索引.那么有哪些情况会导致索引失效,比如第一个索引在使用的时候没有遵循最左匹配原则,第二个就是在使用模糊查询的时候,%放在最前面也会导致索引失效,第三个是索引列上进行了计算或者使用了函数,还有就是sql语句中的字段类型和数据库的字段类型不匹配会产生隐式类型转换也会导致索引失效,嗯~我们还遇到过一个就是如果使用了联合索引,中间使用了范围查询,右边的条件索引也会失效

什么是索引下推

索引下推是MySQL是一种优化查询性能的技术,它可以再执行查询时,将where子句中的非索引列条件下推到存储索引层,让存储引擎再读取索引的同时能够进行过滤,从而减少了需要读取的树行数,提高查询性能
举例来说,假设有一个包含字段 A 和字段 B 的表,对字段 A 和字段 B 分别创建了索引。如果执行的查询语句中包含了对字段 A 的条件过滤,传统的查询执行方式是先通过索引定位到符合条件的记录,然后再将这些记录返回给查询引擎层进行对字段 B 的条件过滤。而使用索引下推技术,部分对字段 B 的条件过滤可以在索引层就进行判断,将不符合条件的记录在索引层就过滤掉,减少了需要返回给查询引擎的数据量
然而,并非所有的数据库系统和存储引擎都支持索引下推技术,而且其适用的场景也需要根据具体的查询条件、索引情况和数据分布来进行合理的选择

索引是越多越好嘛?什么样的字段需要索引,什么样的字段不需要?

索引并不是多多益善,索引越多,维护索引结构的代价就越大,会影响增删改的效率
需要加索引:

  • 针对于数据量比较大且查询比较频繁的表建立索引
  • 针对常作为查询条件,排序,分组操作的字段建立索引

不需要加索引:

  • 更新频繁的字段不适合加索引
  • 不能有效区分数据的列不适合做索引列
  • 查询很少的列,重复值比较多的列不要建立索引
  • 定义为text,image和bit的数据类型的列不要建立索引

SQL优化

谈谈对sql的优化经验

  • 表的设计优化
  • 索引优化–参考索引创建原则和索引失效
  • SQL语句优化
  • 主从复制,读写分离
  • 分库分表

怎么设计数据表

规范字段–阿里巴巴规范手册: id/create_time/update_time/is_deleted
基本字段–原型
关联字段
冗余字段

表的设计优化

关于表的设计的优化我们在做项目的时候参考的是阿里开发手册<<嵩山版>>,里面有很多关于MySQL表的设计优化的内容,我们举个例子,第一个比如给字段设置合适的类型,如果是数值的话可以选择(tinyint,int,bigint),要根据实际情况选择,比如设置合适的字符串类型(char和varchar),char定长效率高,varchar可变长度,效率较低

char和varcahr的区别

1、最大长度:char最大长度是255字符,varchar最大长度是65535个字节
2、定长:char是定长的,不足的部分用隐藏空格填充,varchar是不定长的
3、空间使用:char会浪费空间,varchar会更加节省空间
4、查找效率:char查找效率会很高,varchar查找效率会更低
varchar需要计算内容占用的长度,而char不会,所以char的效率稍高一些 在项目中的使用,这两种方式都会用到,比如像一些枚举值可以选择使用char, 像一些描述信息或名字类可以选择使用varchar

你平时对sql语句做了哪些优化呢?

嗯,这个有很多,比如在select语句进行查询时务必指明字段名称,不要使用select*,另外要注意避免一些会造成索引失效的写法,
如果是聚合索引的话,尽量使用union all代替union,因为union会多一次过滤,效率较低
如果是表关联的话,尽量使用inner join,不要使用left join,right join,如果必须要使用的话,一定要以小表作为驱动

什么是小表驱动大表

小表驱动大表是一种优化查询性能的策略,通常用于关联查询中,两个表差异较大,较小的表作为驱动表,从小表中获取数据再去访问大表,可以减少查询的数量和提高查询的效率,举例来说,假设有两个表 A 和 B,表 A 的数据量很小,而表 B 的数据量很大,如果要进行 A 和 B 的关联查询,可以先从表 A 中获取符合条件的数据,然后再根据表 A 的结果集来访问表 B,以减少对表 B 的全表扫描和数据量的处理

主从复制,读写分离

如果数据库的使用场景读的操作比较多的时候,为了避免写的操作所造成的性能影响,可以采用读写分离的架构.读写分离解决的是,数据库的写入,影响了查询的效率,在生产情况下我们都会搭建主库和从库来分开读操作和写操作
image.png

读写分离的时候主从同步延时怎么解决?

首先读写分离的时候主从同步延时的产生有两个方面,第一个是MySQL的主从复制都是单线程的操作,主库对所有DDL和DML产生的日志写进binlog,由于binlog是顺序写,所以效率很高。Slave的SQLThread线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作是随机的,不是顺序的,成本高很多。所以SQL Thread线程的速度赶不上主库写binlog的速度,就会产生主从延迟,第二个是由于SQL Thread也是单线程的,当主库的并发较高时,产生的DML数量超过slave的SQL Thread所能处理的速度,或者当slave中有大型query语句产生了锁等待那么延时就产生了
解决方案有四种–强制读主库/延迟读/降低并发/并行复制
强制读主库
如果你做的是类似支付这种对实时性要求非常高的业务,那么最直接的方法就是
直接读主库,当然这种方法相当于从库做一个备份的功能了。
延迟读
就是在写入之后,等一段时间再读,Eg:写入后同步的时间是0.5s,读取的时候
可以设置1s后再读,但是这个方案主要存在的问题就是,不知道主从同步完成所
需要的时间。
降低并发
如果你理解了随机重放这个导致主从延迟的原因,那么就比较好理解了,控制主
库写入的速度,主从延迟发生的概率自然就小了。{原因:因为主库中sql可能并
发执行,可以控制并发速度}。
并行复制(推荐)
MySQL 5.6 版本后,提供了一种并行复制的方式,通过将 SQL 线程转换为多个
work 线程来进行重放,这样就解决了主从延迟的问题。

事务

什么是事务?

是一组操作的集合,是不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即操作要么同时成功,要么同时失败

事务的特性是什么?可以详细说一下吗?

可以的,事务的特性是ACID,分别指的是原子性,一致性,隔离性,持久性

  • 原子性(Atomicity)–事务是不可分割的最小操作单元,要么全部成功,要么全部失败
  • 一致性(Consistency)–事务完成时,必须使所有的数据保持一致状态
  • 隔离性(Isolation)–数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性(Durability)–事务一旦提交或回滚,它读数据库中的数据的改变是永久的

我举个例子:
A向B转账500,转账成功,A扣除500元,B增加500元,原子操作体现在要么都成功,要么都失败
在转账的过程中,数据要一致,A扣除了500,B必须增加500
在转账的过程中,隔离性体现在A向B转账,不能受其他事务干扰
在转账的过程中,持久性体现在事务提交后,要把数据持久化(可以说是落盘操作)

MySQL事务的底层实现原理?持久化原理?

MySQL事务的底层实现原理主要涉及到日志和锁机制,以及数据持久化原理,
MySQL使用日志来记录事务的操作,包括事务的开始、提交、回滚等。在事务执行过程中,会将所有的数据修改操作记录在日志中,以便在系统崩溃或故障时进行数据恢复,
MySQL还使用锁机制来保证事务的并发控制。通过锁机制,可以实现事务的隔离性,避免多个事务同时对同一数据进行修改造成数据不一致的情况
持久化原理是MySQL通过将数据写入磁盘来实现数据的持久化。在事务提交时,MySQL会将事务的日志写入到日志文件中,并将数据修改写入到磁盘中的数据文件中,以保证数据的持久化
这些机制可以保证在系统重启或崩溃后能够恢复数据的一致性和完整性,实现数据的持久化。

并发事务带来哪些问题?

在项目开发中,多个事务并发进行是时常发生的,就会导致一些问题,分别是脏读,不可重复读和幻读,也叫虚读.
第一个问题脏读是一个事务读取到了另一个事务中尚未提交的数据。这个问题是最严重的,要杜绝发生
第二个问题是不可重复读,比如在一个事务内多次读同一数据,但两次读取的数据不同。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读,这是事务update时引发的问题
最后一个是幻读(虚读),与不可重复读类似,是在一个事务内读取到了别的事务插入或者删除的数据,导致前后读取记录行数不同。这是insert或delete时引发的问题

使用的隔离级别有哪些?不同的隔离级别有什么问题?

在数据库系统中,常用的隔离级别包括以下四种:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。不同的隔离级别存在一些问题,主要涉及并发访问时可能出现的数据不一致性和性能问题

补充知识–缓冲池/数据页

缓冲池(buffer pool)–主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池中没有数据,则从磁盘加载并缓存,以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度
数据页(page)–是InnoDB存储引擎磁盘管理的最小单元,每个页的大小默认为16KB,页中存储的是行数据
image.png

事务中的隔离性是如何保证的呢?(你解释一下MVCC)

事务的隔离性是由锁和mvcc实现的
其中MVCC的意思是多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,它的底层实现主要是分为了三个部分,第一个是隐藏字段,第二个是undo log日志,第三个是readView读视图
隐藏字段是指:在mysql中给每个表都设置了隐藏字段,有一个是trx_id(事务id),记录每一次操作的事务id,是自增的;另一个字段是roll_pointer(回滚指针),指向上一个版本的事务版本记录地址
undo log主要的作用是记录回滚日志,存储老版本数据,在内部会形成一个版本链,在多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表
readView解决的是一个事务查询选择版本的问题,在内部定义了一些匹配规则和当前的一些事务id判断该访问那个版本的数据,不同的隔离级别快照读是不一样的,最终的访问的结果不一样。如果是rc隔离级别,每一次执行快照读时生成ReadView,如果是rr隔离级别仅在事务中第一次执行快照读时生成ReadView,后续复用

补充知识–当前读/快照读

  • 当前读

读取的是记录的最新版本,读取时还要保证其他事务不能修改当前记录,会对读取的记录进行加锁,对于我们日常的操作,如:
select…lock in share mode(共享锁),select…for update, update, insert, delete(排他锁)都是一种当前读

  • 快照读

简单的select(不加锁)就是快照读,读取的是 记录数据的可见版本,有可能是历史数据,不加锁是非阻塞读
Read Commit: 每次select都生成一个快照读
Repeated Read: 开启事务后第一个select语句才是快照读的地方

补充知识–ReadView中四个核心字段

m_ids–当前活跃的事务ID集合
min_trx_id–最小活跃事务ID
max_trx_id–预分配事务ID,当前最大事务ID+1(因为事务ID是自增的)
creator_trx_id–ReadView创建者的事务ID
image.png
不同的隔离级别,生成ReadView的时机不同:

  • Read commit: 在事务中每一次执行快照读时生成ReadView
  • Repeatable Read: 仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView

日志

undo log和redo log的区别

redo log日志记录的是数据页的物理变化,服务宕机可用来同步数据, ,而undo log主要记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据,比如我们删除一条数据的时候,就会在undo log日志文件中新增一条delete语句,如果发生回滚就执行逆操作
redo log保证了事务的持久性,undo log保证了事务的原子性和一致性

MySQL三大日志: redolog, undolog, binlog

redolog(重做日志)是用于MySQL数据库崩溃恢复的一种机制,它记录了在事务执行期间所做的所有修改操作,如果MySQL非正常关闭,重做日志将被用来重新执行已提交但未持久化的事务以确保数据的完整性
undolog(撤销日志)是另一种用于MySQL事务处理的机制,它记录了正在进行的事务中所做的所有修改操作.如果需要回滚一个事务,那么撤销日志将被用来撤销该事务中对数据库所作的任何更改
binlog(二进制日志)是MySQL用于记录所有修改数据库的语句的机制,包括INSERT, UPDATE, 和DELETE等操作,通过binlog可以实现数据备份,复制和恢复

MySQL主从同步原理

MySQL主从复制的核心就是二进制日志(DDL(数据定义语言)语句和 DML(数据操纵语言)语句),它的步骤是这样的:
第一:主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中
第二:从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log
第三:从库重做中继日志中的事件,将改变反映它自己的数据

了解过mysql集群吗?

了解的,mysql集群解决的是单点故障问题,可以保证服务的高可用性,可伸缩性,和负载均衡,
高可用性指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性,具体实现方式是主从复制,读写分离,就是搭建主库和从库分开读操作和写操作,主库和从库的内容是一样的,如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断,主从复制的核心就是二进制日志(DDL(数据定义语言)语句和 DML(数据操纵语言)语句),它的步骤是这样的:
第一:主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中
第二:从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log
第三:从库重做中继日志中的事件,将改变反映它自己的数据
可伸缩性就是在新增数据库是更加便利,方便扩容
负载均衡就是在切换某服务访问某节点,分摊单个节点数据库压力

分库分表

你们项目用过MySQL的分库分表吗?

用过的,当时今日指数这个项目的数据增长量太快了,而且MySQL中单表的数据量到达两千万之后性能变得极其差,所以使用了分库分表
分库分表常见的框架有Sharding-JDBC ,还有MyCat,我们使用的是Sharding-JDBC

那你之前使用过水平分库吗?

嗯,这个是使用过的,我们当时今日指数项目,一开始,我们也是单库,后来这个业务逐渐发展,业务量上来的很迅速,其中个股的表已经存放了超过1000万的数据,我们做了很多优化也不好使,性能依然很慢,所以当时就使用了水平分库。

  • 对于股票个股表按照月维度和年维护进行库表拆分
    • 一年会产生一个库用于后期数据归档,
    • 每个库下则按照月份产生12张表,对应一年的数据;
  • 对于板块表和大盘数据表,我们则以年为单位,与股票流水表年份一致即可,也就是按照年分库
  • 对于主营业务表,因为数据量较少,且查询都会用到,作为公共表处理
  • 对于系统表数据量相对较少,作为默认数据源即可

MySQL中有哪些锁?

  • 按照使用方式上:排它锁、共享锁
  • 按照加锁粒度上:全局锁、表锁、行锁
  • 按照思想上:乐观锁、悲观锁

排他锁也叫写锁,阻塞其他事务对当前对象的读写操作
共享锁也叫读锁,当对象被锁定时,允许其他事务读取该对象,也允许其他事务从该对象上获取共享锁,但是无法写入
乐观锁:认为不会出现竞争,不上锁,但是通过CAS+版本号等对数据进行确认
悲观锁:认为一定会发生竞争,对数据修改前,上排它锁

拓展

是否了解MySQL中的存储过程, 触发器, 视图

存储过程是一组预编译的SQL语句集合,类似于程序中的函数,可以被多次调用,存储过程可以接受参数、执行SQL语句、进行逻辑处理,甚至可以包含流程控制语句,可以实现复杂的业务逻辑,存储过程可以大大简化数据库操作,提高数据库的效率和安全性
触发器是一种特殊的存储过程,它在数据库中的表发生特定事件时自动执行。这些事件可以是INSERT、UPDATE、DELETE等操作,触发器可以在这些事件发生时自动执行相应的SQL语句。触发器可以用于实现数据完整性约束、审计日志、自动化业务逻辑等。在MySQL中,可以使用CREATE TRIGGER语句来创建触发器,触发器可以提高数据库的安全性和可靠性
视图是一种虚拟的表,它是由查询语句生成的,不包含实际的数据。视图可以简化复杂的查询操作,隐藏数据表的细节,提供安全性,同时也可以提高查询的性能。在MySQL中,可以使用CREATE VIEW语句来创建视图
微服务中,因为不同的业务拆分成了不同的服务和数据库,每个微服务都具有单一职责,所以微服务中,对数据库中复杂关联SQL以及存储过程,触发器,视图的使用依赖大大降低,所以这几种技术在我们的项目中并没有使用

是否了解MySQL新特性,如:窗口函数?

窗口函数是MySQL8.0版本引入的一种新特性,可以对查询结果集进行分组,排序,聚合等操作,同时还可以在结果集中按照指定的窗口范围进行计算,大大简化了复杂的查询,提高查询效率

常见的窗口函数包括:
ROW_NUMBER(): 为结果集中的行分配一个唯一的序号
RANK(): 计算结果集中每行的排名,有相同值时会出现相同排名
DENSE_RANK(): 计算结果集中每行的排名,有相同值时会跳过相同排名
SUM(), AVG(), MAX(), MIN(): 对指定的列进行求和、平均值、最大值、最小值等聚合计算,但不需要使用 GROUP BY 子句
LAG(), LEAD(): 获取结果集中当前行前面或后面的行的值
NTILE(): 将结果集分割成指定数量的桶,为每个行分配一个桶号

是否了解oracle?MySQL和oracle使用上的区别?

有的,Oracle数据库是一个对象关系数据库管理系统,要收费,MySQL和oracle使用上的区别主要体现在MySQL和Oracle支持的数据类型有一些差异,MySQL支持的数据类型包括int,varchar,text等,而Oracle支持的数据类型包括number,varchar2,clob等,还有使用的存储引擎不同,MySQL使用的存储引擎是InnoDB,MyISAM,而Oracle使用的是自己的存储引擎,另外,SQL语法有些也不同,比如在MySQL中使用limit限制查询结果的数量,而Oracle使用的是rownum,最后Oracle相对于MySQL安全性更高,Oracle提供了如访问控制,加密,审计的安全功能,但是Oracle是收费的

是否使用过国产关系型数据库?

OceanBase–阿里巴巴集团自主研发的分布式关系型数据库
GaussDB–华为自主研发的关系型数据库
TiDB–PingCAP公司自主研发的分布式关系型数据库
华为云分布式关系型数据库–基于华为云平台
人大金仓–人大金仓软件股份有限公司自主研发的关系型数据库
神州数码数据库–神州数码集团自主研发的关系型数据库
青云QingStorDB–青云自主研发的分布式关系型数据库

decimal(m,n)的含义?

m表示总共的位数,n表示小数点后的位数。这意味着decimal(m,n)可以存储m位数中的n位小数。例如,decimal(10,2)可以存储总共10位数中的2位小数,而decimal(8,0)则表示存储的是整数,总共8位数中的0位小数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值