第十六章: 利用索引改善性能
1、 create index
单字段索引: create index index_name on table_name (column_name);
唯一索引: create unique index index_name on table_name (column_name);// 当 某列所有元素中存在相同的值时,创建 unique idnex 会失败。
// 当基于某列创建unique_index 时,插入元素时该列的值和之前的值重复也会报错。
组合索引: 一个表中有两个或者多个字段的索引
create index index_name on table_name (column1,column2);
2、何时考虑设置索引
3、 drop index index_name on table_name ; // 删除索引
4、 alter index index_name ; //修改索引
5、 查看索引: 某个表中所有的索引,包括primary key
show index from table_name;
6、索引的类型:
普通索引、唯一索引和主索引
1. 普通索引 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column = …)或排序条件(ORDER BY column)中的数据列创建索引。只要有可能,就 应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。 2. 唯一索引 普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个”员工个人资料”数据表里可能出现两次或更多次。 如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简 化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效 率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在 某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上, 在许多场合,人们创建唯 一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。 3. 主索引 在前面已经反复多次强调过:必须为主键字段创建一个索引,这个索引就是所谓的”主索引”。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是 PRIMARY而不是UNIQUE。 4. 外键索引 如果为某个外键字段定义了一个外键约束条件,MySQL就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。 5. 复合索引 索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引。这种索引的特点是MySQL可以有选择地使用一个这样的索引。如果查询操作只需要用到columnA数据列上的一个索引,就可以使 用复合索引INDEX(columnA, columnB)。不过,这种用法仅适用于在复合索引中排列在前的数据列组合。比如说,INDEX(A, B, C)可以当做A或(A, B)的索引来使用,但不能当做B、C或(B, C)的索引来使用。 6. 索引的长度 在为CHAR和VARCHAR类型的数据列定义索引时,可以把索引的长度限制为一个给定的字符个数(这个数字必须小于这个字段所允许的最大字符个数)。这 么做的好处是可以生成一个尺寸比较小、检索速度却比较快的索引文件。在 绝大多数应用里,数据库中的字符串数据大都以各种各样的名字为主,把索引的长度设置 为10~15个字符已经足以把搜索范围缩小到很少的几条数据记录了。 在为BLOB和TEXT类型的数据列创建索引时,必须对索引的长度做出限制;MySQL所允许的最大索引长度是255个字符。第二十章: 创建和使用视图及异名
视图是一个虚拟表,它只保存在内存里,不占实际的存储空间,不保存数据,它只是从表里引用数据,它的使用方式和表是一样的.
- 视图的使用场景
-
- 简化数据访问有时候数据在表里的格式并不适合终端查询,这时可以创建一系列的视图.
- 作为一种安全策略视图可以限制用户只访问表里特定字段或满足一定条件的记录.
- 维护摘要数据如果摘要数据所基于的表经常更新,那么使用视图要比每次都写SQL来的方便
2、创建视图
MySQL的文档中对是这样定义的:CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
一个普通的视图创建语句是这样的:
CREATE VIEW V_CUSTOMERS AS SELECT * FROM V_CUSTOMERS;
-
- WITH CHECK OPTION这个用的不是很多.它像是一种约束.如果在创建视图的适合使用了这个选项,那么当向表中插入或者更新的记录不符合视图的条件时则操作失败.
- 删除视图跟删除表一样,使用
DROP
可以删除一个视图:DROP VIEW V_CUSTOMERS;
- 查看视图
show full tables; //
从视图创建视图:
create table table_name as select column1,colum2 from table_from_view;
3、视图和表的区别和联系
区别:1、视图是已经编译好的sql语句。而表不是 2、视图没有实际的物理记录。而表有。 3、表是内容,视图是窗口 4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改 5、表是内模式,视图是外模式 6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。 7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。 8、视图的建立和删除只影响视图本身,不影响对应的基本表。联系: 视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
4、 异名: 表或者视图的另一个名字,访问时可以不适用完整的名字。
创建异名: create [public | private ] synonym synonym_name for table_name|view_name ;
删除异名: drop synonym synonym_name;
应用: select synonym_name ; == select * from table_name ;
可以不添加所有者的名字就能访问这个表。