如何在数据库中使用索引

上一篇 / 下一篇  2012-11-27 11:37:16 / 个人分类:数据库

 多数数据库,使用 B 树(Balance Tree)的结构来保存索引。51Testing软件测试网 g qW E(hv%qcL6^

  B 树,51Testing软件测试网 `z#R#n0i&J,qu

51Testing软件测试网u5A9Q"v0~c

  最上层节点:根节点51Testing软件测试网!AJSvmmog1q

wo3Y0LmP0  最下层节点:叶子节点

gShF6D7[J ZlQj0

'l8S0Kw;f(aR"O2^0  两者之间的节点:中间节点51Testing软件测试网%cDG9h&a4K

51Testing软件测试网tz l,C2Qq O

  B 树,显著特征:从根节点,到各个叶子节点的距离都是相等的。如此,检索任何值时,都经过相同数目的节点。

n Q:G\Zq;Kn!i6T0
CREATE INDEX idx_lname_pinyin ON employee(lname_pinyin);
W [&| h5D4y'}0Tg'R0SHOW INDEX FROM employee\G51Testing软件测试网A:YA H"n:n }
DROP INDEX idx_lname_pinyin ON employee;

@5P'A-i,C0E0  伴随主键的定义而创建的特别索引,被称为:丛生索引(Clustered Index)51Testing软件测试网S&T#L)p[}7S gO

51Testing软件测试网rl3t/bN-N(QIP @.{

  一个表,只有一个丛生索引。51Testing软件测试网"r$]b|(sBo'U

grA)ds}P+~mUw0  普通的索引,在叶子节点中保存的是指向实际表的指针。51Testing软件测试网|hdQ,|9jU8S

51Testing软件测试网%v@!^2R\?

  而,丛生索引,在叶子节点中保存的就是实际数据。

$~*O(crw5g)qU051Testing软件测试网q { Q yg~kE

  丛生索引,51Testing软件测试网M2?9[%E^5].SV

51Testing软件测试网!qs%L Hk6\Sfv

  不需要为保存索引,而使用专用的硬盘空间,节约资源51Testing软件测试网,^)r0z5v(N&}2q5dAd.P

51Testing软件测试网3W.\'M(K J K l/lT

  不需要检查索引后,再访问实际的表,提高了效率

[p W5n2T;Z6[ S^/y0

4a$v*DBIu0  创建丛生索引时,需要对表中数据进行排序,因此,在执行数据插入、更新、删除等操作时,比普通索引慢。

f#jq qL+a2v7}0

!Zg4_zd g|0  复合索引

|^u}%f]9rI0
51Testing软件测试网D H1B/a|.q,d/E!V

CREATE INDEX idx_pinyin ON employee( lname_pinyin, fname_pinyin);51Testing软件测试网 jr^g#o.V

51Testing软件测试网r'C4U~2m2U1`

SHOW INDEX FROM employee\G

4mH(z4].^ w&wH7q0
51Testing软件测试网yYnS7ChX8w&g0F

  唯一性索引

^1D~;L]0

[/m/GT9Lk8M"V0  使用 UNIQUE 关键字,来创建不可重复的索引,称为:唯一性索引。51Testing软件测试网1s)zA ? }EY#|e-[*MD

#C nV-O/O0l0  对特定列创建唯一性索引,相当于对该列追加了唯一性制约。

o9_i*OYQ)aAR051Testing软件测试网#VYX0gr,z

  创建唯一性索引的时候,如果对象列中,已经含有重复数据,则:创建失败,报错。51Testing软件测试网7Z J| lzm8g

UTN];Jn;zU0  创建成功后,如果,插入重复数据,则:插入失败,报错。

;CR,l8D2o8UH3_051Testing软件测试网4O ];@2kx

  指定多个列,来创建唯一性索引,只要,这些列的组合数据不重复,就可以创建成功。51Testing软件测试网!b,Ui2WY(_?.y }?

CREATE UNIQUE INDEX idx_fname ON employee(fname);51Testing软件测试网E[4M6iet,}0Kp
CREATE UNIQUE INDEX idx_lname ON employee(lname);
jt @2JN H;D/n0CREATE UNIQUE INDEX idx_fullname ON employee(lname, fname);
EXPLAIN SELECT * FROM employee WHERE lname_pinyin='wang'\G
CREATE INDEX idx_lname_pinyin ON employee(lname_pinyin);51Testing软件测试网8zKwi,z
EXPLAIN SELECT * FROM employee WHERE lname_pinyin='wang'\G
51Testing软件测试网dr$qz s{hW5M8zI

  EXPLAIN 命令的说明:P100 表格

CO9H1gmH)f2I051Testing软件测试网%}"k_vmn

  如果,创建索引后,遍历的次数与创建索引之前,变化不大。

Fo mE+j7@051Testing软件测试网'M2E2}j HE

  说明,创建索引时,选择的列名不合理,需要选择合适的列重建索引。这是分析索引优劣的方法。

.XyPF:G_k0

QD~?!jG%h.V0  追加了索引后,也不能保证在每次检索时都会使用列索引。

L3Yi!]#KM0

S|9R]6]-G0  如果,SQL 检索语句编写不当,就无法使用索引。

YTH p }+[0

T6b*U*Wk0q(o0  1、LIKE 运算符,进行模糊检索时,只能在前方一致的检索时,才能使用索引。

z^p*{ BA0

,yJ"iX9Tl/XwEQ'Q0  以下写法,索引不会被使用。51Testing软件测试网T!u4k/w-jS

51Testing软件测试网2I0Rt I3kX(D

51Testing软件测试网-Z6D+L.yrv4W

SELECT * FROM employee WHERE lname_pinyin LIKE '%w%';51Testing软件测试网!t Hud#Yj~W P
SELECT * FROM employee WHERE lname_pinyin LIKE '%w';

sb!BKZ%WG0  2、使用 IS NOT NULL、<> 的场合,也不会使用索引。如下:

.E`%JeZv0

.I%w+^y(`0

#vI-l*}:x G&v6x0
SELECT * FROM employee WHERE lname_pinyin IS NOT NULL;51Testing软件测试网g \x-G2R0iST7~-~
SELECT * FROM employee WHERE lname_pinyin <> 'wang';

y _h9`R%W/EG0  3、对列使用了运算或者函数的情况下,不会使用索引,如下:51Testing软件测试网+v^ A!P,^

51Testing软件测试网EFb"\ Ij;mv

9_ H)D$aE7B ^D0
SELECT * FROM employee WHERE YEAR(birth) = '1980'; -- 不使用索引51Testing软件测试网zhy h@y
SELECT * FROM employee WHERE birth >= '1980-01-01' AND birth <= '1980-12-31'; --使用了索引
51Testing软件测试网T p!Z\`tkc

  4、复合索引的第一列,没有包含在 WHERE 条件语句中,如下:51Testing软件测试网1a:KOty5^#RC

WY!r'q(Q"i-e4H051Testing软件测试网-u{]0`0R l4l;Etz&wt

/G9H$w&g3A:G1r0CREATE INDEX idx_pinyin ON employee(lname_pinyin, fname_pinyin);51Testing软件测试网8lr C"_ Uy,o$d
SELECT * FROM employee WHERE lname_pinyin = 'wang' AND fname_pinyin = 'xiao'; --用了索引
xIud;W0SELECT * FROM employee WHERE lname_pinyin = 'wang'; --用了索引

o1n5g6iM{R0

"Jl(PuVGpx#op*c0SELECT * FROM employee WHERE fname_pinyin = 'xiao'; -- 没有使用索引
%mbsod&iz0SELECT * FROM employee WHERE lname_pinyin = 'wang' OR fname_pinyin = 'xiao'; -- 没有使用索引
51Testing软件测试网CWH*HP

51Testing软件测试网"ar `D9hV1C)?6d

  实际开发过程中,需要积极使用 EXPLAIN 命令,来确认索引的使用情况,及时作相应修改。51Testing软件测试网VI+j;lc+c"]


TAG:

 

评分:0

我来说两句

Open Toolbar