(一).什么是索引
Mysql官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构. 可以简单理解为'排好序的快速查找的数据结构"
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。
我们平常所说的索引,如果没有特别说吗,都是B树(多路搜索树,不一定是二叉树)结构的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然除了B+树这种类型的索引之外,还有哈希索引等。
(二).索引的优势
类似大学图书馆建书目索引,提高数据的检索效率,降低数据库的IO成本。
通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
(三).索引的劣势
实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间。
虽然索引大大提高了查询速度,同时却会降低更新表的速度,如insert ,update,delete.
因为更新表时,mysql不仅仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新带来的键值变化后的索引信息。(比如说一本书从1号楼换到了2号楼,那么指向这本书的索引信息也要修改)
(四).索引的分类
单值索引:即一个索引包含了单个列,一个表可以有多个单列索引。
唯一索引:索引列的值必须唯一,但允许有空值。
复合索引:即一个索引包含多个列
基本语法:
创建:
1. create [unique] index indexName on mytable(columname(length));
CREATE TABLE 表名( 属性名 数据类型[完整性约束条件], 属性名 数据类型[完整性约束条件], ...... 属性名 数据类型 [ UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY [ 别名] ( 属性名1 [(长度)] [ ASC | DESC] ) );
其中,UNIQUE是可选参数,表示索引为唯一性索引;FULLTEXT是可选参数,表示索引为全文索引;SPATIAL也是可选参数,表示索引为空间索引;INDEX和KEY参数用来指定字段为索引的,两者选择其中之一就可以了,作用是一样的;"别名"是可选参数,用来给创建的索引取的新名称;"属性1"参数指定索引对应的字段的名称,该字段必须为前面定义好的字段;"长度"是可选参数,其指索引的长度,必须是字符串类型才可以使用;"ASC"和"DESC"都是可选参数,"ASC"参数表示升序排列,"DESC"参数表示降序排列。
小例子
CREATE TABLE `hc_project_vote` ( `rcd_id` INT (11) NOT NULL AUTO_INCREMENT COMMENT 'id', `create_time` datetime COMMENT '创建时间', `update_time` datetime COMMENT '更新时间', `sn` VARCHAR (30) DEFAULT '' COMMENT 'sn', `project_sn` VARCHAR (30) DEFAULT '' COMMENT '项目sn', `user_sn` VARCHAR (30) DEFAULT '' COMMENT '投票者sn', `vote_time` datetime COMMENT '投票时间', `visit_ip` VARCHAR (15) DEFAULT '' COMMENT '投票者ip', PRIMARY KEY (`rcd_id`), KEY `idx_hc_vote_project_sn` (`project_sn`) USING BTREE, KEY `idx_hc_vote_user_sn` (`user_sn`) USING BTREE )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '项目投票记录表';
2. alter mytable add [unique] index [indexName] on (columname(length));
删除: drop index [indexName] on mytable;
查看: show index from mytable
检索原理
需要建立索引的情况
不需要建立索引的情况
Mysql常见瓶颈