mysql常见问题

1、什么是索引,有哪些优点,缺点。
—— 索引是帮助MySQL高效获取数据的数据结构。
—— 优点:(1)提高数据查询效率减小数据库IO。(2)通过索引排序,降低CPU消耗。
—— 缺点:(1)索引需要占用存储空间。(2)降低了表的更新速度,需要额外的维护索引信息。
2、索引分类?
—— 应用层:主键索引、普通索引,唯一索引,复合索引。
—— 存储结构:B+Tree(适合范围查询)、Hash(适合=、in、<> 查询)。
3、B+Tree有哪些优势?
—— 除了叶子节点外,其他节点只存储key信息与指针。叶子节点存储了该链上的所有key与data;
—— mysql在b+tree的基础上进行了修改,增加了相邻节点的链表指针。加快了范围查询速度;
4、索引的设计原则?
—— 对查询频率高,数据量比较大的表建立索引
—— 对索引列的选择,应根据where,group以及order by条件进行选择。
—— 能使用唯一索引的使用唯一索引。
—— 尽量使用短索引,提高索引的I/O访问效率。
—— 利用左前缀原则建立合适的复合索引。
5、哪些场景下索引失效?
—— 违反左前缀原则
—— 在索引列上使用函数运算
—— 字符串不加引号 (MySQL的查询优化器,会自动的进行类型转换,造成索引失效。)
—— 避免使用select*,尽量使用覆盖索引 (查询的所有数据列全部在索引中,mysql将直接从索引中返回数据,而不用再通过回表查询数据)
—— 使用or为查询条件时候 or的两边必须都是索引的时才生效
—— 使用like % 模糊匹配会导致索引失效。(解决办法使用覆盖索引解决)
—— is null, is not null 可能会导致索引失效
—— not in 导致索引失效
—— 当mysql认为全表扫描查询更快的时候会放弃使用索引。
        ——(1)name设置索引  name="aa"为条件进行select * 查询,如果查询数据大量为name="aa"的数据,那么走全表扫描
        ——(2)is null, is not null, 类似,主要是看匹配的记录数中“条件”所占的比重
6、开发中如何定位sql问题?
—— 使用explain/desc 分析sql执行计划
—— 通过慢查询日志定位到查询较慢的sql(--log-slow-queries、long_query_time)
—— 使用show processlist命令查询当前msyql实时执行情况。
—— 使用show profile 分析sql语句具体耗时在哪一环节
—— 使用trace工具分析sql的执行计划
7、常见的存储引擎?
—— innodb: 支持事务、行锁、表锁、外键特性。
—— myisam: 支持表锁,具有更快的查询速度,不支持事务。
—— memory: 数据存储在内存中,数据访问速度快,服务关闭后数据会丢失。
—— merge: 是一组结构完全相同的myisam表的组合,merge表本身不存储数据。

innodb与myisam的不同?
    —— innodb支持行锁,myisam只支持表锁
    —— myisam查询上速度上比innodb快()
    —— innodb支持外键
    —— innodb支持事务
8、mysql事务四大特性?
—— 原子性:事务的一系列操作为一个整体。
—— 一致性:事务操作前后,数据库中的数据没有变化。
—— 隔离性:事务的操作是之间是隔离的。
—— 持久性:事务一旦提交,对表中数据的修改是永久性的。

mysql事务的隔离级别?
—— 读未提交    
—— 不可重复度  
—— 可重复读
—— 串行化
9、并发事务带来的问题?
—— 丢失更新 :后面的事务更新覆盖了前面事务的更新
—— 脏读 :事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
—— 不可重复读取: 事务中前后两次读取的数据不一致
—— 幻读:事务中第二次相同条件读取数据时候,有新的满足条件的数据被插入

”脏读“与”不可重复读“的区别?
脏读读取的数据被其他事务回滚的,没有被永久改变。不可重复读数据被永久改变。
10、死锁是怎样产生的,如何避免死锁?

死锁是由于在处理业务逻辑时,使用了不同顺序对记录进行加锁,导致事务相互等待的,没有外力干预的情况下无发停止的现象。

11、mysql主从复制的原理?

连接

12、mysql主从复制如何保障数据的一致性,与完整性?

地址

13、服务器宕机后,重新启动slave同步出错的原因?如何恢复数据同步?

地址

14、如何进行数据分页来处理传统分页带来的问题

传统分页通过mysql的limit进行分页,如果获取了第一页的数据5条,在获取第二页数据之前表中新增了5条,那么此时获取的5条数据与第一页是重复的。

一般通过设置自增id或者时间等其他排序字段进行分页,第一次我先获取5条数据,第二次会第一页的最后一条数据的id5传到后端,后端通过id<id5 查询出第二页数据,以此类推。时间的话要精确地毫秒

15、千万级别大表数据过多导致分页越往后查询速度越慢问题

解决办法:通过子查询解决,第一次查询出主键id列,外层再通过子查询的id列进行查询命中索引,从而提高查询速度

select ...... from table_a where id in(select id from table_a where ..... order by ...);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值