服务器学习心得


面试题

<h2>一个6亿的表A,一个3亿的表B查询</h2> <ul> <li> <p>通过外键 tid 关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。</p> </li> <li>如果A表 tid 是自增长,并且是连续的,B表的 ID 为索引</li> </ul> <pre><code class="language-sql">select * from A, B where A.tid = B.id and A.tid &gt; 500000 limit 200;</code></pre> <ul> <li>如果A表 tid 不是连续的,需要使用覆盖索引,tid要么是主键,要么是辅助索引,B表ID也需要有索引。</li> </ul> <pre><code class="language-sql">select * from B, (select tid from A limit 50000, 200) A where B.id = A.tid;</code></pre> <h2>MySQL的复制原理以及流程</h2> <p>1-主服务器-binlog线程(二进制日志)</p> <p>​ 记录下所有改变了数据库数据语句,放进master上的binlog中</p> <p>2-从服务器-io线程</p> <p>​ 在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log(中继日志)中;</p> <p>3-从服务器-sql执行线程</p> <p>​ 执行relay log中的语句;</p> <h2>MySQL binlog 日志种类</h2> <ul> <li> <p>Error Log(错误日志)</p> <ul> <li>记录 mysqld 的一些错误。</li> </ul> </li> <li>General Query Log(一般查询日志) <ul> <li>记录 mysqld 正在做的事情,如客户端连接和断开、来自客户端每条 Sql Statement(sql语句)记录信息。</li> </ul></li> <li>Slow Query Log(是慢查询日志) <ul> <li>记录一些查询比较慢的 SQL 语句,主要是给开发者调优用的。</li> </ul></li> <li>Binary Log(Binlog 二进制日志) <ul> <li>记录数据库上的所有改变</li> </ul></li> </ul> <h2>MySQL binlog 格式</h2> <ul> <li>基于SQL语句的复制(statement-based replication,SBR)</li> <li>基于行的复制(row-based replication,RBR)</li> <li>混合模式复制(mixed-based replication,MBR)</li> </ul> <h2>innodb 日志</h2> <ul> <li> <p>redo log(重做日志)</p> <ul> <li>提供前滚操作</li> <li>通常是物理日志,记录数据页的物理修改,而不是某一行或某几行修改成怎样怎样,</li> <li>用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。</li> </ul> </li> <li>undo log(回滚日志) <ul> <li>提供回滚操作</li> <li>一般是逻辑日志,根据每行记录进行记录</li> <li>用来回滚行记录到某个版本</li> </ul></li> </ul> <h2>MySQL数据库cpu飙升到500%的话他怎么处理?</h2> <ul> <li>列出所有进程 show processlist 观察所有进程,多秒没有状态变化的(干掉)</li> <li>查看超时日志或者错误日志</li> <li>查询以及大批量的插入会导致cpu与i/o上涨</li> <li>网络状态突然断了,导致一个请求服务器只接受到一半,比如where子句或分页子句没有发送</li> </ul>

页面列表

ITEM_HTML