您的位置:首页 > 数据库 > MySQL

mysql 索引机制

2010-02-01 20:41 197 查看
Chapter 4. Indexes

索引有助于MySQL在浩如烟海的数据中迅速找到和取得正确的记录。

4.1 Indexing Basics

4.1.1 Index Concepts

索引是按照某种规则排序的。索引也就是牺牲一些空间和cpu的开销来使你的查询跑得更快点。另外提醒的是,对于MySQL来讲,术语“Key”和“Index”是可以互相替换的。

4.1.1.1 Partial indexes

索引是以空间换取性能。但有时候不想耗费太多的空间的话,MySQL有一系列控制索引空间的方法。例如你可以控制索引字节,采取部分索引的方法,当然这样性能会降低一些。

ALTER TABLE
phonebook ADD INDEX
(last
name(4))

4.1.1.2 Multicolumn indexes

使用多列索引的原因在于:MySQL will only ever use one index per table per query。

4.1.1.3 Index order

MySQL无需人工干预索引的排序,它会处理得很好。

4.1.1.4 Indexes as constraints

唯一索引(unique index)标明在给定的列里特值只能出现一次。唯一索引有两个作用:一个就是帮助查询迅速定位;二就是当插入或更新时,保证列里的值的唯一性。这就意味着,在这里,唯一索引起到了约束的作用。

ALTER TABLE
phonebook ADD UNIQUE
(phone
number)

4.1.1.5 Clustered and secondary indexes

聚集索引(clustered
index)将主键和记录直接挂钩,而且记录是根据主键来排序的。每一个表只能有一个聚集索引,这很好理解,因为记录只能用一种方法来排序。当你通过主键
来查询数据的时候,聚集索引非常快。因为它只要一次查询就可以得到结果,而标准的MyISAM的索引需要两次查询,先查到索引,然后通过索引得到的位置再
去查数据。

4.1.1.6 Unique indexes versus primary keys

主键其实就是一种不能包括数值NULL的唯一索引。主键对于MyISAM引擎不是必需的,但对于InnoDB 和BDB引擎来讲是必需的,如果你不声明,他们会隐含添加一个主键

4.1.1.7 Indexing NUL
Ls

4.2 Index Structures

这一节作者不会深究细节,他只想解决这几个问题:那种索引类型速度最快?那种灵活性最好?那种占用的空间最少?

4.2.1 B-Tree Indexes

B-Tree(balance tree)是目前最流行的索引类型,因为它在灵活性,空间占用和综合性能都比较优异。

B-Tree顾名思义就是树形结构,每个节点按照索引的数值来安排。因为是balance吗,所以在添加和去除节点后,B-Tree也不会失去平衡,它会自动调节。这种结构的好处就在于即使在最坏的情况下仍然可以得到比较好的性能。

4.2.2 Hash Indexes

哈希索引比较像一个哈希表,相对于树形结构来讲它显得比较“平”。它先将Key经过哈希函数处理,然后将处理过的哈希值除一个很大的质数(比
如:35149),再根据余数将key分别归到不同的容器里。它的缺点在于缺乏灵活性和可预见性。这很容易理解,因为即使两个非常相似的key经过哈希函
数处理以后,它们的值也大为不同。

4.2.3 R-Tree Indexes

R-Tree索引在MySQL4.1版本中才出现,它主要用于空间和多维数据。

4.3 Indexes and Table Types

这一节主要将各种索引在不同存储引擎下的实现和一些应当注意的优化。

4.3.1 MyISAM Tables

除了B-Tree带来的好处之外,MyISAM还提供了两个重要的功能:prefix compression 和packed keys。

4.3.1.1 Delayed key writes

MyISAM提供的一个提高性能的功能,它可以延迟将索引数据写到磁盘上的操作。这将在相当程度上提高在繁忙INSERT, UPDATE
,和DELETE活动下 Mysql的性能。它的缺点在于当MySQL崩溃时,索引数据不会同步,这样的话之后将要重建索引,这会多花一些时间。

4.3.2 Heap Tables

Heap Tables起初只支持哈希索引,现在4.1.0版本也支持B-Tree了。将B-Tree的灵活性和Heap Tables的速度结合起来,这样的性能无人能敌。

4.3.3 BDB
Tables

BDB
Tables只提供B-Tree索引。

4.3.4 InnoDB Tables

InnoDB Tables提供B-Tree索引。

4.3.5 Full-Text Indexes

全文索引是一个特殊类型的索引,它可以迅速定位一个字段中不同字的位置。MySQL在MyISAM中提供全文索引支持。全文索引基于表中的文本字段(例如:VARCHAR, TEXT
等等)。全文索引存于表的MYI文件中。

4.3.6 Index Limitations

索引不是万能的,让我们这节来看看他的弱点。

4.3.6.1 Wildcard matches

先看个例子:

select phonenumber from phone
book where last_name like “%son%”

这种通配符匹配,MySQL只能搜索每一列来得到答案,这时候索引也不会起到作用。

4.3.6.2 Regular expressions

正则表达式和通配符匹配遇到同样的问题。

4.3.6.3 Poor statistics or corruption

好像是废话,索引损坏了要及时修复的。

4.3.6.4 Too many matching rows

如果MySQL相信大约有30%的列匹配的话,他就不会用索引而去进行全表检索。当然也有例外,具体的可以去看第五章。

4.4 Index Maintenance

治大国若烹小鲜,同样,索引不需要特别的维护。

4.4.1 Obtaining Index Information

一些基本信息的获取

SHOW CREATE TABLE

SHOW INDEXES FROM

4.4.2 Refreshing Index Statistics

对于MyISAM来讲,OPTIMIZE TABLE
可以重建表的索引,并且是索引处于一个良好的状态。但是这种优化要花一些时间,此时表处于写锁定状态。对于BDB 和InnoDB来讲,他们不需要这些调整。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: