mysql的数据库索引---------第一章

来源:互联网 发布:弹弹play mac 编辑:程序博客网 时间:2024/06/05 08:11

一。什么是索引:

索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。


二。索引的重要性

索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录。如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要100s(但实际上要好很多很多)。如果对之建立B-Tree索引,则只需要进行log100(10^6)=3次页面读取,最坏情况下耗时30ms。这就是索引带来的效果,很多时候,当你的应用程序进行SQL查询速度很慢时,应该想想是否可以建索引。


三。索引的种类

这里举mysql为例

1.ALTER TABLE用来创建普通索引、UNIQUE索引、PRIMARY KEY索引、多列索引、全文索引。

ALTER TABLE 表名 ADD INDEX index_name (列名)
ALTER TABLE 表名 ADD UNIQUE (列名)
ALTER TABLE 表名 ADD PRIMARY KEY (列名)

2.CREATE INDEX可对表增加普通索引,UNIQUE索引,多列索引,全文索引。

 
CREATE INDEX index_name ON 表名 (列名)
CREATE UNIQUE INDEX index_name ON 表名 (列名)
 
不能用CREATE INDEX语句创建PRIMARY KEY索引。

3.可利用ALTER TABLE或DROP INDEX语句来删除索引

DROP INDEX index_name ON 表名
ALTER TABLE 表名 DROP INDEX index_name
ALTER TABLE 表名 DROP PRIMARY KEY

普通索引:alter table 表名 add index index_name(字段名);


主键索引:ALTER TABLE 表名 ADD PRIMARY KEY (字段名);



唯一索引 :ALTER TABLE 表名 ADD UNIQUE ( 字段名);



全文索引 : ALTER TABLE 表名 ADD   FULLTEXT ( 字段名);或create FULLTEXT index full_name on multi(mul_name);



多列索引:ALTER TABLE 表名 ADD INDEX index_name (字段1, 字段2, 字段3 );或create index feiyu on multi(mul_id,mul_name,mul_pwd);


(1)B-Tree索引

Btree是一种平衡的m-way查找树,它可以利用多个分支节点(子树节点)来减少查询数据时所经历的节点数,从而达到节省存取时间的目的。

(2)Hash索引

哈希索引包含以数组形式组织的 Bucket 集合。 哈希函数将索引键映射到哈希索引中对应的 Bucket。

(3)空间(R-Tree)索引

MyISAM支持空间索引,主要用于地理空间数据类型,例如GEOMETRY。

(4)全文(Full-text)索引

全文索引是MyISAM的一个特殊索引类型,主要用于全文检索