当前位置:文档之家› MySQL DBA面试题

MySQL DBA面试题

1.请用图框的方式大致地描绘出MySQL架构体系.第一层: client ConnectorODBC、jdbc、api(C/JAVA/PERL/PYTHON/PHP)第二层:MYSQL server 模块thread connection pool/cachesql interface(DDL/ DML/ TRIGGER/ VIEW /STORE PROCEDURE/ EVENT等)sql parse & check privilegessql optimize(explian)server 统计/buffer:query cacheserver admin manager command: backup restore security replicate 等第三层:存储引擎myisam/innodb/blackhole/archive/memory/merge/NDB存储引擎是基于表第四层:存储引擎相应的文件logs file:binlog/err/general/slow.server 层维护myisam: frm/myi/mydinnodb: frm/ibd(index&data)/redo log/Undo log(5.7)2.限定MySQL5.5及以下为例,InnoDB存储引擎与MyISAM存储引擎的区别,至少写四点.MYISAM(5.5.8前) INNODB锁: 表锁行锁存储限制256TB 64TB文件类型FRM/MYD/MYI FRM/ibdata数据保存堆表索引组织表外键NO YES事务: NO YES.4种隔离级别MVCC(实现一致性非锁定读) NO YESmvcc通过读取undo段内容生成的最新快照数据# tablespace包含的内容索引缓存YES YES数据缓存NO YES查询缓存YES YES# index二级索引叶节点行地址行主键B-tree index YES YEST-tree index NO NOHash index NO NO,adaptivefulltext index YES 5.6后支持空间数据YES YES空间索引YES NO索引max长度(byte) 1000 768(1-2byte head)memcache NO 5.6后支持[在server层实现,并不是存储引擎实现的功能[/color]压缩数据支持(只读) 支持,但必须是Barracuda file format加密数据支持同步支持备份点恢复[备份]# 单表备份myisam 可以直接拷贝frm/myd/myi文件即可innodb 不能直接拷贝文件[other]表行数:innodb需要全部遍历/ MYISAM实时维护,不需要全表遍历。

auto_increment: 列上必须有索引,但innodb必须是第一列/myisam可以是任何一列# innodb-- 5.5 1.1faster add/drop second index:copy data改为inplaceinsert buffer(二级索引更新效率)double write(写安全)adaptive hash index(读效率)aio(asynchronous io)提供磁盘读效率。

一次select扫描多次索引页(IO离散读),没扫描一次索引,需要等待完成才能开始下次扫描,而异步IO可以发出IO扫描指令后,不需要等待返回结果,立即发送下一个IO扫描指令,并行进行扫描flush neighbor page(提供写效率,多个IO合为1个IO).ssd硬盘不需要开启-- 5.6 1.2memcachefulltext#myisam单表最多2^63行每个索引最多16个列每个表最多64个索引支持并发插入concurrent inserts可以结合merge引擎,将多个表组合为1个表3.MySQL中控制内存分配的全局参数,有哪些?(注:至少写6个以上)binlog_cache_size:Global,5.9之后只是针对事务语句的cache,大事务需要增加此值binlog_stmt_cache_size:Global,非事务语句cache,5.9之后废弃max_binlog_size:Global,binlog文件最大值max_heap_size:Globaltmp_table_size:Global,Session7using temporary table时,在session中设置此值,超过则memory改为disk myisam表query_cache_size:Globalquery_cache_limit:Global,查询结果超过此值则不进入缓存,防止大查询将cache清空thread_cache_size:Globalbulk_insert_buffer_size:Global,Sessioninsert ... select ..; insert values (...),(...);load data infilejoin_buffer_size:Global,Sessioncomplex查询涉及多个表join时就需要使用多个join buffersort_buffer_size:Global,Sessiontable_definition_cache:Global表多时,需要增加此值。

太小会影响表打开速度,不占文件描述符table_open_cache:Global,Session。

占用文件描述符1个表被N个线程使用,会被打开N次1个表在当线程内也会被打开M次。

select * from tb as t1,tb as t2;则tb被打开2次如果打开表时cache满了,并且所有表都在使用,则cache会被临时扩展,当某个表可被回收时则释放临时扩展的空间# myisamMYD每个线程一个文件描述符,MYI所有线程公用一个文件描述符[innodb]innodb_buffer_pool_size:Globalinnodb_additional_mem_pool_size:Global,申请的操作系统缓存,不占用buffer pool innodb_log_buffer_size:Globalinnodb_log_file_size:Global[myisam]key_buffer_size:Global影响索引更新速度,越大越快?read_buffer_size:Global,Session对表做连续表数据扫描时使用read_rnd_buffer_size:Global,Session用key进行order,并且进行(非连续)扫描表数据时使用4.请简洁地描述下MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间区别?read uncommitted:未提交读。

可以读取到其他线程修改(未提交)的数据read committed:提交读。

只能读取到其他线程已经提交的数据。

解决脏读,修改的数据可能最后未提交。

只锁定索引,并且不锁定索引前的间隙repeatable read:可重复读。

不能读取到其他线程提交的数据,间隙锁解决幻读。

使用唯一索引进行等值查询,则只锁定索引,不锁定索取前间隙。

其他查询,则不仅锁定索引,并且锁定索取范围包含的间隙serializable:串行化读。

所有的访问都串行化。

将select转为select ... lock in share mode 即为查询语句涉及到的数据加上共享琐,阻塞其他事务修改真实数据。

5.小题集锦1>.VARCHAR(N) 或CHAR(N)中的N含义是:N个字符。

1个字符不同字符集下占用的字节数不一样2>.若一张表中只有一个字段VARCHAR(N)类型,utf8编码,则N最大值为多少(精确到数量级即可):N=FLOOR((65535-1-2)/3)3>.表中有大字段X(例如:text类型),且字段X不会经常更新,以读为为主,请问您是选择拆成子表,还是继续放一起,并且写出您的理由?答案:拆为子表。

理由:提高其他字段的查询(select/update)效率,因为每页保存的行数越多,效率越高。

X字段更新效率低,单行的读取效率降低不大,但如果每次查询的行数越多,影响越大4>.MySQL中InnoDB引擎的行锁是通过加在什么上完成(或称实现)的:A.数据块B.索引值选择答案后,告诉我们为什么?答:索引值索引值。

innodb表数据是索引组织表形式存放但是对索引页加锁,采用位图方式实现锁:提供共享资源的并发访问,保证数据的完整性、一致性sqlserver:2005前,页级锁;之后乐观并发,悲观并发。

乐观并发支持行级锁但和innodb实现方式不同,sql server下锁是稀有资源,某种情况下会升级为表锁innodb、oracle:提供一致性的非锁定读、行级锁(没有相关额外开销)通过索引查询时,主键锁的是key,辅助索引锁的是范围锁的两个概念:latch、locklatch:线程使用,轻量级锁,锁定内存数据结构锁定时间必须很短。

可再分为mutex(互斥锁)、rwlock(读写锁)。

目的是用来保证并发线程操作临界资源的正确性,并且没有死锁检测,有mysql server保证.Lock:事务使用,锁定的对象:表、页、行。

commit或rollback后释放意向锁:表级别的锁,表示下一行被请求的锁类型locks rec but not gap: 表示锁住的是索引,而不是范围。

有死锁检测。

5>.username字段定义为VARCHAR(40)和VARCHAR(200) 有啥区别?答:临时表varchar(200)占用空间更大,最好按实际需求分配6>.MySQL数据库备份方式有那几种(只讨论InnoDB存储引擎),至少写四种。

select ... into outfile;对应load data infile 恢复fileds terminated by 'x';每个列的分隔符。

默认'\t'optionally encolsed by 'x';字符串的包含符。

默认''escaped by 'x':转义符,默认为'\\'starting by 'x';每行的开始符。

默认''terminated by 'x':每行结束符。

默认'\n'mysqldump:对应mysql恢复single-transaction:备份开始先执行start transaction但不能有DDL操作,否则无法保证一致性读master-data:如果没有指定single-transaction,则用lock-all-tables1:显示master status,并且change master2:只显示change,但不执行mysqlimport:与load data infile类似,但支持导入多个表,表之间并发导入二进制日志binlog备份通过mysqlbinlog命令从binlog提取sqlxtrabackup先记录当前redo位置然后拷贝共享表空间和独立表空间数据最后根据redo日志和开始位置,重做redo快照备份LVM6.MySQL复制搭建M->N的过程,请简述各个步骤?(备注:M已经在线跑,N为新安装的MySQL服务器)1>在启动主从服务器时,必须用server_id启动选项给出其ID值。

相关主题