关于MySQL

具有MySQL索引优化、查询优化和存储优化经验;
具有缓存使用经验,熟悉Redis各种数据结构的使用场景;
有分布式、集群、高并发、高负载、高可用系统

使用MySQL

如何设计web数据库?

使用关系数据库代替普通文件有哪些优点?

关系数据库专门的内置机制是怎么处理并发访问的?

什么是关系数据库?

web数据库的设计和架构是什么?

什么是建模?要考虑什么?

如何避免空间的浪费?

如何确定所获取的数据是最新的?什么是修改不规则?什么是删除不规则?

什么是原子列值?

数据库里面的空值会占用空间么?如何避免浪费空间?

用户在浏览器上查看信息的一个流程?主要历经了哪几个?

如何提高数据库性能?

登录MySQL的指令是什么?远程如何登录?

什么是MySQL权限系统?

最少权限原则是啥?

MySQL提供多个表类型和存储引擎,其中包括一些食物安全的类型这些都是什么??myisam是什么?为什么要用这种存储引擎?什么是存储引擎?

什么是索引?怎样创建索引?

char和varchar的区别?

text和blob的区别?

set和enum的区别?

有哪些常见的数据库系统?他们之间有什么区别?

笛卡尔积是什么?

左关联是干嘛的?

MySQL中的关联类型?

如何分组和合计数据?

如何进行子查询?有没有同等作用的查询sql?哪个效率更高?

子查询的操作符有哪些?

用alter如何对表进行修改?

MySQL

CRUD

JOIN、LEFT JOIN 、RIGHT JOIN、INNER JOIN

UNION

GROUP BY + COUNT + WHERE 组合案例

常用 MySQL 函数,如:now()、md5()、concat()、uuid()等

1:1、1:n、n:n 各自适用场景

了解触发器是什么,说个使用场景

数据库优化手段

索引、联合索引(命中条件)

分库分表(水平分表、垂直分表)

分区

会使用 explain 分析 SQL 性能问题,了解各参数含义

重点理解 type、rows、key

Slow Log(有什么用,什么时候需要)

MSSQL(了解)

  • 查询最新5条数据

NOSQL

  • Redis、Memcached、MongoDB
  • 对比、适用场景(可从以下维度进行对比)
  • 持久化
  • 支持多钟数据类型
  • 可利用 CPU 多核心
  • 内存淘汰机制
  • 集群 Cluster
  • 支持 SQL
  • 性能对比
  • 支持事务
  • 应用场景
  • 你之前为了解决什么问题使用的什么,为什么选它?

mysql架构

什么是嵌入式应用?什么是数据仓库?什么是内容索引?什么是分发软件?什么是高可用的冗余系统?什么是联机事务处理系统(OLTP)?

MySQL的存储引擎架构是什么?为什么它可以将查询处理和各类服务器任务与数据的存储/提取相分离?

这种分离特性有啥用?怎么满足的?

服务器是怎样缓存线程的??

安全套接层方式(SSL)是什么方式的连接?

服务器如何验证该客户端是否有权限执行某个具体查询?

什么是优化器?

服务器如何“询问”查询缓存?

缓存是存放在哪里的?

并发控制问题是怎么产生的?

MySQL如何处理并发读取程序?

MySQL如何处理并发写入程序?

什么是读锁?什么是写锁?

什么是事务?

如何回滚事务?

什么是ACID测试?如何确保ACID特性的实现?

什么是幻读问题?什么是脏读?如何解决?

什么是锁竞争?

什么是对最易回滚事务的最大估算?

什么是预写式日志?

事务日志是什么?记录在哪里?为什么速度很快?

什么是活动事务?

非事务型有哪些?特点是什么?

什么叫显式的开始一个事务?

啥是数据定义语言(DDL)命令?

什么是alter table命令?

lock tables是干嘛的?

MySQL中如何设置隔离级?

ANSI标准隔离级是什么?

怎样在事务中混合使用存储引擎?

如果混合使用事务性表和非事务性表(如InnoDB和MyISAM表),假如事务处理一切顺利,结果也会正常,但是如果事务要回滚,那么在非事务性表上做的修改将无法取消,这将导致数据库处于数据不一致的状态,在这种状态下,很难讲数据进行恢复,并且事务会变得很悬。所以为每个表选择正确的存储引擎很重要!那么如何为每个表选择正确的存储引擎呢?

如果在一个非事务性表上进行事务性操作,MySQL通常不会给出警告或者报错信息,有时回滚任务会产生一个警告信息“some nontransactional changed tables couldn’t be rolled back”,但是大多数情况下,操作一个非事务性表不会得到任何提示。

如何自动提交事务?

什么是隐式锁定?

什么是显式锁定?

一个应用从myisam引擎转换到innoDB引擎后,仍然在使用lock tables命令,而这实际是没必要的,因为innoDB已经可以实现行级加锁,为什么这种命令还会引起服务器的性能问题?

LOCKTABLES命令与事务处理之间的交互作用,是比较复杂的,在某些服务器版本上可能会导致产生一些不可预料的行为。因此建议,除非是在一个事务中使用lock tables,同事autocommit模式是被禁止的,否则,无论是赢何种存储引擎,都不要使用lock tables。

多版本并发控制,是怎样和行加锁机制关联使用的?

如何改变myisam表上的指针大小?(调高或者调低)

sql语句中类型ser_agent varchar(255) not null,为什么是255 ?代表啥意思?

为什么有些语言能对性能分析有内嵌的支持功能?怎么做到的?

性能分析

示例

假设,对于来自中心电话交换机的所有电话呼叫,都要使用MySQL进行实时数据记录(Logging),或者,Apache中已经安装了mod_log_sql模块,可以将web站点的所有访问信息直接记录到表中,那么在这类应用中,速度可能是最重要的设计指标,没人希望数据库因此陷入瓶颈状态,MYISAM引擎和Archive引擎非常适合这类应用,因为他们消耗的系统开销很小,并且支持每秒钟高达数千条记录的插入,另外,PBXT存储引擎可能也很适合这种数据记录应用。

事情看起来可能很简单,不过,如果还要运行报告程序,对记录的数据进行汇总,那么基于这种查询,报告程序可能需要提取大量数据,而这将严重减缓数据记录的插入处理。如果出现这种情况,那该怎么办?

一种解决办法是使用MySQL内置的复制特性,将相关数据克隆岛第二台服务器(从服务器)上,再从服务器上运行那些对时间或CPU要求苛刻的程序,这可以将主服务器腾出手来,继续完成数据插入,同时,从服务器上运行任何查询,都不必担心影响实时的数据记录。

当然,也可以选择在系统低负载阶段,运行相关查询,不过随着应用规模的不断增长,这种策略是不可靠的,无法确保应用稳定运行。

另一个选择是使用合并表。调整应用,不是将所有的数据记录在同一张表里,而是将数据记录在不同表中,表名可以按照年份,原表名和月份区分,例如Web_logs_2008_01然后定义一个合并表,用于相关查询,合并表中包含了需汇总的所有数据。如果要按日或按周进行汇总,策略也是相同的,只需创建含有特定名称的表即可。在这种设计里,汇总程序可以在那些不再需要进行写操作的表上,运行相关汇总查询,而对于当前表中,可以继续不中断的实时记录数据。