在数据库操作中,经常需要查找特定的数据,以一条“select * from zyftest where id=10000”为例,数据库必须从第一条记录来时遍历,直到找到id为10000的数据,这样的效率显然非常低。所以,MySQL允许建立索引来加快数据表的查询和排序。
一、索引的概念分析
索引的目的在于提高查询效率,与我们查阅图书所用的目录是一个道理:先定位到章,然后定位到该章下的一个小节,然后找到页数。相似的例子还有:查字典,查火车车次,飞机航班等。
本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。
数据库的索引是对数据库表中一列或多列的值进行排序后的一种结构,其作用就是提高表中数据的查询速度。MySQL中的索引可以大致分为以下几类:主键索引、唯一索引、普通索引、全文索引、组合索引、空间索引。
- 普通索引是由KEY或INDEX定义的索引,是MySQL的基本索引类型,其值是否唯一和非空由字段本身的约束条件所决定。
- 唯一索引是指由UNIQUE定义的索引,该索引所在字段的值必须是唯一的。
- 全文索引是由FULL TEXT定义的索引,只能创建在CHAR、VARCHAR或TEXT类型的字段上,而且,现在只有MyIASM存储引擎支持全文索引。
- 主键索引 PRIMARY KEY,它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。(注意:一个表只能有一个主键)
- 组合索引值得是在表中多个字段上创建索引,只有在查询中使用了这些字段中的第一个字段时,该索引才会被使用。
- 空间索引是由SPATIAL定义的索引,它只能创建在空间数据类型的字段上。MySQL中空间数据类型有四种:GEOMETRY、POINT、LINESTRING和POLYGON。注意创建空间索引的字段必须将其声明为NOT NULL,并且空间索引只能在存储引擎为MyISAM的表中创建。
索引的优缺点主要体现在:
- 优势:可以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序;
- 劣势:索引本身也是表,因此会占用存储空间,一般来说,索引表占用的空间的数据表的1.5倍;索引表的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表;
二、创建索引相关操作
创建索引的方式主要有以下三种方式
(一)创建表的时候创建索引
创建表的时候可以直接创建索引,方式简单、方便,基本语法格式如下:
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 '项目投票记录表'; 相关具体案例操作:
1.创建普通索引
create table zyf(
id int,
name varchar(20),
score float,
index(id)
); 可以使用show create table 语句查看表的结构。
为了查看索引是否被使用,可以使用explain 语句进行查看: explain select * from zyf where id=1 \G; (possible_key和key的值都为id就说明id索引已经存在并且已经开始使用)
三、删除索引相关操作
四、索引数据结构分析
五、聚集索引与辅助索引分析
六、联合索引与覆盖索引分析
七、正确使用索引相关分析
八、索引相关内容测试
参考资料:
1.传智播客教育科技股份有限公司-高教产品研发部,《MYSQL数据库入门》,清华大学出版社,2018.
2.https://www.jb51.net/article/140749.htm
3.https://blog.csdn.net/tongdanping/article/details/79878302
4.https://www.runoob.com/mysql/mysql-index.html
5.https://www.cnblogs.com/realshijing/p/8419732.html






还没有评论,来说两句吧...