作者:blue暗紫天堂 | 来源:互联网 | 2014-05-12 08:59
本文重要讲述了如何加速动态网站的MySQL索引分析和优化。一、什么是索引?索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的情势保留。假如没有索引,履行查询
本文重要讲述了如何加速动态网站的MySQL索引分析和优化。
一、什么是索引?
索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的情势保留。假如没有索引,履行查询时MySQL必需从第一个记录开端扫描全部表的所有记录,直至找到符合请求的记录。表里面的记录数目越多,这个把持的代价就越高。假如作为搜索条件的列上已经创立了索引,MySQL无需扫描任何记录即可敏捷得到目标记录所在的地位。假如表有1000个记录,通过索引查找记录至少要比次序扫描记录快100倍。
假设我们创立了一个名为people的表:
CREATE TABLE people ( peopleid SMALLINT NOT NULL,
name CHAR(50) NOT NULL );
然后,我们完整随机把1000个不同name值插进到people表。在数据文件中name列没有任何明白的次序。假如我们创立了name列的索引,MySQL将在索引中排序name列,对于索引中的每一项,MySQL在内部为它保留一个数据文件中实际记录所在地位的“指针”。因此,假如我们要查找name即是“Mike”记录的peopleid(SQL命令为“SELECT peopleid FROM people WHERE name='Mike';”),MySQL能够在name的索引中查找“Mike”值,然后直接转到数据文件中相应的行,准确地返回该行的peopleid(999)。在这个过程中,MySQL只需处理一个行就可以返回成果。假如没有“name”列的索引,MySQL要扫描数据文件中的所有记录,即1000个记录!显然,需要MySQL处理的记录数目越少,则它完成任务的速度就越快。
二、索引的类型
MySQL供给多种索引类型供选择:
普通索引 :
这是最基础的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方法创立:
创立索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修正表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
创立表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );
唯一性索引:
这种索引和前面的“普通索引”基础雷同,但有一个差别:索引列的所有值都只能呈现一次,即必需唯一。唯一性索引可以用以下几种方法创立: