MySQL 290题

1、IT行业数据库布局分析
2、完整的描述sql工作过程中产生的
用户线程建立、工作区分配、
内存读、物理读、
commit、redo log(日志写)(用户空间)
物理写(为什么说是后台物理写)协同工作!
3、存储中的缓存和闪存工作机制
4、mysql存储引擎简单描述
5、单台服务器上安装两套mysql实例库(可选择相同端口、不同端口)
6、绘制innodb引擎的结构图,进行讲解
7、详细描述一下commit的过程和rollback的过程,为什么commit速度总是那么快,rollback很多时候执行的很慢,可能非常慢。
8、调整相关参数
innodb_purge_threads=6
innodb_read_io_threads=6
innodb_write_io_threads=6
innodb_buffer_pool_size:物理内存的50%
增加logfile的大小(2G),增加logfile的组数(5组)()
9、描述一下free list、lru list、flush list的作用,以及为什么需要这三种链
10、描述一下latch争用的过程、表现的现象、监控指标、解读指标。如何降低latch争用(判断的时候要监控指标,解读指标…)
11、如何调整内存参数innodb_old_blocks_pct,这个参数的意义是什么,用来避免什么问题?
innodb_old_blocks_time
如何通过相关的指标来确认这几个参数是否需要调整。
12、关于log buffer 调整成100M的理论依据和思路解析
13、描述change buffer的作用,确认change buffer占用的大小,确认change buffer带来的效果,分析change buffer占用过大或者效果不明显的原因。
14、调整change buffer占用空间的大小,以及调整依据,调整只是对insert进行合并。
附加题:怎么判断一个表上索引的数量,以及在哪些列上建立的索引。(查数据字典)
有序度??(oracle能查,mysql不能查,开发人员知道)
15、描述一下索引的工作过程,适合使用的场合,结合insert buffer描述一下,索引如何结合insert buffer进行工作。
如何建立索引,如何确认索引是否生效?
16、描述一下double write解决的场景,工作过程,如何打开和关闭这个功能跟,通过这个功能对应的指标(status),来确认系统写操作是否有压力,并作出解释。
17、通过索引来访问表,主要的资源消耗分析,尤其在什么情况下,资源消耗得特别厉害?
(要详细解释!)
18、自适应哈希索引要降低的是哪个资源消耗,描述其工作工程,理解hash运算,通过读取相关指标来确认这个功能的效果。
学会打开和关闭这个功能。
19、描述异步IO的好处;描述如何确认打开异步IO(操作系统层面确认异步io开启,linux默认开启;数据库层面也是开始);
20、描述innodb_flush_neighbors 临接页的具体功能、弊端、好处。如何开启和关闭。

21、简单解释一下sharp checkpoint、fuzzy checkpoint,同时解释一下fuzzy checkpoint的工作过程,重点是何为checkpoint。
22、通过show engine innodb status,解释一下日志相关的四行数据对应的含义。同时对下面的四个需求做出解决方案。
1.日志的生成速度?
2.日志的写入速度?
3.脏页的写入速度?
4.数据库的启动时间是多少?
23、详细解释触发写入操作的四种情况,也就是四种检查点的触发因素。如何对每一种写入操作进行控制,避免某些写入动作的发生,特别是阻塞系统运行的写入操作。
24、调整系统关闭的参数,说明每一个参数的意义。
25、调整系统启动恢复的参数,说明每一个参数的意义。
26、如果系统因为执行了一个非常大的DML或者DDL操作,导致系统hang住,我们想断掉这个操作,怎么办?解释原因。
27、如何来确认系统的写入操作是大了还是小了(多个角度)。如何调整?调整后如何确认是否合适?
28、如何对数据库进行性能监控?列举常见的一些监控参数的查找方式。(show engine…)
29、使用tpcc进行压力测试
30、描述一下压力测试都包括哪些方法法和工具。
31、mysql性能监控指标解读及相关参数调整。
32、互联网企业硬件架构描述,主要是存储架构。
33、如何参照官方文档来修改参数,确认参数的属性。
34、MySQL数据库里面文件(datadir)的权限。
35、redo log的工作过程,包括日志记录模式、记录的时间;bin log的工作过程,包括日志记录模式。
36、redo log的核心作用;bin log的核心作用。
37、binlog的启动、binlog日志的大小、binlog_cache_size的大小及监控指标、sync_binlog参数、binlog_ignore_db参数、format模式。
38、从操作系统层面到数据库层面,MySQL数据库都包括哪些核心排错日志。
39、如何启用慢查询,包括启用、设置日志文件、设置阈值。如何通过慢查询来确认一个sql的性能。如何理解一个sql的性能是否合理。(执行时间、Row_sent:Row_examined的比值)。慢查询使用的限制。
40、MySQL查询日志的开启,查询日志的作用以及副作用。
41、ibdata共享表空间使用注意事项,insert buffer何种情况下会增长很快、undo何种情况下会增长很快。
如何将undo从ibdata里面分离。
初始时将ibdata设置为10G
42、理解sock文件和pid文件,在启动过程中可能存在的陷阱。
43、理解basedir,特别是里面的结构。
44、详细解读tpcc压力测试结果,同时进行一些硬件和参数的性能调整,调整以后,重新进行压力测试,看一下结果的变化情况。
45、使用zabbix对我们的压力测试结果进行绘图。
46、主键的选择依据,IOT表的存储结构以及对insert和select场景的要求,IOT对于通过主键批量取数据的特点。
47、如何提升mysql批量insert的性能。
48、详细描述如何从一个表中读取一行数据,研究可变长度和NULL位的意义。
49、如何评估ddl语句对表的操作风险,举几个例子:增加列、修改列的名字、修改列的长度(加长、减少)
50、MySQL如何减少delete操作对undo空间的占用。
51、详细描述一下rollback的过程:系统事务表、回滚段、回滚段头、事务槽、事务数据块链表。
52、详细描述MySQL如何实现读已提交数据的过程。
53、深刻理解varcahr数据类型,特别是最大长度、M的含义。
54、最大行长度的定义,包括和不包括blob的含义。
55、几个问题:
1.假设一个表有blob列,那么这个表的行长度最大是多少?(去掉blob所占的空间)
2.假设一个表没有blob列,那么这个表的行长度最大是多少?
56、表设计的时候,最基本的原则。简述垂直拆分,做一个垂直拆分的例子,并对垂直拆分的表进行访问。
57、行溢出的几种情况及应对措施。
58、理解checksum各种应用场合以及在mysql中的应用场合和解决的问题。
59、MySQL五种约束的工作作用,以及语法实现,查询约束的存在和定义。
60、MySQL五种约束后期添加,风险评估和实践验证。
61、描述undo的三个作用。
62、描述一下MVCC特性、实现原理、演示使用MVCC的场景。
63、大事务和长事务的危害,演示长事务的致命危害。如何去判断大事务和长事务。如何处理影响生产的大事务和长事务。
64、描述一下latch和mutex的区别、使用场合,如何来判断系统是否存在latch或者mutex的争用,争用的源是什么。
65、描述一下lock工作机制:排队、X和S。
66、InnoDB如何实现行级锁、事务锁,实现机制是什么。
67、解释一下意向锁IX、IS的意义和作用。
68、模拟S、X、IS、IX,做出它们的兼容性列表。
69、如何来评估ddl操作风险,主要从锁和负载两个角度来分析,如何应对。
70、如何来避免和减少锁冲突。
71、如何对锁冲突进行监控,如何对产生锁冲突的原因进行监控,如何处理锁冲突,如何进行根治。
72、如何对各种锁进行释放。
73、如何判断事务类型:大事务,长事务,慢事务。
74、描述一下自增长列的特点以及要求(唯一,连续),实现一个自增长列表,然后使用自增长列。
75、自增长列insert的几种类型,自增长锁的几种持有方式
76、innodb_autoinc_lock_mode 这个参数0. 1. 2 三种工作方式的解读,如何提升批量并发insert的性能。
77、主外键面对的一系列“坑”,对外表的坑,对主表的坑。
78、使用help,建立一个主外表,主表有主键,外表有外键,外键的删除依据分别为RESTRICT | CASCADE | SET NULL | NO ACTION 同时,主外表导入数据,然后在主表测试delete操作对应主外表的变化。
79、实际生产中对主外表的处理方式。
80、描述事务的永久性和原子性,理解必要和数据库如何实现。
81、如何开始和结束一个事务,模拟一个事务,查看一下TPS的变化。
82、解释和演示一下何为“事务的不可重复读”“幻影读”。
83、什么时候会出现范围锁,什么时候使用行锁,如何来减小和避免范围锁带来的影响。
84、全表扫描带来的范围锁灾难。
85、范围锁锁定的范围是多少。
86、写脚本监控长事务和大事务,监控锁等待。
87、事务的四种隔离级别的分析。
88、关闭数据库的范围锁这个功能。
89、如何实现业务的串行化要求。
90、锁和死锁的定义和区别、死锁产生的原因。
91、MySQL对死锁的处理方式。
92、MySQL处理死锁的时候,回滚依据是什么。
93、如何避免死锁,业务逻辑需要改变,减少长事务。
94、MySQL性能监控参数值,列举一下,建议show global status,将里面认识的状态参数在官方文档里面参考一下,抽取出来。
95、完整描述一下如下流程,从安装——参数调整——性能监控——参数后期调整——监控预期效果——继续调整——不断调整。
最终目的:SQL速度足够快、业务吞吐量足够高(TPS、QPS)、系统负载可控(合理)、CPU、IO负载低。【业务吞吐量高了,负载一般都会高】
96、安装一个MySQL、根据经验进行参数调整、压力测试、性能监控(zabbix)、找到达不到预期的参数或者异常参数,调整参数,继续监控,完成完成这么一个流程最基本的要将TPS、QPS不断提高,提高到极致。
97、描述一下MySQL体系结构,内存、线程、磁盘文件、各级缓存、同时将对应变量参数以及状态参数列举出来。
98、MySQL内存分配原则,如何判断内存分配是否过量、是否剩余。
99、innodb表以及索引和myisam表和索引的缓存情况。
100、mysql参数调整依据,对于每一个参数的调整,都需要从两个层面去分析。
101、理解key_buffer_size以及对应的状态参数.
102、理解read buffer size,这个参数主要解决myisam表的读取问题。
103、学会使用数据字典获取系统的很多信息,例如系统里面有哪些表、这些表的引擎是什么,表的行数是多少,系统里面有哪些列,哪些索引,索引建立在哪些列上。
104、mysql内存分配总体思路,buffer pool总体依据、用户线程总体依据。
105、如何在excel中画基于横坐标和纵坐标的趋势图。
106、描述一个select语句的执行过程,看一下哪些参数影响这个select的执行过程。
107、写线程为何影响读线程,如何来调整写线程,分别来解决两个问题:总体降低物理写、解决抖动问题。
108、日志写线程的工作状态,以及是否影响性能,相应的参数调整。
109、根据SQL、事务的工作过程以及每一个过程消耗的资源,来描述如何通过调整参数来让数据库性能达到最佳。
110、关闭double write来调整写性能。
111、总体需要调整的参数,进行列举和调整(读、写、日志、用户线程、并发)。
112、mysql重启面临的巨大风险,如何避免。
113、5.7里面如何对undo进行收缩。
114、详细解读MySQL常用参数。
115、mysql最佳实践安装,同时进行压力测试,不断调试各种参数,得到最佳性能,写出安装以及调试整个过程,并且划出性能趋势图,写出调试依据。
116、mysql服务器常见的几种硬件架构,文件系统选型及mount注意事项。
117、选择和调整mysql所在服务器的硬盘的调度策略(针对闪盘和普通硬盘),并解释noop、deadline、anticipatory、cfq工作机制。
118、解释何为BBU的自动校正功能,为何自动校正期间,服务器io性能大幅减低,出现明显的性能抖动。
119、判断BBU是否处于自动校准模式工作中、电池是否需要更换。
120、解释默认和当前生效的raid卡策略:写缓存策略、预读策略、读缓存策略、电池故障是否启用写缓存。
121、如何临时启用bbu的写缓存。
122、如何解决电池周期性充放电带来的IO性能抖动。
123、如何查看电池下次自动校正时间。
124、numa架构的工作特点,为什么不适合mysql数据库服务器
125、如何关闭numa,列举至少3中形式(服务器级别、os级别、进程级别)
126、判断numa是否启动,判断是否因为numa的问题造成了swap
127、linux内核升级,测试对固态盘的io吞吐量的影响(内核裁剪)
128、下载fio压力测试工具,测试io性能
129、写一个完整的MySQL安装文档
硬件选型、价格、mysql软件、配置、压力测试、监控、参数调整、os配置、硬件相关参数的配置(raid卡的bbu的配置和管理)
整个一个流程要非常的完整,特别是性能监控、调整趋势图(os层面的监控+数据库层面的监控)
130、dell服务器配置解读
131、msyql引擎功能个解读
132、下载maridb和percona两个版本,安装试用一下
133、解读binlog,使用命令截取一段日志进行一个操作的恢复,例如insert语句 135、解释逻辑备份和物理备份、冷备、热备
134、详细解释mysqldump -uroot -p -l -F –single-transaction tpcc1000 >tpcc1000.sql 这条命令里面的参数,重点解释数据的一致性和恢复起点
135、详细解释mysqldump -uroot -p -l -F –single-transaction -T /tmp/ –fields-terminated-by=’,!#’ tpcc1000 item >item.txt 这条命令
136、备份一个时刻的数据库,比如9:00这个时刻,在11:00这个时刻,一个表被误删除,例如item表,让你将这个表恢复会去
137、使用xtrabackup备份数据库
138、物理备份数据库,删除一个表,进行恢复,将表恢复到生产数据库
139、mysql启动流程排错
140、备份方案设计要点,
141、设计一个备份方案里面带有主从、全备、增量、binlog备份,计算备份时间、预估回复时间
142、实现这个备份方案,实现恢复方案,将这些内容添加到备份方案中
143、实现一个增量备份恢复,全备、insert数据、增量备份、insert数据,使用全备+增量+binlog进行恢复
144、分别使用并行、限流对数据库进行备份,体会两种策略的影响
145、深入了解备份期间lock的影响,使用no-lock来解决这个问题,注意使用no-lock该注意的地方
146、注意理解redo-only,掌握使用规律
147、使用丛库同时在备份期间停止丛库的同步线程,加快备份速度
148、完整的设计一个备份方案
1、考虑主库的压力
2、考虑恢复时间,做好恢复时间计算原则
3、考虑限流、并行
4、考虑锁的问题
5、考虑主库和备库进行备份,分别对应不同的方案
6、考虑压缩和加密
7、考虑全备。增量、binlog配合
8、注意完善备份恢复对应的命令,特别是增量备份时对应的redo-only选项
149、恢复时跑binlog的经典错误的问题定位。
ERROR 1032 (HY000) at line33: Can’t find record in ‘new_orders’;
150、克隆slave数据库
在日常生活中,我们做得比较多的操作是在线添加从库,比如线上有一主一从两个数据库,由于业务的需要一台从岸的读取量无法满足现在的需求,这样就需要我们在线添加从库,出于安全考虑,我们通常需要在从库上进行在线克隆slave。
原理
就是对slave库进行复制步骤和建立主从库一样(不过是master_log file和master_log_pos信息 使用的是slave的xtrabackup_slave_info)
常用参数
–slave-info 会将Master的binary log的文件名和偏移位直保存到xtrabackup_slave_info文件中。
–safe-slave-backup 则会暂停Slave的SQL线程,直到没有打开的临时表的时候开始备份。待备份结束后SQL线程会自动启动,这样操作的目的主要是确保一致性的复制状态。
151、导数的几种方式
1、select … into outfile ‘/backup/t1.txt’ (这个文件要有权限)
2、mysqldump -T (如果不接-T,直接使用.sql文件就可以恢复)
3、loda data 导入
4、mysqlimport
152、如何来处理纯文本文件里面的行数据
参数:
FIELDS TERMINATED BY ‘,’(字段之间使用,做分隔符)
LINES TERMINATED BY ‘\n’ (每一行数据之间使用回车做分隔符)
ENCLOSED BY ‘”“’ (列引用)
OPTIONALLY ENCLOSED BY ‘”“’ (列引用)
FIELDS(如果写了几个参数,有一个就够了) ESCAPED BY ‘\’ (\前一个\将后一个\转义为tab)
153、做下面几个例子
1、使用两种方式导出两个表,使用行模式导出,注意使用丰富的选项
2、使用两种方式进行导入,测试一下性能,每秒导入的行数
154、主从复制的两个核心应用场景,以及原理
155、mysql主从复制两大延迟,描述两大延迟主要的延迟原因
156、相对详细的描述一下主从复制的原理,对应的线程,线程的资源消耗以及状态查看
157、描述一下主库binlog的删除策略以及对应的参数设置和语法实现、从库relay log的删除策略
158、binlog三种模式,对应的优缺点,特殊场合临时性改变语句模式
159、从库上的两个info文件的名字和作用。重要性,为什么最好保存到表中,如何实现
160、熟悉解读show slave status \G, 对io和apply线程的延迟和工作状态有一个清楚的理解。如何查看传输延迟和应用延迟。
161、一主多从架构的优点,多级复制的优缺点和多级复制中一级丛库的设置要点
162、搭建一个主从数据库,写脚本实现对主从数据库的同步状态监控:传输延迟、应用延迟
163、半同步的实现机制和同步范围
164、如何实现半同步复制
165、熟悉解读半同步复制状态值:show global status like‘%rpl%’;
166、如果主从之间出现网络问题,半同步复制的现象,以及自动处理的机制
167、从库redo-only启动,意义和实现
让丛库的数据更新只来于同步
168、如何实现主从复制的分拆,将从库分拆成多个不一致的从库,分别同步不同的库或者表,事务层面的使用限制。
169、从库如何处理SQL应用出现的错误。列举自动处理的方式以及对应的参数和实现。
170、从库如何处理SQL应用出现的错误,列举手工干预方式,如何实现以及如何进行监控。
171、如何对一个生产系统进行性能的初步诊断,从OS层面进行IO、CPU、内存、网络IO进行初步诊断。
1.负载在哪个地方?
2.瓶颈在哪个地方?
172、iostat 1 -x 各选项的详细解读。详细解读每一个输出列。
173、写出一个参数优化的思路,使用压力测试,写出具体优化过程。要配合着iostat、show global status、show variables、tpcc、反复调整,看一下最终的性能提升比例。(压力测试中trx的值)
174、写一个在mysql数据库服务器上,周期性取数据库的各种性能参数的状态值,存入一个memory引擎的表,要求有四个列:取的次数列、状态变量、状态值、和上一个时间的值的差,然后绘制动态趋势监控图。
175、考试题目
1、安装mysql5.7最新版本
2、调整相关参数,按照最佳实践进行调整
3、设计备份恢复策略,同时实现备份恢复脚本,要求使用xtrabackup进行备份恢复
4、搭建主从复制,要求使用5.7最新功能,实现主从复制中从服务器两个延迟的最小
5、调整主、从服务器的写性能,写出调整的依据,调整前后的性能监控(不要使用压力测试的结果,查询global status视图),形成性能趋势图,来反映调整效果

1、全程录屏
2、写出完整的文档,要求文档要求封面、目录结构
3、将整个实现过程全部写入文档,包括整个调试过程
4、判卷要求主从复制在压力测试结果下,正常工作

176、详细解读MySQL常用参数
177、mysql性能监控参数详解
178、通过OS层面分析cpu、io、内存、网络资源消耗情况。
179、了解导流的方式来进行压力测试(网络层面tcp copy)。
180、整体的数据库性能监控思路分析。(os-数据库-SQL-分表分库-增加从库)
181、如何查找正在慢的SQL,同时显示执行计划。
182、如何模拟执行速度慢的sql。对于dml如何进行select化,模拟成select语句。
183、对于慢sql,有两个执行步骤。
①执行计划的显示和排错 ②模拟执行sql
184、如何判断一个SQL很糟糕。
①执行计划判断:rows、key
②执行判断:时间、实际访问行数
185、解读经典的 语句。
①show table status like ”%t1%;
②show index from t1;
③show create table stock \G;
④desc stock;
⑤show session | global status \G;
⑥show variables like ‘%…%’;
186、在生产中添加索引的风险:①锁的风险(如果表大的话,一个alter语句可能要好几天才完成) ②执行时间可能非常长,资源消耗非常大
187、使用mysqldumpslow解读slow-log。
188、要按时清空slow log,防止日志过大。查的时候很慢。
189、解读mysqldumpslow -t 10 -s at slowmysql.log 的输出和mysqldumpslow -t 10 -s t slowmysql.log 的输出。
190、理解主键索引、唯一键索引、唯一约束、主键约束、help掌握语法。
191、理解外键的意义和作用,外键对主表列的要求。
192、在有主外键的情况下,主表操作的局限性以及性能影响,外表操作的局限性以及性能的影响。
193、理解通过索引访问表的资源消耗、全表扫描的资源消耗。
194、使用索引的几个最经典的场合。
195、深刻理解表连接的几种模型:其中总有一个表上面有严格的约束条件,这个表作为整个SQL的起点表。针对这个模型,我们的索引优化规则:①严格条件上要走索引②主外键走索引
196、多列索引的使用规则:
①前导列必须出现在where条件中
②后面的列要起作用,前面的列必须出现在where条件中
(空列,5.5和5.6不一样,5.6不害怕有空列)
197、如何审核和建立索引。
198、在一个列上建立索引的几个必备条件。
199、mysql统计信息有哪些,没有哪些。
200、对于糟糕SQL的处理流程。
201、针对一个SQL,会将主外表以及主外键找出来,画出关联关系,找到严格限制条件。
202、5.6版本中,多列索引的致命弱点。
①5.6版本中,多列索引建立的时候,尽量将选择性高的放在前面;
②where… and条件中,中间不能有空列(不然后面的条件不会成为索引条件,而是成为前面条件索引出的表的过滤条件)
203、分析一个SQL的资源消耗情况,分别对应的场景,包括IO、cpu、网络、用户线程空间。
204、糟糕SQL的定义。
205、Innodb_rows_read的定义:包含了索引和表访问行数。
206、多列索引的存储规则、对应的使用特点。
207、多列索引的高效使用。
208、使用索引去除排序。
209、使用索引去除排序的应用场景。
210、在group by分组列上建立索引来消除分组聚合产生的排序行为。
211、通过索引访问表的成本(主要是回表的成本、索引成本)。
212、使用覆盖索引的执行计划标志,以及使用覆盖索引的优势。
213、如何保证使用覆盖索引。select、group by、order by、having、where后面的列都在索引里面。
214、如何高效利用覆盖索引。
215、总结索引的几大功能。
216、执行计划里extra的 useing where ,usering index condition ,useing index都是什么含义。
217、解释5.6在多列索引中为什么不害怕中间有空列,5.5版本中害怕有空列。
218、理解server层和引擎层的概念,统计信息统计的是server层的处理负载。
219、主键索引的特殊性:
主键不受30%(mysql)的影响;
慎重对待建立主键,将常用的查询使用到主键;
customer (c_first,c_last,c_id), 这个作为这个表的主键
select * from customer where c_first like ‘a%’;
220、判断一个SQL是否合理的最稳妥的方式以及是否走了低效索引:
①返回的行=访问的行 - 过滤的行。
②能够通过执行计划清晰的判断,谁走了索引,谁成为了过滤条件。
rows –> key –>show index
计算返回的行数的方法:去掉group by 和 聚合函数,只保留where条件和count(*)。
221、RBO、CBO的工作方式。
222、mysql CBO使用到的统计信息以及没有直方图带来的缺陷,如何解决这个缺陷。
223、学会使用ue批量编写脚本。
224、写一个定期批量收集统计信息的脚本。
225、手工修改rows和card统计信息,引导mysql走索引。
226、计算表和索引的大小。
227、使用like来解决mysql数据倾斜导致执行计划不优秀的情况(个例)。
228、使用force、ignore来手工解决数据倾斜问题。
229、谨慎对待analyze table 这个操作。
230、详细描述一下统计信息相关参数以及收集的策略。
231、详细描述一下不走索引的一些情况以及”坑”。
232、233 空
234、识别ddl操作,确认哪些操作属于ddl。
235、ddl的风险,如何对ddl的风险进行测试。
236、识别ddl对应的算法和锁,对于锁的深度认识,特别是对lock=none的真相。
237、online ddl对应的坑。
海量的io、短暂的加上exclusive锁或者shared锁。
238、开发经常会对表进行ddl,如何规范ddl操作,写出一个规范的流程。
①提交ddl需求给DBA。限制开发人员对数据库的权限(grant)。
②DBA测试:io测试、时间测试、是否支持in place和none,显式的加上lock none
③DBA形成操作规范和风向评估报告,走流程审批。
④进行相关的操作。
239、分区表的四大好处。
240、建立一个以年和以天分区的表,且要带上maxvalue。
241、建立一个人口表,要求按照出生的省份做一个列表分区,每一个省一个分区(34个)。
242、子分区:5.6支持hash分区,对于241建立的人口表,进一步细分出来hash分区,每一个省份的分区在出生年月这个列上建立16个子分区。
243、分区对null的处理。
244、分区信息的查询
select table_name,partition_name,table_rows,avg_row_length,data_length
from information_schema.partitions
where table_schema = ‘tpcc1000’ and table_name like ‘e%’;
245、分区管理常见操作,记住语法和负载
①删除分区:范围分区、列表分区
②增加分区:范围分区、列表分区
③合并分区:范围分区、列表分区
④拆分分区:范围分区、列表分区
⑤重排分区:范围分区、列表分区
246、hash分区合并操作,使用相对较少。
247、利用分区的exchange功能,实现历史数据的归档。
248、分区级别进行的管理操作包括 //意义不是很大
①analyze
②truncate
249、分区消除
explain partitions select * from employees where store_id=6;
①省了一个索引,可以有效使用其他索引;
②分区消除是访问一个表相对大量数据的最有效的方式之一;
主键:可以取任何数量的数据;
二级索引:<5%
分区:可以取任何数量的数据
③实现分区消除的前提是select、update、delete中的where条件中有分区条件。
250、手工指定分区来避免没有实现自动分区消除。强行优化的一个手法。
select * from employees partition (p2);
251、一主多从结构致命弱点。
①主库存储压力增加
②主库写入压力增加
③主库成为单点故障
④tps有上限
⑤单表容量有上限
252、解决上述问题的方法?–>拆分!
垂直拆分:拆库、拆表
水平拆分:拆库、拆表
253、给出唯品会的垂直和水平拆分图谱,模拟用户注册和生成销售订单业务,给出tps提高的原因。
一共有40台服务器。
原因:tps落地到某一台具体的服务器。
254、对于水平分区的表,不使用水平分区列进行where查询的情况下,如何进行操作?
比如:订单表按照订单编号进行了水平分区,如果使用订单编号进行查找,直接定位某一台服务器上某一张表。
如何根据用户编号进行查询呢?
在每一台服务器上建立一个用户编号和订单编号的对应表,同时对于用户编号也进行取模分别存放。
255、分析垂直拆分、水平拆分如何来解决空间压力、写入压力、TPS等问题,解决扩展性问题。
256、如何查看一个执行计划所走的索引是否低效。
257、如何通过执行计划判断表的连接顺序是否合适。
258、or为什么不适合复合索引。
259、如何使用索引来处理or条件
260、如何使用索引来处理union、union all 条件
261、表的逆规范化来降低表连接的频率:将经常访问的列放到一个表中,即使出现数据冗余(违反了第一范式)
262、如何来解决逆规范化中的数据冗余问题。
①事务化:要修改用户的信息,就需要在一个事务中同时修改用户表和账单表
②写一个存储过程,存储过程作为修改用户表的一个接口、配合权限控制
③定期统一更新
263、对于表的一些操作包括:ER图设计、分区、分表分库、水平拆分、垂直拆分、逆规范化。
264、表、索引、SQL、架构、参数优化、硬件层面的优化。
265、Subquery Syntax 子查询
266、表、索引练习作业:
(1)怎么根据一个sql来判断是否需要建立索引、怎么建立索引、建立索引的依据是什么?
(2)建立索引以后,如何来评估这个索引的效果,高效还是低效?
(3)索引的几大作用,在哪些场景下需要建立什么样的索引?
(4)对于tpcc测试系统,实现表的分区、分表(水平拆分、垂直拆分)、分库(水平拆分、垂直拆分)、表的逆规范化
要求自己写例子,包括sql、效果演示…
267、not in 如何和 left join进行转换,转换的理论依据是什么,怎么改写。
268、not in如何和not exists进行转换,转换的理论依据是什么,怎么改写。
269、not in、not exitst、left join他们的执行方式以及各自适合的场景。
270、通过索引来优化not in、not exists。
271、如何分析一个需求,写出一个sql:我们要奖励一些用户。他们的单笔消费金额,只要大于过去商场12个月里面的任何一个月的平均金额。
272、如何对>any进行替换,将上面的sql替换成min().(前提是没有空值)
273、如何对>all进行替换,使用max()替换all。
274、in、exists、join如何进行互相转换。参考例子:最近一个月有消费记录的用户。
275、如何改写一个<>(不等于)ALL(不能走索引):使用not in、not exists、left join(可以走索引)。
注意:<>any 不能替换成not in.
select s1 from t1 where s1 <> ALL (select s1 from t2);
276、等于any 和 in 的互相转换:
select s1 from t1 where s1 = any (select s1 from t2);
select s1 from t1 where s1 in (select s1 from t2);
277、对于字符串和数字来说,null都是最小值,因此如果出现>any(有空值),