目录
一、索引
1.1、索引概述
MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据。
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引是数据库中用来提高查询性能的最常用的工具。
1.2、 索引优势劣势
优势
1) 类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本。
2) 通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。
劣势
1) 实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引列也是要占用空间的。
2) 虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。因为更新表时,MySQL 不仅要保存数据,还要维护索引。
1.3 、索引使用原则
1)在经常用作过滤器的字段上建立索引;
2)在SQL语句中经常进行group by、order by、distinct的字段上建立索引;
3)在不同值较少的字段上不必要建立索引,如性别字段;
4)对于经常存取的列避免建立索引;
5)用于联接的列(主健/外健)上建立索引;
6)对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。
总之,索引有利有弊,需要慎重选择
1.4、索引结构
索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的。所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型的。MySQL目前提供了以下4种索引:
-
BTREE索引 : 最常见的索引类型,大部分索引都支持 B 树索引。
-
HASH索引:只有Memory引擎支持 , 使用场景简单 。
-
R-tree索引(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少,不做特别介绍。
-
Full-text(全文索引) :全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从Mysql5.6版本开始支持全文索引。
MyISAM、InnoDB、Memory三种存储引擎对各种索引类型的支持
索引 | InnoDB引擎 | MyISAM引擎 | Memory引擎 |
---|---|---|---|
BTREE索引 | 支持 | 支持 | 支持 |
HASH 索引 | 不支持 | 不支持 | 支持 |
R-tree 索引 | 不支持 | 支持 | 不支持 |
Full-text | 5.6版本之后支持 | 支持 | 不支持 |
我们平常所说的索引,如果没有特别指明,都是指B+树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引、复合索引、前缀索引、唯一索引默认都是使用 B+tree 索引,统称为 索引。
1.5、索引分类
1)单值索引 :即一个索引只包含单个列,一个表可以有多个单列索引
2)唯一索引 :索引列的值必须唯一,但允许有空值
3)复合索引 :即一个索引包含多个列
1.6、索引语法
创建一张实例表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`no` int(0) NOT NULL AUTO_INCREMENT,
`name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`score` int(0) NULL DEFAULT NULL,
PRIMARY KEY (`no`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, 'jack', 60);
INSERT INTO `student` VALUES (2, 'mark', 70);
INSERT INTO `student` VALUES (3, 'jetty', 80);
INSERT INTO `student` VALUES (4, 'mary', 90);
SET FOREIGN_KEY_CHECKS = 1;
1、创建索引
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
ON tb_name(index_col_name,...)
UNIQUE:唯一索引,不允许字段重复
FULLTEXT:全文索引,适用于长文本
普通索引:使用范围较广
SPATIAL:空间索引,只能在存储引擎为MYISAM的表中创建
PRIMARY:主键索引,创建表确定好主键后就会自动生成,有且只能有一个
示例:
create UNIQUE index idx_no on student(no)
-- 可以使用create创建索引,也可以用alter
ALTER TABLE student ADD UNIQUE idx_no(no)
2、查看索引
show index from table_name;
示例:
show index from student
3、删除索引
DROP INDEX index_name ON tbl_name;
示例:
DROP INDEX idx_no ON student;
二、视图
2.1、视图概述
视图是一条select语句执行后返回的结果集、是一种虚拟存在的表。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。所以在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
视图相对于普通的表的优势主要包括以下几项。
简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
2.2、视图操作示例
1、创建视图
CREATE VIEW
view_name --视图名字
AS
SELECT ... --sql查询语句
示例:创建名为“view_student”的视图
CREATE VIEW view_student
AS
SELECT * from student
2、查看视图
从 MySQL 5.1 版本开始,不存在单独显示视图的 SHOW VIEWS 命令,而是使用 SHOW TABLES 命令同时显现表跟视图
3、查看视图定义
主要是查看视图定义的细节
show create view view_name
示例:
show create view view_student
4、删除视图
DROP VIEW [IF EXISTS] view_name
示例:
DROP VIEW IF EXISTS view_student
结语:如有错误,还请各位指正(抱拳)