@@ -17,66 +17,69 @@ by 涉及的列上建立索引。
1717
1818#### 2.优化 SQL 语句
1919&ensp ;&ensp ;&ensp ;&ensp ;
20- 2.1 通过 explain(查询优化神器)用来查看 SQL 语句的执行效果,
20+ 2.1 通过 explain(查询优化神器)用来查看 SQL 语句的执行效果,
2121可以帮助选择更好的索引和优化查询语句, 写出更好的优化语句。 通
2222常我们可以对比较复杂的尤其是涉及到多表的 SELECT 语句, 把关
2323键字 EXPLAIN 加到前面, 查看执行计划。例如: explain select * from
2424news; <br >
2525&ensp ;&ensp ;&ensp ;&ensp ;
26- 2.2 任何地方都不要使用 select * from t , 用具体的字段列表代
26+ 2.2 任何地方都不要使用 select * from t , 用具体的字段列表代
2727替“* ” , 不要返回用不到的任何字段。 <br >
2828&ensp ;&ensp ;&ensp ;&ensp ;
29- 2.3 不在索引列做运算或者使用函数。 <br >
29+ 2.3 不在索引列做运算或者使用函数。 <br >
3030&ensp ;&ensp ;&ensp ;&ensp ;
31- 2.4 查询尽可能使用 limit 减少返回的行数, 减少数据传输时间和
31+ 2.4 查询尽可能使用 limit 减少返回的行数, 减少数据传输时间和
3232带宽浪费。
3333
3434#### 3.优化数据库对象
35353.1 优化表的数据类型 <br >
3636&ensp ;&ensp ;&ensp ;&ensp ;
37- 使用 procedure analyse()函数对表进行分析, 该函数可以对表
37+ 使用 procedure analyse()函数对表进行分析, 该函数可以对表
3838中列的数据类型提出优化建议。 能小就用小。 表数据类型第一个原
3939则是: 使用能正确的表示和存储数据的最短类型。 这样可以减少对
4040磁盘空间、 内存、 cpu 缓存的使用。
4141使用方法: select * from 表名 procedure analyse(); <br >
42423.2 对表进行拆分 <br >
4343&ensp ;&ensp ;&ensp ;&ensp ;
44- 通过拆分表可以提高表的访问效率。 有 2 种拆分方法: <br >
44+ 通过拆分表可以提高表的访问效率。 有 2 种拆分方法: <br >
4545&ensp ;&ensp ;&ensp ;&ensp ;
46- 1.垂直拆分:
47- 把主键和一些列放在一个表中, 然后把主键和另外的列放在另
46+ 1.垂直拆分: <br >
47+ &ensp ;&ensp ;&ensp ;&ensp ;
48+ 把主键和一些列放在一个表中, 然后把主键和另外的列放在另
4849一个表中。 如果一个表中某些列常用, 而另外一些不常用, 则可以
4950采用垂直拆分。 <br >
5051&ensp ;&ensp ;&ensp ;&ensp ;
51- 2.水平拆分:
52- 根据一列或者多列数据的值把数据行放到二个独立的表中。 <br >
52+ 2.水平拆分: <br >
53+ &ensp ;&ensp ;&ensp ;&ensp ;
54+ 根据一列或者多列数据的值把数据行放到二个独立的表中。 <br >
53553.3 使用中间表来提高查询速度 <br >
5456&ensp ;&ensp ;&ensp ;&ensp ;
55- 创建中间表, 表结构和源表结构完全相同, 转移要统计的数据
57+ 创建中间表, 表结构和源表结构完全相同, 转移要统计的数据
5658到中间表, 然后在中间表上进行统计, 得出想要的结果。
5759
5860#### 4.硬件优化 <br >
59614.1 CPU 的优化 <br >
6062&ensp ;&ensp ;&ensp ;&ensp ;
61- 选择多核和主频高的 CPU。 <br >
63+ 选择多核和主频高的 CPU。 <br >
62644.2 内存的优化 <br >
6365&ensp ;&ensp ;&ensp ;&ensp ;
64- 使用更大的内存。 将尽量多的内存分配给 MYSQL 做缓存。 <br >
66+ 使用更大的内存。 将尽量多的内存分配给 MYSQL 做缓存。 <br >
65674.3 磁盘 I/O 的优化 <br >
6668
67694.3.1 使用磁盘阵列 <br >
6870&ensp ;&ensp ;&ensp ;&ensp ;
69- RAID 0 没有数据冗余, 没有数据校验的磁盘陈列。 实现 RAID 0
71+ RAID 0 没有数据冗余, 没有数据校验的磁盘陈列。 实现 RAID 0
7072至少需要两块以上的硬盘, 它将两块以上的硬盘合并成一块, 数据
7173连续地分割在每块盘上。 <br >
7274&ensp ;&ensp ;&ensp ;&ensp ;
73- RAID1 是将一个两块硬盘所构成 RAID 磁盘阵列, 其容量仅等于
75+ RAID1 是将一个两块硬盘所构成 RAID 磁盘阵列, 其容量仅等于
7476一块硬盘的容量, 因为另一块只是当作数据“镜像”。
75- 使用 RAID-0+1 磁盘阵列。 RAID 0+1 是 RAID 0 和 RAID 1 的组
77+ &ensp ;&ensp ;&ensp ;&ensp ;
78+ 使用 RAID-0+1 磁盘阵列。 RAID 0+1 是 RAID 0 和 RAID 1 的组
7679合形式。 它在提供与 RAID 1 一样的数据安全保障的同时, 也提供了
7780与 RAID 0 近似的存储性能。 <br >
78- 图
79-
81+ ![ 01_1_1 ] ( /data/images/Java应届生面试突击/数据库/01_1_1.png ) < br >
82+
80834.3.2 调整磁盘调度算法 <br >
8184&ensp ;&ensp ;&ensp ;&ensp ;
8285 选择合适的磁盘调度算法, 可以减少磁盘的寻道时间。
@@ -104,19 +107,19 @@ RAID1 是将一个两块硬盘所构成 RAID 磁盘阵列, 其容量仅等于
104107&ensp ;&ensp ;&ensp ;&ensp ;
105108 目前,大部分的主流关系型数据库都提供了主从复制的功能,通过配置两台(或多台)
106109数据库的主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。网站可
107- 以利用数据库的这一功能,实现数据库的读写分离,从而改善数据库的负载压力。一个系
110+ 以利用数据库的这一功能,* 实现数据库的读写分离,从而改善数据库的负载压力* 。一个系
108111统的读操作远远多于写操作,因此写操作发向 master,读操作发向 slaves 进行操作(简
109112单的轮循算法来决定使用哪个 slave)。 <br >
110113&ensp ;&ensp ;&ensp ;&ensp ;
111114 利用数据库的读写分离,Web 服务器在写数据的时候,访问主数据库(Master),主
112- 数据库通过主从复制机制将数据更新同步到从数据库 (Slave),这样当 Web 服务器读数
115+ 数据库通过 * 主从复制机制 * 将数据更新同步到从数据库 (Slave),这样当 Web 服务器读数
113116据的时候,就可以通过从数据库获得数据。这一方案使得在大量读操作的 Web 应用可以轻
114117松地读取数据,而主数据库也只会承受少量的写入操作,还可以实现数据热备份,可谓是
115118一举两得的方案。 <br >
119+ ![ 01_1_2] ( /data/images/Java应届生面试突击/数据库/01_1_2.png ) <br >
116120
117- 图
118121
119- 主从复制的原理: <br >
122+ ##### 主从复制的原理: <br >
120123&ensp ;&ensp ;&ensp ;&ensp ;
121124 影响 MySQL-A 数据库的操作,在数据库执行后,都会写入本地的日志系统 A 中。
122125假设,实时的将变化了的日志系统中的数据库事件操作,通过网络发给 MYSQL-B。
@@ -135,54 +138,55 @@ slave。 <br>
135138可以发现,通过上面的机制,可以保证 MYSQL-A 和 MYSQL-B 的数据库数据一致,但
136139是时间上肯定有延迟,即 MYSQL-B 的数据是滞后的。 <br >
137140
138- 简化版: <br >
141+ ##### 简化版: <br >
139142mysql 主(称 master)从(称 slave)复制的原理: <br >
140143&ensp ;&ensp ;&ensp ;&ensp ;
141- (1)master 将数据改变记录到二进制日志(binary log)中,也即是配置文件 log-bin 指定
144+ (1)master 将数据改变记录到二进制日志(binary log)中,也即是配置文件 log-bin 指定
142145的文件(这些记录叫做二进制日志事件, binary log events) <br >
143- PS :从图中可以看出,Slave 服务器中有一个 I/O线程(I/O Thread)在不停地监听 Master
146+ * PS * :从图中可以看出,Slave 服务器中有一个 I/O线程(I/O Thread)在不停地监听 Master
144147的二进制日志(Binary Log)是否有更新: 如果没有它会睡眠等待 Master 产生新的日志事件;
145148如果有新的日志事件(Log Events), 则会将其拷贝至 Slave 服务器中的中继日志(Relay
146149Log)。 <br >
147150&ensp ;&ensp ;&ensp ;&ensp ;
148- (2).slave 将 master 的二进制日志事件(binary log events)拷贝到它的中继日志(relay
151+ (2).slave 将 master 的二进制日志事件(binary log events)拷贝到它的中继日志(relay
149152log) <br >
150153&ensp ;&ensp ;&ensp ;&ensp ;
151- (3).slave 重做中继日志中的事件,将 Master 上的改变反映到它自己的数据库中。所
154+ (3).slave 重做中继日志中的事件,将 Master 上的改变反映到它自己的数据库中。所
152155以两端的数据是完全一样的。 <br >
153-
154- PS : 从图中可以看出, Slave 服务器中有一个 SQL 线程(SQL Thread)从中继日志读
156+ & ensp ;& ensp ;& ensp ;& ensp ;
157+ * PS * : 从图中可以看出, Slave 服务器中有一个 SQL 线程(SQL Thread)从中继日志读
155158取事件, 并重做其中的事件, 从而更新 Slave 的数据, 使其与 Master 中的数据一致。 只要
156159该线程与 I/O 线程保持一致,中继日志通常会位于 OS 的缓存中,所以中继日志的开销很小。
157160附简要原理图:
158- 图
161+ ![ 01_1_3] ( /data/images/Java应届生面试突击/数据库/01_1_3.png ) <br >
162+
159163
160- 主从复制的几种方式: <br >
161- 1.同步复制 <br >
164+ ##### 主从复制的几种方式: <br >
165+ 1 . 同步复制 <br >
162166&ensp ;&ensp ;&ensp ;&ensp ;
163- 主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,必须等待验证所
164- 有的从服务器的更新数据是否已经复制到其中 ,之后才可以自由处理其它进入的事务处理
167+ 主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,必须等待验证 * 所
168+ 有的从服务器 * 的更新数据是否已经复制到其中 ,之后才可以自由处理其它进入的事务处理
165169请求。
166- 2.异步复制 <br >
170+ 2 . 异步复制 <br >
167171&ensp ;&ensp ;&ensp ;&ensp ;
168172 主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,无需等待验证更
169173新数据是否已经复制到从服务器中,就可以自由处理其它进入的事务处理请求。
170- 3.半同步复制 <br >
174+ 3 . 半同步复制 <br >
171175&ensp ;&ensp ;&ensp ;&ensp ;
172- 主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,只需等待验证其
173- 中一台从服务器的更新数据是否已经复制到其中 ,就可以自由处理其它进入的事务处理请
176+ 主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,只需等待验证 * 其
177+ 中一台从服务器 * 的更新数据是否已经复制到其中 ,就可以自由处理其它进入的事务处理请
174178求,其他的从服务器不用管。 <br >
175179
176180### <a name =" 3 " >3. 数据库分表, 分区, 分库</a >
177181&ensp ;&ensp ;&ensp ;&ensp ;
178- 分表见上面描述 。 <br >
182+ * 分表 * 见上面描述 。 <br >
179183&ensp ;&ensp ;&ensp ;&ensp ;
180- 分区就是把一张表的数据分成多个区块 ,这些区块可以在一个磁盘上,也可以在不同
184+ * 分区 * 就是把一张表的数据分成多个区块 ,这些区块可以在一个磁盘上,也可以在不同
181185的磁盘上,分区后,表面上还是一张表,但数据散列在多个位置,这样一来,多块硬盘同
182186时处理不同的请求,从而提高磁盘 I/O 读写性能,实现比较简单。 包括水平分区和垂直分
183187区。 <br >
184188&ensp ;&ensp ;&ensp ;&ensp ;
185- 分库是根据业务不同把相关的表切分到不同的数据库中 ,比如 web、bbs、blog 等库。 <br >
189+ * 分库 * 是根据业务不同把相关的表切分到不同的数据库中 ,比如 web、bbs、blog 等库。 <br >
186190
187191---
188192### 搬运工信息
0 commit comments