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

mysql 索引探索

2015-10-16 22:26 525 查看

摘要

本文将从作用、引擎、分类、使用等方面来介绍 mysql 的索引。

索引的作用

索引的建立是为了提高数据的访问速度。生活中索引的例子有字典,字典的索引就是它的目录,通过拼音或者笔画我们可以在目录中找到这个字以及它的页码,进而可以查看这个字的具体解释说明。

mysql数据库引擎

数据库引擎是提供了对数据的增加、删除、修改、查询和存储的实现,并提供索引、事务、锁、外键等部分或全部的功能。

ISAM

ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到 数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不 支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。

MyISAM

MyISAM是MySQL的ISAM扩展格式。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。

MyISAM 支持全文索引、B+tree 索引、T-tree索引

InnoDB

InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL++ API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读,这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。

InnoDB 支持 B+tree 索引。

mysql 中命令 mysql> show engines; 显示的结果为:

+——————–+———+—————————————————————-+————–+——+————+

| Engine | Support | Comment | Transactions | XA | Savepoints |

+——————–+———+—————————————————————-+————–+——+————+

| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |

| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |

| MyISAM | YES | MyISAM storage engine | NO | NO | NO |

| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |

| CSV | YES | CSV storage engine | NO | NO | NO |

| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |

| ARCHIVE | YES | Archive storage engine | NO | NO | NO |

| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |

| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |

+——————–+———+—————————————————————-+————–+——+————+

索引分类——按照实现原理分类

全文索引

全文索引是MyISAM的一个特殊索引类型,主要用于全文检索。一般在 CHAR、VARCHAR 或 TEXT 列上创建。

哈希索引

通过哈希表来进行对数据的索引。MySQL中,只有Memory存储引擎显示支持hash索引。

B-tree 索引

通过 B-tree 来实现对数据的索引。数据库中一般都使用 B+tree 来进行数据索引。B-tree 相关内容请参考 百度百科 B-tree 以及 CodingLabsMySQL索引背后的数据结构及算法原理

R-tree 索引

这里不介绍。

索引分类——按照索引列的数量

单列索引

单列索引对单个的列进行索引。

多列索引

多列索引(即组合索引)对多个列同时进行索引。

索引分裂——按照对索引列数据的要求

普通索引

最基本的索引,没有任何限制。

唯一索引

索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

主键

它是一种特殊的唯一索引,不允许有空值。

索引分类——按照索引的逻辑顺序与实际记录的物理顺序的关系

聚集索引

聚集索引保证关键字的值相近的元组存储的物理位置也相同。聚集索引的逻辑顺序与实际记录的物理顺序一致。

非聚集索引

非聚集索引的逻辑顺序与实际记录的物理顺序不一致。

数据库索引为什么使用 B-tree

请参考 CodingLabsMySQL索引背后的数据结构及算法原理 “为什么使用B-Tree(B+Tree)”一节。

MyISAM 引擎与 InnoDB 引擎对 B-tree 的实现

MyISAM 引擎与 InnoDB 引擎对 B-tree 的实现的区别主要在于,MyISAM 中 B-tree 是非聚集索引,InnoDB 中 B-tree 是聚集索引。

MyISAM 引擎 B-tree 索引的实现

请参考 CodingLabsMySQL索引背后的数据结构及算法原理 “MyISAM索引实现”一节。

InnoDB 引擎 B-tree 索引的实现

请参考 CodingLabsMySQL索引背后的数据结构及算法原理CodingLabsMySQL索引背后的数据结构及算法原理 ”一节。

mysql 中如何增加、删除索引

普通索引、组合索引(组合索引)

增加

create table tableanme (fieldname1 columntype,fieldname2 columntype,index [indexname] (fieldname1 [,fieldname2...]));
create table tablename add index [indexname] (fieldname1 [fieldname2...]);
alter table slaes add index(value);


删除

DROP INDEX [indexName] ON mytable;


唯一索引

增加

create table ui_test (f1 int,f2 int,unique(f1));
alter table ui_test add unique(f2);


删除

DROP INDEX [indexName] ON mytable;


主键索引

增加

create table pk_test(f1 int not null,primary key(f1));
alter table customer modify id int not null, add primary key(id);


删除

alter table pk_test drop primary key;


全文索引

增加

create table ft2 (f1 varchar(255),fulltext(f1));


删除

DROP INDEX [indexName] ON mytable;


mysql 索引相关的命令介绍

explain sql语句:查看执行计划。

show profiles:查看历史执行语句执行统计。

show profile:查看单个历史执行语句执行详情。

show engines:查看 mysql 支持的引擎以及目前使用的引擎信息。

参考文献

http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html

http://blog.codinglabs.org/articles/theory-of-mysql-index.html

http://www.php100.com/html/webkaifa/database/Mysql/2010/0409/4279.html

http://blog.chinaunix.net/uid-20577907-id-3063379.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 数据库 索引