原文地址:MySQL面试常见题目(一)
1、MySQL使用过程中遇到过死锁问题吗?如何解决的?
操作步骤如下:
-
通过【show engine innodb status;】指令查看死锁日志。
-
找出死锁SQL。
-
分析SQL加锁情况。
-
模拟死锁案发。
-
分析死锁日志。
-
分析死锁结果。
2、日常工作中是怎么优化SQL的?
可从如下几个方面来聊:
-
加索引,提高查询速度。
-
避免返回不必要的数据,减少数据量。
-
适当分批量进行查询,减少单次查询压力。
-
优化sql结构,使得查询更加合理。
-
分库分表。
-
读写分离。
3、分库分表方案?
大体如下几个方面:
-
水平分库:以字段为依据,按照⼀定策略(hash、range等),将⼀个库中的数据拆分到多个库中。
-
水平分表:以字段为依据,按照⼀定策略(hash、range等),将⼀个表中的数据拆分到多个表中。
-
垂直分库:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。
-
垂直分表:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。
4、常用分库分表中间件?
-
sharding-jdbc(当当)
-
Mycat
-
TDDL(淘宝)
-
Oceanus(58同城数据库中间件)
-
vitess(Google 开发的数据库中间件)
-
Atlas(Qihoo 360
5、分库分表可能遇到的问题?
-
事务问题:用分布式事务解决。
-
跨节点join的问题:分两次查询解决。
-
跨节点的count,order by,group by以及聚合函数问题:分别在各个节点上得到结果后在应⽤程序端进行合并。
-
数据迁移,容量规划,扩容等问题。
-
ID问题:数据库切分后,不再依赖数据库自身的主键生成机制,可考虑UUID。
-
跨分片的排序分页问题(后台加大pagesize处理)。
6、 InnoDB与MyISAM的区别?
-
InnoDB支持事务,MyISAM不支持事务。
-
InnoDB支持外键,MyISAM不支持外键。
-
InnoDB支持 MVCC(多版本并发控制),MyISAM则不支持。
-
select count(*) from table 时,MyISAM更快,因为它有个变量保存整个表的总行数,可直接读取,InnoDB需全表扫描。
-
Innodb不支持(5.7后支持)全文索引,MyISAM支持全文索引。
-
InnoDB支持表、行级锁,MyISAM支持表级锁。
-
InnoDB表必须有主键,MyISAM可以没有主键。
-
Innodb表需要更多的内存和存储,MyISAM可被压缩,存储空间较小。
-
Innodb按主键大小有序插⼊,MyISAM记录插⼊顺序是按记录插⼊顺序保存。
-
InnoDB提供了具有提交、回滚、崩溃恢复能力的事务安全,与MyISAM比InnoDB写效率差,且会占用更多的磁盘空间以保留数据和索引。
-
InnoDB 属于索引组织表,使用共享表空间和多表空间储存数据。
-
MyISAM用 .frm 、 .MYD 、 .MTI来储存表定义,数据和索引。
7、分页查询limit偏移量过大如何解决?
方案一:如果id是连续的,可返回上次查询的最大记录(偏移量),之后再往下limit。
如下:
select id,name from employee where id>1000000 limit 10
方案二:在业务允许的情况下限制页数,因为绝大多数⽤户都不会往后翻太多。
方案三:order by + 索引(ID为索引)。
如下:
select id,name from employee order by id limit 1000000,10
SELECT a.* FROM employee a, (select id from employee where 条件 LIMIT 1000000,10 ) b where a.id=b.id
方案四:用延迟关联或者子查询优化过多分页场景,可先快速定位需要获取的id段,然后再关联。
至此,本次分享就结束了,后期会慢慢补充的。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
扫码关注公众号,获取更多优质内容。