现在有张user表,字段包含id、name、age、serial_no(身份证号码)、性别等字段,
1.现在需要根据serial_no查询name,sql怎么写并且你的索引怎么设计,为什么这么设计?
sql: select name from user where serial_no = xxx
索引建立最常规的肯定是建serial_no为普通索引,但是存在回表的问题;建立index(serial_no, name)覆盖索引避免回表;
2.还是根据serial_no查询,从提高查询效率和节约索引存储成本的前提下,你会怎么设计表和数据存储?
身份证号前面其实重复度特别高,索引效率低,那么反着存,18位身份证,我们做部分索引varchar(10)比如,节约空间且不影响查询效率
数据库监控怎么做?
从服务状态和服务质量两个方面来阐述。
服务状态的监控可以用外部系统来实现
1.定时select 1
2.为了避免无法检测线程爆满的情况,select x from t
3.为了避免无法检测innodb磁盘满的情况下,可以用update tmp set x=timestamp where id = trix
4.如果是集群,双M情况下,为了避免数据同步的问题,分别update各自行)
服务质量的监控通过mysql内部日志/接口实现,获取响应时间来统计
假设你负责实现一个电影票在线交易业务,顾客 A 要在影院 B 购买电影票。我们简化一点,这个业务需要涉及到以下操作:
- 从顾客 A 账户余额中扣除电影票价;
- 给影院 B 的账户余额增加这张电影票价;
- 记录一条交易日志。
也就是说,要完成这个交易,我们需要 update 两条记录,并 insert 一条记录。当然,为了保证交易的原子性,我们要把这三个操作放在一个事务中。那么,你会怎样安排这三个语句在事务中的顺序呢?
如果这个影院做活动,可以低价预售一年内所有的电影票,而且这个活动只做一天。于是在活动时间开始的时候,你的 MySQL 就挂了。你登上服务器一看,CPU 消耗接近 100%,但整个数据库每秒就执行不到 100 个事务。这是什么原因呢?
如果你要删除一个表里面的前 10000 行数据,有以下三种方法可以做到:
- 第一种,直接执行 delete from T limit 10000;
- 第二种,在一个连接中循环执行 20 次 delete from T limit 500;
- 第三种,在 20 个连接中同时执行 delete from T limit 500。
并发的on duplicate key 死锁产生原因?
间隙锁之间是不互斥的,但是间隙锁和插入意向锁之间是互斥的。根据二段锁协议,访问到的对象才加锁,所以两个session可能影响的数据范围有重合,重合段两个session先后拿到了间隙锁,分别插入,但是又因为都有间隙锁,彼此的插入意向锁被排斥,都在等待对方释放间隙锁。