现在有张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 购买电影票。我们简化一点,这个业务需要涉及到以下操作:

    1. 从顾客 A 账户余额中扣除电影票价;
    2. 给影院 B 的账户余额增加这张电影票价;
    3. 记录一条交易日志。

    也就是说,要完成这个交易,我们需要 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先后拿到了间隙锁,分别插入,但是又因为都有间隙锁,彼此的插入意向锁被排斥,都在等待对方释放间隙锁。