-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy path20190424-B-JAVA-10.html
225 lines (197 loc) · 12 KB
/
20190424-B-JAVA-10.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>葡萄藤PPT</title>
<link rel="stylesheet" href="https://ptteng.github.io/PPT/css/reveal/reveal.css">
<!-- PPT主题,可以在/css/reveal/theme/中选择其他主题,目前暂时只能使用该模板 -->
<link rel="stylesheet" href="https://ptteng.github.io/PPT/css/reveal/theme/ptt.css">
<!-- syntax highlighting 代码高亮主题 -->
<link rel="stylesheet" href="https://ptteng.github.io/PPT/lib/reveal/css/zenburn.css">
<!-- 打印和PDF输出样式 -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? 'https://ptteng.github.io/PPT/css/reveal/print/pdf.css' : '../css/reveal/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
</head>
<body>
<img src="https://ptteng.github.io/PPT/img/demo/logo.png" alt="" usemap="#pttmap" class="base-logo">
<map name="pttmap">
<area shape="rect" coords="0,0,276,58" href="http://www.jnshu.com" alt="" target="_blank"/>
</map>
<div class="reveal">
<div class="slides">
<section>
<h3>什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?</h3>
<p>分享人:王汇通</p>
</section>
<section>
<p>1.背景介绍</p>
<p>2.知识剖析</p>
<p>3.常见问题</p>
<p>4.解决方案</p>
<p>5.编码实战</p>
<p>6.扩展思考</p>
<p>7.参考文献</p>
<p>8.更多讨论</p>
<p>9.鸣谢</p>
</section>
<section>
<h3>1.背景介绍</h3>
</section>
<section>
<h3>什么时DB索引</h3>
<p>索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。</p>
<p>例如这样一个查询:select * from student where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。</p>
<p>从数据搜索实现的角度来看,索引也是另外一类文件/记录,它包含着可以指示出相关数据记录的各种记录。其中,每一索引都有一个相对应的搜索码,字符段的任意一个子集都能够形成一个搜索码。这样,索引就相当于所有数据目录项的一个集合</p>
</section>
<section>
<h3>索引的种类</h3>
<p>唯一索引:唯一索引是不允许其中任何两行具有相同索引值的索引</p>
<p>主键索引:数据库表经常有一列或多列组合,其值唯一标识表中的每一行。该列称为表的主键,该索引要求主键中的每个值都唯一</p>
<p>聚集索引:在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引</p>
<p>索引列:可以基于数据库表中的单列或多列创建索引。多列索引可以区分其中一列可能有相同值的行</p>
</section>
<section>
<h3>索引的基本特点</h3>
<p>第一是:建立索引的目的是加快对表中记录的查找或排序,创建索引可以大大提高系统的性能</p>
<p>第一是:通过创建唯一索引,可以保证数据库表中每一行数据的唯一性</p>
<p>第二是:可以大大加快数据库的检索速度</p>
<p>第三是:可以加快表和表之间的连接,特别是在实现数据库的参考完整性方面方面</p>
<p>第四是:在使用分组和排序子句进行检索时,同时可以减少查询中分组和排序时间</p>
</section>
<section>
<h3>索引有哪些优点</h3>
<p>一丶在设计数据库时,通过创建一个唯一索引,能够在索引和信息之间形成一对一映射关系,增加数据库的唯一性</p>
<p>二丶能够提高数据库的搜索以及检索速度,符合数据库建立的初衷</p>
<p>三丶能够捡块表和表之间的连接速度</p>
<p>在信息检索过程中,若使用分组以及排序子句进行时,通过建立索引能够有效的减少检索过程中所需的分组以及排序时间,提高效率</p>
</section>
<section>
<h3>2.知识剖析</h3>
</section>
<section>
<h5>数据库多大的数据量下建索引会有性能的差别?</h5>
<p>数据库中的索引储存引擎面用于快速查询找到记录的一种数据结构,索引对性能的影响非常重要,特别是在表中数据量达到百万级别的
时候,有无索引,或造成的性能差别非常大,正确的索引会极大提高查询的效率,就好比如一本书的目录,没有目录的情况查找的比较慢
有的话,查询速度截然相反
</p>
</section>
<section>
<h5>什么样的情况下该对字段建索引?</h5>
<p>1丶表的主键,外键必须有索引</p>
<p>2丶数据量超过300的表应该有索引</p>
<p>3丶经常与其它表进行连接的表,在连接字段上应该建议索引</p>
<p>4丶经常出现weher子句中的字段,特别是大表的字段,应该建立索引</p>
<p>5丶索引应该建立在选择性高的字段上</p>
<p>6丶表的主键,外键必须有索引</p>
</section>
<section>
<h5>什么是联合查询?</h5>
<p>将多次查询(多条select语句), 在记录上进行拼接(字段不会增加)</p>
<p>基本语法:多条select语句构成: 每一条select语句获取的字段数必须严格一致(但是字段类型无关)</p>
</section>
<section>
<h5>什么是最左匹配原则?</h5>
<p>我们在建立联合查询的时候,也就是对多个字段建立索引,这个时候数据库会让我们选择索引的顺序,
比如我们想在a,b,c,三个字段上建立一个联合查询,我们可以选择自己想要的优先级,a,b,c或者b,a,c等顺序 这个选择的顺序就引出了最左匹配原则。
</p>
<p>举个列子看索引的执行情况</p>select * from student where c = '1'
<p>上面的句子不会执行index索引</p>select * from student where a = '1'
<p>索引是有序的,index1索引在索引的文件中排列是有序的,首先是跟据a来排序 然后是b来排序,最后是c排序</p>
</section>
<section>
<h3>3.常见问题</h>
</section>
<section>
<p>一丶什么情况下不适合建立索引?</p>
<p>二丶主键索引和唯一索引的区别?</p>
<p>三丶创建索引需要注意什么?</p>
</section>
<section>
<h3>4.解决方案</h3>
</section>
<section>
<h5>什么情况下不适合建立索引?</h5>
<p>1丶对于查询过程中很少使用或参考的列,不应该建立索引</p>
<p>2丶对于哪些只有很少数据值的列,不应该建立索引</p>
<p>3丶对于那些定义image,text,和bit数据类型的列,不适合创建索引</p>
<p>4丶当修改性能远大于检索性能,不应该建立索引</p>
</section>
<section>
<h5>主键索引和唯一索引的区别?</h5>
<p>1丶主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。</p>
<p>1丶主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。</p>
<p>1丶唯一性索引列允许空值,而主键列不允许为空值。</p>
<p>1丶主键可以被其他表引用为外键,而唯一索引不能。</p>
</section>
<section>
<h5>创建索引需要注意什么?</h5>
<p>1丶限制表上的索引数目。对一个存在大量更新操作的表,所建索引的数目一般不要超过3个,最多不要超过5个。索引虽说提高了访问速度,但太多索引会影响数据的更新操作。</p>
<p>2丶避免在取值朝一个方向增长字段上,建立索引,由于字段的取值总是朝一个方向增长,新记录i总是放在索引的最后一页中,从而不断的引起该页的访问竞争</p>
<P>3丶删除不再使用,或者很少被使用的索引,表中的数据大量更新时,或者数据的使用的方式被改变后,原有的一些索引可能不再被需要</P>
</section>
<section>
<h3>5.编码实战</h3>
</section>
<section>
<h3>6.扩展思考</h3>
</section>
<section>
<p>怎么使用索引才能提高索引的命中?</p>
</section>
<section>
<h3>7.参考文献</h3>
</section>
<section>
<p>参考一:百度</p>
<p>参开二:简书</p>
<p>参考三:知乎</p>
</section>
<section>
<h3>8.更多讨论</h3>
</section>
<section>
<h3>9.鸣谢</h3>
<p>感谢观看,如有出错,恳请指正</p>
</section>
</section>
</div>
<script src="https://ptteng.github.io/PPT/lib/reveal/js/head.min.js"></script>
<script src="https://ptteng.github.io/PPT/lib/reveal/reveal.js"></script>
<script>
// 以下为常见配置属性的默认值
// {
// controls: true, // 是否在右下角展示控制条
// progress: true, // 是否显示演示的进度条
// slideNumber: false, // 是否显示当前幻灯片的页数编号,也可以使用代码slideNumber: 'c / t' ,表示当前页/总页数。
// history: false, // 是否将每个幻灯片改变加入到浏览器的历史记录中去
// keyboard: true, // 是否启用键盘快捷键来导航
// overview: true, // 是否启用幻灯片的概览模式,可使用"Esc"或"o"键来切换概览模式
// center: true, // 是否将幻灯片垂直居中
// touch: true, // 是否在触屏设备上启用触摸滑动切换
// loop: false, // 是否循环演示
// rtl: false, // 是否将演示的方向变成RTL,即从右往左
// fragments: true, // 全局开启和关闭碎片。
// autoSlide: 0, // 两个幻灯片之间自动切换的时间间隔(毫秒),当设置成 0 的时候则禁止自动切换,该值可以被幻灯片上的 ` data-autoslide` 属性覆盖
// transition: 'default', // 切换过渡效果,有none/fade/slide/convex/concave/zoom
// transitionSpeed: 'default', // 过渡速度,default/fast/slow
// mouseWheel: true, //是否启用通过鼠标滚轮来切换幻灯片
// }
// 初始化幻灯片
Reveal.initialize({
history: true,
dependencies: [
{ src: 'https://ptteng.github.io/PPT/plugin/markdown/marked.js' },
{ src: 'https://ptteng.github.io/PPT/plugin/markdown/markdown.js' },
{ src: 'https://ptteng.github.io/PPT/plugin/notes/notes.js', async: true },
{ src: 'https://ptteng.github.io/PPT/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
]
});
</script>
</body>
</html>