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 以及 CodingLabs 的MySQL索引背后的数据结构及算法原理 。R-tree 索引
这里不介绍。索引分类——按照索引列的数量
单列索引
单列索引对单个的列进行索引。多列索引
多列索引(即组合索引)对多个列同时进行索引。索引分裂——按照对索引列数据的要求
普通索引
最基本的索引,没有任何限制。唯一索引
索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。主键
它是一种特殊的唯一索引,不允许有空值。索引分类——按照索引的逻辑顺序与实际记录的物理顺序的关系
聚集索引
聚集索引保证关键字的值相近的元组存储的物理位置也相同。聚集索引的逻辑顺序与实际记录的物理顺序一致。非聚集索引
非聚集索引的逻辑顺序与实际记录的物理顺序不一致。数据库索引为什么使用 B-tree
请参考 CodingLabs 的MySQL索引背后的数据结构及算法原理 “为什么使用B-Tree(B+Tree)”一节。MyISAM 引擎与 InnoDB 引擎对 B-tree 的实现
MyISAM 引擎与 InnoDB 引擎对 B-tree 的实现的区别主要在于,MyISAM 中 B-tree 是非聚集索引,InnoDB 中 B-tree 是聚集索引。MyISAM 引擎 B-tree 索引的实现
请参考 CodingLabs 的MySQL索引背后的数据结构及算法原理 “MyISAM索引实现”一节。InnoDB 引擎 B-tree 索引的实现
请参考 CodingLabs 的MySQL索引背后的数据结构及算法原理 “CodingLabs 的MySQL索引背后的数据结构及算法原理 ”一节。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.htmlhttp://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中的integer 数据类型
- MySQL存储过程
- Android之获取手机上的图片和视频缩略图thumbnails
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- 数据库链接字符串查询网站
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法