@@ -13,7 +13,10 @@ include::_attributes.adoc[]
1313
1414让我们带着下面这个问题,去看接下来的内容:
1515
16+ ====
1617TIP: 如何在一堆数据中查找某个数据?简单点,比如找出100以内的某个数。
18+ ====
19+
1720
1821索引优化应该是对查询性能优化最有效的手段。可以轻松提高几个数量级。
1922
@@ -118,13 +121,17 @@ MySQL 在读取的时候,并不是每条每条读取,而是每次读取一
118121
119122接下来,我们了解一下算法相关的背景知识。
120123
121- [TIP]
124+
122125====
126+ [TIP]
127+ ======
123128我提到的问题:如何在一堆数据中查找某个数据?
124129
125130从这些硬件上来看,在内存中,甚至在一二三级高速缓存中,查找最快。当然,前提是,这些存储足够存得下。
131+ ======
126132====
127133
134+
128135==== 时间复杂度
129136
130137时间复杂度用来检验某个算法处理一定量的数据要花多长时间。
@@ -210,11 +217,13 @@ latexmath:[\frac{(10^7)^{2} 条指令}{10^{9} 条指令/秒} = 1.00 * 10^{5} 秒
210217* 最好的排序算法具有 O(n*log(n)) 复杂度
211218* 糟糕的排序算法具有 O(n^2^) 复杂度
212219
213- [TIP]
214220====
221+ [TIP]
222+ ======
215223我提到的问题:如何在一堆数据中查找某个数据?
216224
217225在条件允许的情况下,我们应该选择时间复杂度尽量小的算法。
226+ ======
218227====
219228
220229==== 归并排序
@@ -234,12 +243,13 @@ image::assets/images/binary_search_23.gif[title="二分查找-最好情况", alt
234243
235244image::assets/images/binary_search.gif[title="二分查找-最坏的情况", alt="二分查找", width="95%"]
236245
237-
238- [TIP]
239246====
247+ [TIP]
248+ ======
240249我提到的问题:如何在一堆数据中查找某个数据?
241250
242251二分查找需要讲数组全部加载到内存中。但是,如果数据量特别大,加载不完,怎么办呢?能否只加载一部分数据呢?
252+ ======
243253====
244254
245255
@@ -256,11 +266,13 @@ image::assets/images/big_search_tree.jpeg[title="搜索树", alt="搜索树", wi
256266我们来看一下最简单的树结构。
257267
258268
259- [TIP]
260269====
270+ [TIP]
271+ ======
261272我提到的问题:如何在一堆数据中查找某个数据?
262273
263274树能否保持有序呢?
275+ ======
264276====
265277
266278
@@ -284,12 +296,13 @@ http://www.cs.usfca.edu/~galles/visualization/BST.html[二叉查找树在线演
284296image::assets/images/skewedTree.png[title="最坏情况下的二叉查找树", alt="最坏情况下的二叉查找树", width="65%"]
285297
286298
287-
288- [TIP]
289299====
300+ [TIP]
301+ ======
290302我提到的问题:如何在一堆数据中查找某个数据?
291303
292304能否能避免这种极端情况出现呢?
305+ ======
293306====
294307
295308
@@ -328,11 +341,13 @@ image::assets/images/binaray_plus_tree.png[title="B+Tree 索引结构", alt="B+T
328341
329342WARNING: B+树种的 B 不是代表二叉(binary),而是代表平衡(balance),因为 B+树是从最早的平衡二叉树演化而来,但是 B+树不是一个二叉树。
330343
331- [TIP]
332344====
345+ [TIP]
346+ ======
333347我提到的问题:如何在一堆数据中查找某个数据?
334348
335349有没有更快的查找算法呢?
350+ ======
336351====
337352
338353
@@ -348,11 +363,13 @@ image::assets/images/hash_table.jpg[title="哈希表", alt="哈希表", width="9
348363
349364*真正的挑战是找到好的哈希函数,让哈希桶里包含非常少的元素。如果有了好的哈希函数,在哈希表里搜索的时间复杂度是 O(1)。*
350365
351- [TIP]
352366====
367+ [TIP]
368+ ======
353369我提到的问题:如何在一堆数据中查找某个数据?
354370
355371Hash查找有什么问题吗?
372+ ======
356373====
357374
358375
@@ -1082,7 +1099,9 @@ image::assets/images/InnoDB_random_insert.png[title="向聚簇索引插入无序
10821099
10831100索引覆盖查询还有很多陷阱可能会导致无法实现优化。 MySQL 查询优化器会在执行查询前判断是否有一个索引能进行覆盖。
10841101
1102+ ====
10851103WARNING: 这里思考一下,什么样的查询才是覆盖索引?需要满足什么条件?从 SQL 语句的组成来看。
1104+ ====
10861105
10871106从下面的查询来看:
10881107
0 commit comments