一、什么是索引?
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快
要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。
1、普通索引
普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column = …)或排序条件(ORDER BY column)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。
1.1 直接创建索引(length表示使用名称前1ength个字符)
CREATE INDEX index_name ON table_name(column_name(length))
1.2 修改表结构的方式添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column_name)
1.3 创建表的时候同时创建索引
CREATE TABLE table_name (
id int(11) NOT NULL AUTO_INCREMENT ,
title char(255) NOT NULL ,
PRIMARY KEY (id),
INDEX index_name (title)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
1.4 删除索引
DROP INDEX index_name ON table_name;
1.5 建立复合索引 。
CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);
2、唯一索引
与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。
如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
2.1 创建唯一索引
CREATE UNIQUE INDEX index_name ON table_name(column_name)
2.2 修改表结构
ALTER TABLE table_name ADD UNIQUE index_name ON (column_name)
2.3 创建表的时候直接指定
CREATE TABLE table_name (
id int(11) NOT NULL AUTO_INCREMENT ,
title char(255) NOT NULL ,
PRIMARY KEY (id),
UNIQUE index_name (title)
);
3、主索引
必须为主键字段创建一个索引,这个索引就是所谓的”主索引”。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE。
二、什么视图?
视图是一种虚拟的表,是从数据库中一个或者多个表中导出来的表。数据库中只存放了视图的定义,而并没有存放视图中的数据,这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。
1、视图的作用:
(1)使操作简便化;
(2)增加数据的安全性;
(3)提高表的逻辑独立性;
2、创建视图
CREATE [ ALGORITHM ={ UNDEFIEND | MERGE | TEMPTABLE }]
VIEW 视图名[ ( 属性清单) ]
AS SELECT 语句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
2.1 在单表上创建视图
CREATE VIEW v1 AS SELECT * FROM t_book;
CREATE VIEW v2 AS SELECT bookName,price FROM t_book;
CREATE VIEW v3(b,p) AS SELECT bookName,price FROM t_book;
2.2 在多表上创建视图
CREATE VIEW v4 AS SELECT bookName,bookTypeName FROM t_book,t_booktype
WHERE t_book.bookTypeId=t_booktype.id;
CREATE VIEW v5 AS SELECT tb.bookName,tby.bookTypeName FROM t_book
tb,t_booktype tby WHERE tb.bookTypeId=tby.id;
3、查看视图
3.1 DESCRIBE 语句查看视图基本信息
DESC v5;
3.2 SHOW TABLE STATUS 语句查看视图基本信息
SHOW TABLE STATUS LIKE ‘v5‘;
3.3 SHOW CREATE VIEW 语句查看视图详细信息
SHOW TABLE STATUS LIKE ‘t_book‘;
3.4 在views 表中查看视图详细信息
SHOW CREATE VIEW v5;
4、修改视图
4.1 CREATE OR REPLACE VIEW 语句修改视图
CREATE OR REPLACE [ ALGORITHM ={ UNDEFINED | MERGE | TEMPTABLE }]
VIEW 视图名[( 属性清单)]
AS SELECT 语句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
例如:
CREATE OR REPLACE VIEW v1(bookName,price)
AS SELECT bookName,price
FROM t_book;
4.2 ALTER 语句修改视图
ALTER [ ALGORITHM ={ UNDEFINED | MERGE | TEMPTABLE }]
VIEW 视图名[( 属性清单)]
AS SELECT 语句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
例如:
ALTER VIEW v1 AS SELECT * FROM t_book;
5、更新视图
更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟的表,其中没有数据。通过视图更新时,都是转换基本表来更新。更新视图时,只能更新权限范围内的数据。超出了范围,就不能更新。
5.1 插入(INSERT)
INSERT INTO v1 VALUES(NULL,‘java good‘,120,‘feng‘,1);
5.2 更新(UPDATE)
UPDATE v1 SET bookName=‘java very good‘,price=200 WHERE id=5;
5.3 删除(DELETE)
DELETE FROM v1 WHERE id=5;
6、删除视图
删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据;
DROP VIEW [ IF EXISTS ] 视图名列表[ RESTRICT | CASCADE ]
DROP VIEW IF EXISTS v4;