• MySql面试


    0. InnoDB与MyISAM的区别

    1)InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提
    交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
    2)InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
    3)InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。
    但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该
    过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,
    索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
    4)InnoDB支持哈希索引MyISAM不支持哈希索引
    5)Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高

    6)Innodb 是行级锁定、表级锁定,锁定力度小并发能力高。 MyISAM 是表级锁定

    7)SELECT:MyISAM更优

    8)INSERT、UPDATE、DELETE:InnoDB更优

    9)SELECT COUNT(*):MyISAM更快,因为myisam内部维护了一个计数器,可以直接调取。

    1. 并发事务带来哪些问题?

    脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提
    交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是
    还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可
    能是不正确的。
    丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数
    据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务
    内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也
    读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
    不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结
    束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务
    的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数
    据是不一样的情况,因此称为不可重复读。
    幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数
    据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会
    发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
    不可重复读和幻读区别:
    不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增
    或者删除比如多次读取一条记录发现记录增多或减少了。

    2. 说说在 MySQL 中一条查询 SQL 是如何执行的?

    1) 取得链接,使用使用到 MySQL 中的连接器。
    2) 查询缓存,key 为 SQL 语句,value 为查询结果,如果查到就直接返回。不建议使用次缓存,
    在 MySQL 8.0 版本已经将查询缓存删除,也就是说 MySQL 8.0 版本后不存在此功能。
    3) 分析器,分为词法分析和语法分析。此阶段只是做一些 SQL 解析,语法校验。所以一般语法错误在此阶段。
    4) 优化器,是在表里有多个索引的时候,决定使用哪个索引;或者一个语句中存在多表关联的时
    候(join),决定各个表的连接顺序。
    5) 执行器,通过分析器让 SQL 知道你要干啥,通过优化器知道该怎么做,于是开始执行语句。执行语句的时候还要判断是否具备此权限,没有权限就直接返回提示没有权限的错误;有权限则
    打开表,根据表的引擎定义,去使用这个引擎提供的接口,获取这个表的第一行,判断 id 是都
    等于 1。如果是,直接返回;如果不是继续调用引擎接口去下一行,重复相同的判断,直到取
    到这个表的最后一行,最后返回。

    3. 实践中如何优化 MySQL
     

    最好是按照以下顺序优化:
    1)SQL 语句及索引的优化
    2)数据库表结构的优化
    3)系统配置的优化
    4)硬件的优化


    阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结 - 爱码网

    4. SQL优化

    SQL优化:

    1)查询语句中不要使用select *,应该使用select 列名
    2)使用连接(JOIN)来代替子查询
    3)减少使用IN或者NOT IN ,使用exists,not exists,between或关联查询语句替代
    4)or 的查询尽量用 union或者union all 代替(在确认没有重复数据或者不用剔除重复数据时,union all会更好)

    5)适用联合(UNION)来代替手动创建的临时表

    6)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
    7)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
    8)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0

    9)应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描

    10)避免在 where 子句中使用 %, 下面的查询也将导致全表扫描:select id from t where name like ‘% 李%’若要提高效率,可以考虑全文检索。

    11)如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
    select id from t where num=@num --可以改为强制查询使用索引:select id from t with
    (index(索引名)) where num=@num

    12)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
    如:elect id from t where num/2=100 -- 应改为:select id from t where num=100*2
    13)应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where substring(name,1,3)=’abc’ -- name以abc开头的id应改为: select
    id from t where name like ‘abc%’
    14)不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

    15)一个复杂查询还是多个简单查询?使用尽可能小的查询是好的。(分解关联查询,让缓存的效率更高。执行单个查询可以减少锁的竞争。)

    16)避免查询不需要的数据。解决办法:使用limit解决

    17)优化关联查询:确定ON或者USING子句中是否有索引。确保GROUP BY和ORDER BY只有一个表中的列,这样MySQL才有可能使用索引
    18)优化LIMIT分页:LIMIT偏移量大的时候,查询效率较低。可以记录上次查询的 大ID,下次查询时直接根据该ID来查询

    19)增加中间表对于需要经常联合查询的表,可以建立中间表以提高查询效率。
    20)增加冗余字段设计数据表时应尽量遵循范式理论的规约,尽可能的减少冗余字段,让数据库设计看起来精致、优雅。但是,合理的加入冗余字段可以提高查询速度。
    表的规范化程度越高,表和表之间的关系越多,需要连接查询的情况也就越多,性能也就越差。

    存储过程优化:

    存储过程(特定功能的 SQL 语句集):存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

    1)尽量利用一些 sql 语句来替代一些小循环,例如聚合函数,求平均函数等。
    2)中间结果存放于临时表,加索引。
    3)少使用游标。 sql 是个集合语言,对于集合运算具有较高性能。而 cursors 是过程运算。比如对一个 100 万行的数据进行查询。游标需要读表 100 万次,而不使用游标则只需要少量几次读取。
    4)事务越短越好。 sqlserver 支持并发操作。如果事务过多过长,或者隔离级别过高,都会造成并发操作的阻塞,死锁。导致查询极慢,cpu 占用率极地。
    5)使用 try-catch 处理错误异常。
    6)查找语句尽量不要放在循环内

    5. 大表如何优化?

    (1)优化shema,优化sql,限定数据的范围

    务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们
    可以控制在一个月的范围内;

    (2)加缓存,redis

    (3)读/写分离

    经典的数据库拆分方案,主库负责写,从库负责读

    (4)垂直分区

    根据数据库里面数据表的相关性进行拆分。 例如,用户表中既有用户的登录信息又有用户的基本信息,可以将用户表拆分成两个单独的表,甚至放到单独的库做分库。
    简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。 如下图所示:

    垂直拆分的优点: 可以使得列数据变小,在查询时减少读取的Block数,减少I/O次数。此外,垂直分区可以简化表的结构,易于维护。
    垂直拆分的缺点: 主键会出现冗余,需要管理冗余列,并会引起Join操作,可以通过在应用层进行
    Join来解决。此外,垂直分区会让事务变得更加复杂;

    (5)水平分区

    保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。 水平拆分可以支撑非常大的数据量。
    水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。举个例子:我们可以将用户信息表拆分成多个用户信息表,这样就可以避免单一表数据量过大对性能造成影响。

    水平拆分可以支持非常大的数据量。需要注意的一点是:分表仅仅是解决了单一表数据过大的问
    题,但由于表的数据还是在同一台机器上,其实对于提升MySQL并发能力没有什么意义,所以水平拆分最好分库
    水平拆分能够 支持非常大的数据量存储,应用端改造也少,但 分片事务难以解决 ,跨节点Join性能较差,逻辑复杂。《Java工程师修炼之道》的作者推荐尽量不要对数据进行分片,因为拆分会带来逻辑、部署、运维的各种复杂度 ,一般的数据表在优化得当的情况下支撑千万以下的数据量是没有太大问题的。如果实在要分片,尽量选择客户端分片架构,这样可以减少一次和中间件的网络I/O。
    数据库分片的两种常见方案:
    客户端代理: 分片逻辑在应用端,封装在jar包中,通过修改或者封装JDBC层来实现。 当当网
    的 Sharding-JDBC 、阿里的TDDL是两种比较常用的实现。
    中间件代理: 在应用和数据中间加了一个代理层。分片逻辑统一维护在中间件服务中。 我们现
    在谈的 Mycat 、360的Atlas、网易的DDB等等都是这种架构的实现

    mysql - MySQL大表优化方案_个人文章 - SegmentFault 思否

    eg. 具体优化步骤:

    6. 分库分表之后,id 主键如何处理?

    因为要是分成多个表之后,每个表都是从 1 开始累加,这样是不对的,我们需要一个全局唯一的 id来支持。生成全局 id 有下面这几种方式:

    UUID:不适合作为主键,因为太长了,并且无序不可读,查询效率低。比较适合用于生成唯
    一的名字的标示比如文件的名字。
    数据库自增 id : 两台数据库分别设置不同步长,生成不重复ID的策略来实现高可用。这种方式
    生成的 id 有序,但是需要独立部署数据库实例,成本高,还会有性能瓶颈。利用 redis 生成 id : 性能比较好,灵活方便,不依赖于数据库。但是,引入了新的组件造成系统更加复杂,可用性降低,编码更加复杂,增加了系统成本。
    Twitter的snowflake算法 :Github 地址:https://github.com/twitter-archive/snowflake。
    美团的Leaf分布式ID生成系统 :Leaf 是美团开源的分布式ID生成器,能保证全局唯一性、趋
    势递增、单调递增、信息安全,里面也提到了几种分布式方案的对比,但也需要依赖关系数据
    库、Zookeeper等中间件。感觉还不错。美团技术团队的一篇文章:https://tech.meituan.co
    m/2017/04/21/mt-leaf.html 。

    7. MySQL 如何做到高可用方案?

    MySQL 高可用,意味着不能一台 MySQL 出了问题,就不能访问了。
    1) MySQL 高可用:分库分表,通过 MyCat 连接多个 MySQL
    2) MyCat 也得高可用:Haproxy,连接多个 MyCat
    3) Haproxy 也得高可用:通过 keepalived 辅助 Haproxy
     

    8. 超大分页怎么处理?

    9. 慢查询日志

    10. 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?慢查询都怎么优化过?

    11. 索引有什么优缺点?使用索引查询一定能提高查询的性能吗?为什么?

    优缺点:

    使用索引查询一定能提高查询的性能吗?为什么?

    通常,通过索引查询数据比全表扫描要快。但是我们也必须注意到它的代价。
    索引需要空间来存储,也需要定期维护,每当有记录在表中增减或索引列被修改时,索引本身也会被修改。这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5次的磁盘I/O。因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。

    使用索引查询不一定能提高查询性能,索引范围查询(INDEXRANGESCAN)适用于两种情况:
    1)基于一个范围的检索,一般查询返回结果集小于表中记录数的30%
    2)基于非唯一性索引的检索

    12. MySQL 索引类型有哪些?
     

    主键索引
    索引列中的值必须是唯一的,不允许有空值。
    普通索引
    MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值。
    唯一索引
    索引列中的值必须是唯一的,但是允许为空值。
    全文索引
    只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。字段长度比较大时,如果创建普通索引,在进行like模糊查询时效率比较低,这时可以创建全文索引。MyISAM和InnoDB中都可以使用全文索引。
    空间索引
    MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型。MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。
    前缀索引
    在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。

    其他(按照索引列数量分类)
    1. 单列索引
    2. 组合索引

    组合索引的使用,需要遵循最左前缀匹配原则(最左匹配原则)。一般情况下在条件允许的情况下使用组合索引替代多个单列索引使用。
     

    13. 创建索引的原则(重中之重)

    创建索引的原则:

    1)左前缀匹配原则,组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、
    between、like)就停止匹配,比如a=1 and b=2 and c>3 and d=4如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整;
    2)较频繁作为查询条件的字段才去创建索引;对于那些查询中很少涉及的列,重复值比较多的列不要建立索引;适合索引的列是出现在where子句中的列,或者连接子句中指定的列;
    3)更新频繁字段不适合创建索引;
    4)基数较小的类,索引效果较差,没有必要在此列建立索引;若是不能有效区分数据的列不适合做索引列(如性别,男女未知,多也就三种,区分度实在太低);取值离散大的字段:(变量各个取值之间的差异程度)的列放到联合索引的前面,可以通过count()函数查看字段的差异值,返回值越大说明字段的唯一值越多字段的离散程度高;
    5)尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可;
    6)定义有外键的数据列一定要建立索引;
    7)使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间;索引字段越小越好:数据库的数据存储以页为单位一页存储的数据越多一次IO操作获取的数据越大效率越高;对于定义为text、image和bit的数据类型的列不要建立索引;

    8)非空字段:应该指定列为NOT NULL,除非你想存储NULL。在mysql中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值;

    9)要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。

    索引失效的情况:

    1)对于like语句,以 % 或 - 开头的不会使用索引
    2)OR 语句前后没有同时使用索引
    3)数据类型出现隐式转化(如 varchar 不加单引号的话可能会自动转换为 int 型)

    14. 索引操作

    0)列出所有索引

    SHOW INDEX FROM <tablename>;

    1)创建索引

    1.1)在执行 CREATE TABLE 时创建索引

    1. CREATE TABLE user_index(
    2. id INT auto_increment PRIMARYKEY,
    3. first_name VARCHAR(16),
    4. last_name VARCHAR(16),
    5. id_card VARCHAR(18),
    6. information text,
    7. KEYname(first_name,last_name),
    8. FULLTEXTKEY(information),
    9. UNIQUEKEY(id_card)
    10. );


    1.2)使用 ALTER TABLE 命令去增加索引

    ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARYKEY索引。

    ALTER TABLE table_name ADD INDEX index_name(column_list);

    1.3)使用 CREATE INDEX 命令创建

    CREATE INDEX可对表增加普通索引或UNIQUE索引。.但不能创建PRIMARYKEY索引。

    CREATE INDEX index_name ON table_name(column_list);

    2)删除索引

    2.1)根据索引名删除普通索引、唯一索引、全文索引:altertable 表名 drop KEY 索引名

    alter table user_index drop KEY name;

    2.2)删除主键索引:alter table 表名 drop primary key(因为主键只有一个)

    alter table user_index drop primary key;

    2.3)删除大数据

    先删除索引;再删除数据;后重建索引
     

    15. 主键、超键、候选键、外键

    1)超键:在关系中能唯一标识元组的属性集称为关系模式的超键
    2)候选键:不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了
    3)主键:用户选作元组标识的一个候选键程序主键
    4)外键:如果关系模式R中属性K是其它模式的主键,那么k在模式R中称为外键

    主键为候选键的子集,候选键为超键的子集,而外键的确定是相对于主键的

    16. 前缀索引

    语法:index(field(10)),使用字段值的前10个字符建立索引,默认是使用字段的全部内容建立索引。
    前提:前缀的标识度高。比如密码就适合建立前缀索引,因为密码几乎各不相同。
    实操的难度:在于前缀截取的长度。我们可以利用

    select count(*)/count(distinctleft(password,prefixLen));,通过从调整prefixLen的值(从
    1自增)查看不同前缀长度的一个平均匹配度,接近1时就可以了(表示一个密码的前prefixLen个字符几乎能确定唯一一条记录)

    17. 什么是最左前缀原则?什么是最左匹配原则
     

    顾名思义,就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。
    最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like) 就停止匹配,比如 a=1and b=2 and c>3 and d=4 。如果建立 (a,b,c,d) 顺序的索引,d是用不到索引的,如果建立 (a,b,d,c) 的索引则都可以用到,a,b,d的顺序可以任意调整。
    =和in可以乱序,比如a=1andb=2andc=3建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
     

    18. 什么是游标

    游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录并赋给主变量,交由主语言进一步处理

    19. 什么是触发器?触发器的使用场景有哪些?
     

    触发器是用户定义在关系表上的一类由事件驱动的特殊的存储过程。触发器是指一段代码,当触发某个事件时,自动执行这些代码。
    使用场景:
    1)可以通过数据库中的相关表实现级联更改。
    2)实时监控某张表中的某个字段的更改而需要做出相应的处理。例如可以生成某些业务的编号。

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

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

    21. MySQL 中 varchar 与 char 的区别?varchar(30) 中的 30代表的涵义?

    1)varchar 与 char 的区别,char 是一种固定长度的类型,varchar 则是一种可变长度的类型。
    2)varchar(30) 中 30 的涵义最多存放 30 个字符。varchar(30) 和 (130) 存储 hello 所占空间一
    样,但后者在排序时会消耗更多内存,因为 ORDER BY col 采用 fixed_length 计算 col 长度
    (memory 引擎也一样)。
    3)对效率要求高用 char,对空间使用要求高用 varchar。

    22. int(11) 中的 11 代表什么涵义?

    int(11) 中的 11,不影响字段存储的范围,只影响展示效果。
     

    23. BLOB 和 TEXT 有什么区别?

    BLOB 是一个二进制对象,可以容纳可变数量的数据。TEXT 是一个不区分大小写的 BLOB。
    BLOB 和 TEXT 类型之间的唯一区别在于对 BLOB 值进行排序和比较时区分大小写,对 TEXT 值不区分大小写。
     

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

    NUMERIC 和 DECIMAL

    25. MySQL 有关权限的表都有哪几个?

    MySQL 服务器通过权限表来控制用户对数据库的访问,权限表存放在 MySQL 数据库里,由 MySQL_install_db 脚本初始化。这些权限表分别 user,db,table_priv,columns_priv 和 host。

    26. 列的字符串类型可以是什么?

    1)SET
    2)BLOB
    3)ENUM
    4)CHAR
    5)TEXT
     

    27. UNION与UNIONALL的区别?

    如果使用UNION ALL,不会合并重复的记录行
    效率 UNION 高于 UNION ALL

    28. drop、delete与truncate的区别

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

    因此,在不再需要一张表的时候,用drop;在想删除部分数据行时候,用 delete;在保留表而删除所有数据的时候用truncate。

    29. 主键使用自增ID还是UUID?

    30. 如果要存储用户的密码散列,应该使用什么字段进行存储?

    密码散列,盐,用户身份证号等固定长度的字符串应该使用 char 而不是 varchar 来存储,这样可以节省空间且提高检索效率。

    31. MySQL的复制原理以及流程

    32. 读写分离有哪些解决方案?

    读写分离是依赖于主从复制,而主从复制又是为读写分离服务的。因为主从复制要求slave不能写只能读(如果对slave执行写操作,那么show slave status将会呈现Slave_SQL_Running=NO,此时你需要按照前面提到的手动同步一下slave)。

    方案一:使用mysql-proxy代理
    优点:直接实现读写分离和负载均衡,不用修改代码,master和slave用一样的帐号,mysql官方不建议
    缺点:降低性能, 不支持事务

    方案二:使用AbstractRoutingDataSource+aop+annotation在dao层决定数据源

    如果采用了mybatis, 可以将读写分离放在ORM层,比如mybatis可以通过mybatis plugin拦截sql语句,所有的insert/update/delete都访问master库,所有的select 都访问salve库,这样对于dao层都是透明。 plugin实现时可以通过注解或者分析语句是读写方法来选定主从库。

    不过这样依然有一个问题, 也就是不支持事务, 所以我们还需要重写一下DataSourceTransactionManager, 将read-only的事务扔进读库, 其余的有读有写的扔进写库。

    方案三:使用AbstractRoutingDataSource+aop+annotation在service层决定数据源

    优点:可以支持事务

    缺点:类内部方法通过this.xx()方式相互调用时,aop不会进行拦截,需进行特殊处理
     

    33. MySQL记录binlog的方式主要包括三种模式?每种模式的优缺点是什么?

    34. MVCC

    35. Heap 表是什么?

    HEAP 表存在于内存中, 用于临时高速存储。Heal 表的大小可通过称为 max_heap_table_size 的 Mysql 配置变量来控制。

    1)BLOB 或 TEXT 字段是不允许的
    2)只能使用比较运算符=, <, >, =>, = <
    3)HEAP 表不支持 AUTO_INCREMENT
    4)索引不可为 NULL

    36. 在 Mysql 中 ENUM 的用法是什么?

    ENUM 是一个字符串对象, 用于指定一组预定义的值, 并可在创建表时使用。

    Create table size(name ENUM('Smail,'Medium','Large');

    37. federated 表是什么?

    federated 表, 允许访问位于其他服务器数据库上的表。
     

    38. mysql_fetch_array 和 mysql_fetch_object 的区别是什么?

    mysql_fetch_array() - 将结果行作为关联数组或来自数据库的常规数组返回。
    mysql_fetch_object - 从数据库返回结果行作为对象。

    39. 如何在 mysql 中运行批处理模式?

    以下命令用于在批处理模式下运行:
    mysql;
    mysql mysql.out

    40. mysql 有关权限的表都有哪几个?
     

    Mysql 服务器通过权限表来控制用户对数据库的访问, 权限表存放在 mysql 数据库里,
    由 mysql_install_db 脚本初始化。 这些权限表分别 user, db, table_priv, columns_priv 和
    host。

    41. MySQL 中控制内存分配的全局参数,有哪些?

    1) Keybuffersize: > * keybuffersize 指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。
    2) innodbbufferpool_size > 表示缓冲池字节大小, InnoDB 缓存表和索引数据的内存区域。
    3) querycachesize
     

  • 相关阅读:
    【(数据结构)— 单链表的实现】
    详解数据仓库之拉链表(原理、设计以及在Hive中的实现)
    PyTorch 二维多通道卷积运算方式
    【Azure 云服务】Azure Cloud Service (Extended Support) 云服务开启诊断日志插件 WAD Extension (Windows Azure Diagnostic) 无法正常工作的原因
    【无标题】
    Android触摸屏TP crah 日志 addr2line
    踩到一个关于分布式锁的非比寻常的BUG!
    超详细的VsCode创建SpringBoot项目(图文并茂)
    Qt实现厨房值班员的显示模块,如何做到时间到达0:00更新显示
    【入门Flink】- 06Flink作业提交流程【待完善】
  • 原文地址:https://blog.csdn.net/xd592319702/article/details/127933051